对pod的健康检查可以通过两类探针来检查: LivenessProbe 和 ReadinessProbe
LivenessProbe探针:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。
如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是"Success"。
ReadinessProbe: 用于判断容器是否启动完成(ready状态),可以接收请求。如果ReadinessProbe探针检测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的
Endpoint中删除包含该内容所在pod的Endpoint
kubelet定期执行LivenessProbe探针来诊断容器IDE健康状况。LivenessProbe有三种实现方式:
1、ExecAction: 在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康。
如: 通过执行 “cat /tmp/health”判断容器运行是否正常。而pod创建后,在创建/tmp/health文件的10秒后删除该文件,健康检查的初始探测时间(initialDelaySeconds)15秒,
探测结果为fail,导致kubelet杀掉该容器并重启。
[root@salt php-redis]# cat test.yaml apiVersion: v1 kind: pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: gcr.io/google_containers/busybox args: - /bin/sh - -c - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600 livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 15 timeoutSeconds: 1
2、TCPSocketAction: 通过容器的IP地址和端口号执行TCP检查,如果能够建立TCP链接,则表明容器健康
如:通过与容器的localhost:80 建立TCP连接进行健康检查。
[root@salt php-redis]# cat test-TCP.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-healthcheck spec: containers: - name: naginx image: nginx ports: - containerPort: 80 livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 30 timeoutSeconds: 1
3、HTTPGetAction: 通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器状态健康。
如: kubelet定时发送HTTP请求到localhost:80/_status/healthz来进行容器应用的健康检查。
[root@salt php-redis]# cat test-http.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-healthcheck spec: containers: - name: nginx image: nginx ports: - containerPort: 80 livenessProbe: httpGet: path: /_status/healthz port: 80 initialDelaySeconds: 30 timeoutSconds: 1
对于每种探测方式,都需要设置initialDelaySeconds和timeoutSeconds两个参数,他们的含义分别为:
initialDelaySeconds: 启动容器后进行首次健康检查的等待时间,单位为秒
timeoutSeconds: 健康检查发送请求后等待响应的超时时间,单位为秒。当超时发生时,kubelet会认为容器已经无法提供服务,会重启该容器。