K8S需要保证负载均衡(Service)后面的pod都可用,自动检测不正常的应用程序,异常实例自动剔除,并将请求重新路由到其他可用系统,并具备一定的自愈能力。以上需求是通过探针来实现的。
K8S中存在三种类型的探针:
liveness probe
:存活探针
readiness probe
:就绪探针
startup Probe
:启动探针
每类探针都支持三种探测方法:
exec
:自定义健康检查,是通用性最强的方法,在容器中执行指定的命令,如果执行成功,退出码为 0 则探测成功。
httpGet
:适用于web业务,通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码在200到400之间,则认为容器健康。
tcpSocket
:适用于TCP业务,通过容器的 IP 地址和端口号执行 TCP 检查,如果能够建立TCP连接,则表明容器健康。
这三种探针均具有以下参数:
initialDelaySeconds
:容器启动后多久开始进行第一次探测工作,默认是0秒。
periodSeconds
:执行探测的频率。默认是10秒,最小1秒。
timeoutSeconds
:探测超时时间。默认1秒,最小1秒。
successThreshold
:处于失败状态时,探测连续成功几次,被认为成功。默认是1,最小值是1。
failureThreshold
:处于成功状态时,探测连续失败几次可被认为失败。默认是3。最小值是1。
探针探测的结果有以下三者之一:
Success
:Container通过了检查。
Failure
:Container未通过检查。
Unknown
:暂未执行检查,因此不采取任何措施。
存活性探针,适用情况:有时进程在运行,但是应用程序可能已经挂掉了,导致K8S无法隔离有故障的pod,调用者可能会访问到有故障的pod。
如果探测结果为容器不健康(Failure),kubelet 会杀掉该容器,将根据 restartPolicy
来重启。如果未配置存活探针,则默认容器启动为通过(Success)状态。
示例
1 | kubectl explain pod.spec.containers.livenessProbe.exec # 以exec方式为例 |
1 | apiVersion: v1 |
就绪性探针,适用情况:应用程序暂时不可用(比如加载大量数据、等待外部连接时),这种情况下,暂时不要杀死应用程序,而是等待它恢复。
如果探测结果为容器不健康(Failure),kubelet 会将Pod的Endpoint从对应的Service的Endpoint列表中移除,从此不再将任何请求调度此Pod上。
直到下次通过使用Readiness探针探测成功,然后才将Pod的IP添加到Service的Endpoint列表中,允许服务将流量发送到此Pod中。
若未配置就绪探针,则默认状态容器启动后为Success
。
示例
1 | kubectl explain pod.spec.containers.readinessProbe.httpGet # 以httpGet方式为例 |
1 | apiVersion: v1 |
启动探针,判断容器内的应用程序是否已启动,主要针对于不能确定具体启动时间的应用。
如果探测结果为容器不健康(Failure),kubelet 将杀死容器,将根据 restartPolicy
来重启。如果未配置启动探针,则默认容器启动为通过(Success)状态。
需要注意的是,如果配置了 startupProbes
探测,则在 startupProbes
状态为 Success 之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。这么做的目的是,针对一些启动缓慢的业务,避免业务长时间启动而被前面的探针kill掉。
示例
1 | kubectl explain pod.spec.containers.startupProbe.tcpSocket # 以tcpSocket方式为例 |
1 | apiVersion: v1 |