健康检查
Kubernetes 作为一个面向应用的集群管理工具,需要确保容器在部署后确实处在正常的运行状态。
容器探测用于检测容器中的应用实例是否正常工作,是保障业务可用性的一种传统机制。如果经过探测,实例的状态不符合预期,那么kubernetes就会把该问题实例“摘除”,不承担业务流量。
Kubernetes 提供了两种探针(Probe,支持 exec、tcpSocket 和 http 方式) 来探测容器的状态:
Pod 通过两类探针检查容器的健康状态:
-
LivenessProbe 探针
存活性探针,用于判断容器是否健康,告诉 Kubelet 一个容器什么时候 处于不健康的状态。
如果 LivenessProbe 探针探测到容器不健康,则 Kubelet 将删 除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含 LivenessProbe 探针,那么 Kubelet 认为该容器的 LivenessProbe 探针返回的值永 远是 “Success”。Kubelet 定期调用容器中的 LivenessProbe 探针来诊断容器的健康状况。
-
ReadinessProbe 探针
就绪性探针,用于判断容器是否启动完成且准备接收请求。
如果 ReadinessProbe 探针探测到失败,则 Pod 的状态将被修改(连续探测3次之后Ready状态不可用,STATUS状态变为Complete)。Endpoint Controller 将从 Service 的 Endpoint 中删除包含该容器所在 Pod 的 IP 地址的 Endpoint 条目。
livenessProbe 决定是否重启容器,readinessProbe 决定是否将请求转发给容器
探针是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。探针的三种类型处理方式:
- Exec:在容器内部执行一个命令,如果该命令的退出状态码为 0,则表明容器健康;
……
livenessProbe: # 两种探针写法一致
exec:
command:
- cat
- /tmp/healthy
……
- tcpSocket:通过容器的 IP 地址和端口号执行 TCP 检查,如果端口能被访 问,则表明容器健康;
……
livenessProbe: # 两种探针写法一致
tcpSocket:
port: 8080
……
- httpGet:通过容器的 IP 地址和端口号及路径调用 HTTP GET 方法,如果 响应的状态码大于等于 200 且小于 400,则认为容器状态健康。
……
livenessProbe: # 两种探针写法一致
httpGet:
path: / # URI地址
port: 80 # 端口号
host: 127.0.0.1 # 主机地址
scheme: HTTP # 支持的协议 HTTP或HTTPS
……
LivenessProbe 和 ReadinessProbe 探针包含在 Pod 定义的 spec.containers.{某个容器} 中。这两个探针除了上述三种方式的子属性,还有同样的子属性:
[root@k8s-master ~]# kubectl explain pod.spec.containers.livenessProbe/readinessProbe
KIND: Pod
VERSION: v1
RESOURCE: livenessProbe <Object> / readinessProbe <Object>
FIELDS:
exec <Object>
httpGet <Object>
tcpSocket <Object>
initialDelaySeconds <integer> # 容器启动后等待多少秒执行第一次探测
timeoutSeconds <integer> # 探测超时时间。默认1秒,最小1秒
periodSeconds <integer> # 执行探测的频率。默认是10秒,最小