一、健康检查:又称为探针(Probe )
- 探针是由kubelet对容器执行的定期诊断。
1、探针的三种规则:
livenessProbe :
- 判断容器是否正在运行。如果探测失败,则kubelet会杀死容器,并且容器将根据restartPolicy 来设置Pod状态。如果容器不提供存活探针,则默认状态为Success。
readinessProbe :
- 判断容器是否准备好接受请求。如果探测失败,端点控制器将从与Pod 匹配的所有service endpoints中剔除删除该Pod的IP地址。初始延迟之前的就绪状态默认为Failure。如果容器不提供就绪探针,则默讣状态为Success。
startupProbe (这个1.17版本增加的):
- 判断容器内的应用程序是否已启动,主要针对于不能确定具体启动时间的应用。如果配置了startupProbe探测,在则在startupProbe 状态为Success 之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。
- 如果startupProbe 失败,kubelet 将杀死容器,容器将根据restartPolicy 来重启。
- 如果容器没有配置startupProbe,则默认状态为Success。
#注:以上规则可以同时定义。在readinessProbe 检测成功之前,Pod的running状态 是不会变成ready状态的。
2、Probe支持三种检查方法:
exec:
- 在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。
tcpSocket:
- 对指定端口上的容器的IP地址进行TCP检查(三次握手)。如果端口打开,则诊断被认为是成功的。
httpGet:
- 对指定的端口和路径.上.的容器的IP地址执行HTTPGet请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的
3、每次探测都将获得以下三种结果之一
- 成功:容器通过了诊断。
- 失败:容器未通过诊断。
- 未知:诊断失败,因此不会采取任何行动
二、示例
//示例1: exec方式
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
failureThreshold: 1
initialDe laySeconds: 5
per iodSeconds: 5
#initialDelaySeconds:指定kubelet在执行第一次探测前应该等待5秒,即第一次探测是在容器启动后的第6秒才开始执行。默认是0秒,最小值是0
#periodSeconds:指定了kubelet 应该每5秒执行一次存活探测。默认是10秒。最小值是1。
#failureThreshold:当探测失败时,Kubernetes 将在放弃之前重试的次数。
存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃Pod会被打上未就绪的标签。默认值是3。最小值是1。
#timeoutSeconds:探测的超时后等待多少秒。默认值是1秒。最小值是1。(在 Kubernetes 1.20 版本之前,exec探针会忽略timeoutSeconds探针会无限期地持续运行,甚至可能超过所配置的限期,直到返回结果为止。)
可以看到Pod 中只有一个容器。kubelet 在执行第一次探测前需要等待 5秒,kubelet 会每5秒执行一-次存活探测。kubelet
在容器内执行命令cat /tmp/healthy来进行探测。如果命令执行成功并且返回值为0,kubelet 就会认为这个容器是健康存活的。
当到达第31秒时,这个命令返回非0值,kubelet会杀死这个容器并重新启动它。