Pod健康检查和服务可用性检查

5次阅读

共计 2102 个字符,预计需要花费 6 分钟才能阅读完成。

概述

Kubernetes 对 Pod 的健康状态可以通过两类探针来检查,kubelet 定期执行这两类探针来诊断容器的健康状况。

  • LivenessProbe 探针:用于判断容器是否存活(Running 状态),如果 LivenessProbe 探针检测到容器不健康,则 kubelet 会杀掉该容器并且根据容器的重启策略执行相应处理。如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 Success。
  • ReadinessProbe 探针:用于判断容器服务是否可用(Ready 状态),达到 Ready 状态的 Pod 才可以接受请求。对于被 Service 管理的 Pod,Service 和 Pod Endpoint 的关联关系也将基于 Pod 是否能被 Ready 进行设置。如果运行过程中 Ready 状态变为 Flase,则系统将其自动从 Service 的后端 Endpoint 列表中隔离出去,后续再把恢复到 Ready 状态的 Pod 加回后端 Endpoint 列表。这样就能保证客户端在访问 Service 时不回被转发到服务不可用的 Pod 实例上。

实现方式

LivenessProbe 探针和 ReadinessProbe 探针都可以配置以下三种实现方式:

ExecAction

在容器内部执行一个命令,如果该命令的返回码为 0,则表明容器健康。

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 // 监控检查发送请求后等待响应的超时时间。当超时发生时,kubelet 会认为容器已经无法提供服务,将会重启该容器。

为了执行探测,kubelet cat /tmp/healthy在目标容器中执行命令,如果命令成功,则返回 0,并且 kubelet 认为该容器是活动的且健康的。

容器启动时,它将执行以下命令

/bin/sh -c "touchu /tmp/healthy;sleep 30;rm -rf /temp/healthy;sleep 600

在容器寿命的前 30s 内,有一个 /tmp/healthy 文件。因此在前 30s 内,该命令 cat /tmp/healthy将返回成功代码,30s 后,cat /tmp/healthy将返回失败代码。

TCPGetAction

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: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3 // 每三秒执行一个活动探测

为了执行探测,kubelet 将 HTTP GET 请求发送到在容器中运行并且正在侦听端口 8080 的服务器。如果服务器 /healthz 路径的处理程序返回成功代码,则 kubelet 会认为该容器处于活动状态且运行状态良好。

任何大于等于 200 且小于 400 的状态码均表示成功。

TCPSocketAction

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

TCP 检查的配置与 HTTP 检查非常相似。本示例同时使用了就绪和活跃度探针。容器启动 5 秒后,kubelet 将发送第一个就绪探测器。这将尝试连接到 goproxy 端口 8080 上的容器。如果探测成功,则 Pod 将标记为就绪。kubelet 将继续每 10 秒运行一次此检查。

除了就绪探针之外,此配置还包括活动探针。容器启动后,kubelet 将运行第一个活动探针 15 秒。就像就绪探针一样,这将尝试 goproxy 在端口 8080 上连接到 容器。如果活动探针失败,则将重新启动容器。

正文完
 0