创建 Kubernetes 存活和就绪探针

使用这些自愈探针保持您的 Kubernetes 容器平稳运行。
240 位读者喜欢这个。
How Kubernetes is helping Docker blossom

马士基航运。CC SA-BY 4.0

使用 Kubernetes 的主要优势之一是它能够维护在集群中运行的容器:只需创建一个 Pod 资源,让 Kubernetes 为其选择一个工作节点,它就会在该节点上运行 Pod 的容器。但是,如果容器或 Pod 失败了怎么办?

一旦 Pod 被调度到一个节点,该节点上的 kubelet 将运行其容器,并在 Pod 存在期间保持它们运行。如果容器的主进程崩溃,kubelet 将重新启动容器。但是,如果容器中的应用程序存在缺陷,导致每次都重新启动,Kubernetes 可以对其进行修复。

kubelet 使用存活探针来了解何时重新启动容器。例如,存活探针可以修复应用程序正在运行但无法取得进展的情况。在这种情况重新启动容器可以帮助使应用程序在存在错误的情况下仍然可用。

kubelet 使用就绪探针来了解容器何时准备好开始接受流量。当 Pod 的所有容器都准备就绪时,该 Pod 被认为是就绪的。此信号的一个用途是控制哪些 Pod 用作服务的后端。当 Pod 未就绪时,它将从服务负载均衡器中移除。

Kubernetes 存活探针

Kubernetes 可以通过三种方式探测容器

  1. HTTP GET 探针在容器的 IP 上执行 HTTP GET 请求。

  2. TCP 套接字探针尝试打开与指定容器的 TCP 连接。

  3. Exec 探针在容器内运行命令。

HTTP Get 存活探针

以下 YAML 清单创建一个包含 HTTP GET 存活探针的 Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

Pod 描述符定义了一个 httpGet 存活探针,它告诉 Kubernetes 定期对路径 /healthz 上的端口 8080 执行 HTTP Get 请求,以确定容器是否仍然健康。

periodSeconds 字段指定 kubelet 应每 3 秒执行一次存活探针。initialDelaySeconds 字段告诉 kubelet 在执行第一次探针之前等待 3 秒。

TCP 套接字存活探针

以下 YAML 清单创建一个包含 TCP 套接字存活探针的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

Exec 存活探针

以下 YAML 清单创建一个包含 Exec 存活探针的 Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

Kubernetes 就绪探针

有时应用程序会暂时无法服务流量——例如,如果应用程序需要在启动期间加载大型数据或配置文件。在这种情况下,您不想杀死应用程序,但也不想向其发送请求。Kubernetes 提供了就绪探针来检测和缓解这些情况。

就绪探针的配置方式与存活探针类似。唯一的区别是您使用 readinessProbe 字段而不是 livenessProbe 字段。

HTTP Get 就绪探针

以下 YAML 清单创建一个包含 HTTP Get 就绪探针的 Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    test:  readiness
  name: readiness-http
spec:
  containers:
  - name:  readiness
    image: k8s.gcr.io/liveness
    args:
    - /server
    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

TCP 套接字就绪探针

以下 YAML 清单创建一个包含 TCP 套接字就绪探针的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

Exec 就绪探针

以下 YAML 清单创建一个包含 Exec 就绪探针的 Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: readiness
  name: readiness-exec
spec:
  containers:
  - name: readiness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

Kubernetes 通过在容器崩溃或其存活探针失败时重新启动它们来保持容器运行。这项工作由托管 Pod 的节点上的 kubelet 执行。

如果节点本身崩溃,控制平面必须替换在该节点上运行的所有 Pod。在这种情况下,您可以使用复制机制在集群内的另一个节点上重新创建 Pod。我将在我的下一篇文章中介绍这个主题。

标签
User profile image.
让伟大的想法顺利涌现。我是 RHCA,热爱开源,热爱以下方面的工作:Openstack OpenShift/Kubernetes Keycloak SSO, freeipa Ansible Ceph GlusterFs 和许多开源项目。我的个人网站

1 条评论

重要的是要记住,存活和就绪探针应该测试您的应用程序。指向一个什么都不做的静态路由/页面是相对没有意义的。最好确保您的路由实际连接到数据库,并确保不仅容器是存活的并接受流量 - 而且它真正地存活并准备好工作。应用程序中依赖于环境变量或秘密的区域应在您的探针中被命中,以确保容器已正确配置并准备就绪。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.