Pod 通过三类探针检查容器的健康状态:
- LivenessProbe 探针:用于判断容器是否健康,告诉 Kubelet 一个容器什么时候处于不健康的状态。如果 LivenessProbe 探针探测到容器不健康,则 Kubelet 将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含 LivenessProbe 探针,那么 Kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 “Success”;
- ReadinessProbe:用于判断容器是否启动完成且准备接收请求。如果 ReadinessProbe 探针探测到失败,则 Pod 的状态将被修改。Endpoint Controller 将从 Service 的 Endpoint 中删除包含该容器所在 Pod 的 IP 地址的 Endpoint 条目。
- startProbe: 判断容器内的应用程序是否已启动。如果配置了启动探针,则在启动探针状态为Success之前,其他所有探针都处于无效状态,直到它成功后其它探针才起作用。如果启动探测失败,kubelet将terminat容器并进行重启。如容器没有配置启动探测,则默认状态为Success。
Kubelet 定期调用容器中的探针来诊断容器的健康状况, 包含如下三种实现方式:
- ExecAction:在容器内部执行一个命令,如果该命令的退出状态码为 0,则表明容器健康;
- TCPSocketAction:通过容器的 IP 地址和端口号执行 TCP 检查,如果端口能被访问,则表明容器健康;
- HTTPGetAction:通过容器的 IP 地址和端口号及路径调用 HTTP GET 方法,如果响应的状态码大于等于 200 且小于 400,则认为容器状态健康。
探针包含在 Pod 定义的 spec.containers.{某个容器} 中。
spec:
containers:
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
startProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
源码见 "k8s.io/api/core/v1"
注意事项:
1.实践中在使用exec做探针时遇到捕获异常但pod无法重启的情况,配置如下
startupProbe:
exec:
command:
- cat /midware/init.log
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 1
后经测试,command命令需要分行写,如下格式:
startupProbe:
exec:
command:
- cat
- /midware/init.log
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 1