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
常见问题与排错#
-
频繁重启
- 排查:kubectl describe pod probe-demo
- 关注:Liveness probe failed、Back-off restarting failed container
- 处理:增大failureThreshold或timeoutSeconds,确认应用启动/运行耗时与资源配额。 -
服务无法访问
- 排查:kubectl get endpoints probe-svc
- 关注:readiness失败导致Endpoints为空
- 处理:修复健康检查路径/端口,或延长initialDelaySeconds。 -
启动超时
- 排查:kubectl describe pod probe-demo中Startup probe failed
- 处理:增加startupProbe.failureThreshold或调整初始化流程。
最佳实践要点#
- livenessProbe不宜过于敏感,避免抖动导致重启风暴。
- readinessProbe覆盖业务依赖关键条件,如连接数据库、缓存预热完成。
- startupProbe适用于慢启动应用,避免被误判为失败。
- 与滚动更新配合,可通过readiness实现流量平滑切换。
练习#
- 修改HTTP探针
path为不存在的路径,观察readiness与endpoints变化。 - 将
livenessProbe.periodSeconds设为2,观察是否产生重启抖动。 - 为应用增加
startupProbe并提高failureThreshold,验证慢启动场景下的稳定性。