kubernetes liveness probe 流程

1 概述

kubernetes提供了的Probe可以进行健康检查。
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
对pod中的每个容器通过配置liveness或者readiness。
当liveness probe failed后,该container会杀掉,并重新创建;而readinessProbe失败,则该pod ip 会从service的endpoints列表中删除,即隔离到该后端的请求。
如liveness 配置如下:

文中尝试端到端的看下整个过程有哪些组件参与进来,怎么配合工作的。

2 配置

pkg/api/types.go#Probe结构描述了Probe的一个定义。其中Handler是执行的动作,initialDelaySeconds表示容器启动后延迟多少秒初始化probe,考虑一般应用启动需要一定时间。periodSeconds 表示周期检查的间隔,默认10秒,最小1秒。timeoutSeconds会告诉健康检查等待多长时间,默认1秒,最小1秒。successThreshold表示连续探测多少次成功才算成功。failureThreshold表示连续探测多少次失败才算失败。默认是3.

探测动作Handler支持httpget tcd 和exec三种动作。

httpGet对应一个http请求,主要是配置http端口和path;TCPSocket对应一个TCP请求,主要是配置一个TCP端口,EXEC表示执行一个命令。各个handler详细的定义不看了。

3. Probe 探测执行

下面看下probe的探测是怎么被执行的,探测结果又是如何处理的。

在kubelet启动的时候根据配置定期执行配置的Probe,写状态。

pkg/kubelet/kubelet.go# NewMainKubelet

kubelete创建时会创建一个prober_manager. 负责pod 的probe。主要工作是:对每个容器创建一个worker,worker周期的执行探测并保存探测结果。

pkg/kubelet/prober/prober_manager.go

kubelet的addpod的操作HandlePodAdditions会触发prober_manager的AddPod,对pod中每个容器检查是否配置了readiness或者liveness的probe,并创建启动对应的worker。

kubelete创建时会创建一个prober_manager. 负责pod 的probe。主要工作是:对每个容器创建一个worker,worker周期的执行探测并保存探测结果。

pkg/kubelet/prober/prober_manager.go

 

根据probe中配置的PeriodSeconds周期执行probe动作。

pkg/kubelet/prober/worker.go # doProbe

执行prober中的探测动作,并将探测结果保持到resultsManager中。

忽略细节,调用过程是; pkg/kubelet/prober/prober.go#probe –> pkg/kubelet/prober/prober.go#runProbeWithRetries –> pkg/kubelet/prober/prober.go#runProbe

根据配置的是HTTPGET、Exec还是TCPSocket执行不同的探测。

分别对应pkg/probe/http/http.go,pkg/probe/tcp/tcp.go,pkg/probe/exec/exec.go 三种探测方式。各种方式也就是检查执行结果是否有错。

Tcp探测看连接后是否error

http探测看StatusCode

exec探测看执行返回码

至此探测流程很简单的看完了,关注下探测的结果的保存。

在prober_manager中,根据不同的探测类型,构造不同的worker,结果会保存到对应的prober_manager的readinessManager或者livenessManger中。

 4 根据状态 action

pkg/kubelet/kubelet.go#NewMainKubelet

kubelet启动时候会构造podWorker

syncPod是kubelet一个比较核心的方法,做了包括更新为static pod创建mirrorpod,为pod创建数据目录等操作,还有就是调用容器runtime的SyncPod的回调。

pkg/kubelet/container/runtime.go

定义了对pod的各种操作。是容器运行时需要实现的接口。

两种实现pkg/kubelet/dockertools/docker_manager.go 中的DockerManager 和

pkg/kubelet/rkt/rkt.go中Runtime

如pkg/kubelet/dockertools/docker_manager.go # SyncPod

pkg/kubelet/dockertools/docker_manager.go# computePodContainerChanges

从livenessmanger获取对应container的状态,状态不是Success的都会被kill掉,在这里就是不在containersToKeep和initContainersToKeep的 container都会被杀掉

pkg/kubelet/rkt/rkt.go 中的Runtime的处理也是类似,从livenessmanager中获取状态,并执行杀pod的动作。

5 总结

对于文章前probe的处理过程,加上执行的主体,整个过程应该描述如下:

Kubelet 在延迟initialDelaySeconds后以periodSeconds为周期,执行定义的探测(包括httpGet,TcpSocket或者exec),并保存探测结果。对于liveness,kubelet会读取该探测结果,杀掉对应容器。

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: kubernetes liveness probe 流程


, ,

No comments yet.

发表评论