16.3.8 Pod探针与健康检查

Pod探针与健康检查#

Pod探针用于判断容器是否存活、是否可用以及启动是否完成,是保障服务高可用与自动恢复的关键机制。Kubernetes提供三类探针:
- livenessProbe(存活探针):检测容器是否处于健康运行状态,失败将触发容器重启。
- readinessProbe(就绪探针):判断容器是否可以接收流量,失败会将Pod从Service负载均衡中摘除。
- startupProbe(启动探针):判定容器是否已完成启动,在其成功前其他探针不会生效。

原理草图#

文章图片

探针实现方式与关键参数#

实现方式
1. HTTP GET:访问容器内指定端点,返回2xx/3xx为成功。
2. TCP Socket:检测端口是否可连接。
3. Exec:在容器内执行命令,返回0为成功。

关键参数
- initialDelaySeconds:首次执行前等待时间。
- periodSeconds:执行间隔。
- timeoutSeconds:单次探针超时时间。
- successThreshold:连续成功次数达到阈值才算成功。
- failureThreshold:连续失败次数达到阈值才算失败。

完整示例:HTTP + TCP + Exec 探针#

文件:/tmp/pod-probes.yaml

apiVersion: v1
kind: Pod
metadata:
  name: probe-demo
  labels:
    app: probe-demo
spec:
  containers:
  - name: web
    image: nginx:1.25
    ports:
    - containerPort: 80
    readinessProbe:
      httpGet:
        path: /healthz
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 5
      timeoutSeconds: 2
      failureThreshold: 3
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 2
      failureThreshold: 3
    startupProbe:
      exec:
        command: ["/bin/sh", "-c", "test -f /tmp/ready"]
      initialDelaySeconds: 1
      periodSeconds: 3
      failureThreshold: 10

应用与验证

# 1) 创建Pod
kubectl apply -f /tmp/pod-probes.yaml

# 2) 查看Pod状态与探针结果
kubectl get pod probe-demo -w

# 3) 查看详细事件,重点看探针失败原因
kubectl describe pod probe-demo

# 4) 进入容器,制造启动探针成功条件
kubectl exec -it probe-demo -- /bin/sh -c "touch /tmp/ready"

# 5) 验证readiness,Pod应进入READY
kubectl get pod probe-demo

命令解释
- kubectl apply -f:创建/更新资源。
- kubectl describe pod:查看探针失败事件与重启原因。
- kubectl exec:进入容器执行命令,模拟应用启动完成。

探针与Service联动示例#

文件:/tmp/svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: probe-svc
spec:
  selector:
    app: probe-demo
  ports:
  - port: 80
    targetPort: 80
kubectl apply -f /tmp/svc.yaml

# 查看Endpoints,readiness失败时应为空
kubectl get endpoints probe-svc

# 访问Service(若readiness不通过,连接将失败)
kubectl run curl -it --rm --image=curlimages/curl -- \
  curl -sS probe-svc.default.svc.cluster.local/healthz

常见问题与排错#

  1. 频繁重启
    - 排查:kubectl describe pod probe-demo
    - 关注:Liveness probe failedBack-off restarting failed container
    - 处理:增大failureThresholdtimeoutSeconds,确认应用启动/运行耗时与资源配额。

  2. 服务无法访问
    - 排查:kubectl get endpoints probe-svc
    - 关注:readiness失败导致Endpoints为空
    - 处理:修复健康检查路径/端口,或延长initialDelaySeconds

  3. 启动超时
    - 排查:kubectl describe pod probe-demoStartup probe failed
    - 处理:增加startupProbe.failureThreshold或调整初始化流程。

最佳实践要点#

  • livenessProbe不宜过于敏感,避免抖动导致重启风暴。
  • readinessProbe覆盖业务依赖关键条件,如连接数据库、缓存预热完成。
  • startupProbe适用于慢启动应用,避免被误判为失败。
  • 与滚动更新配合,可通过readiness实现流量平滑切换。

练习#

  1. 修改HTTP探针path为不存在的路径,观察readinessendpoints变化。
  2. livenessProbe.periodSeconds设为2,观察是否产生重启抖动。
  3. 为应用增加startupProbe并提高failureThreshold,验证慢启动场景下的稳定性。