一、Pod生命周期
Pod在整个生命周期过程中被系统定义为各种状态,具体如下
Pending:API Server已经创建该pod,但pod中有一个或多个容器镜像没有创建,包括正在下载镜像的过程
Running:Pod中所有容器均已创建,且至少有一个容器处于运行状态,正在启动或正在重启状态
Succeeded:Pod中所有容器均已成功退出,且不会再重启
Failed:Pod中所有容器均已退出,但至少有一个容器退出失败状态
Unknown:由于某种原因无法获取Pod状态,可能由于网络不通导致
二、重启策略
Pod的重启策略(RestartPolicy)应用于Pod中的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或健康检测失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。
Pod的重启策略包括Always、OnFailure和Never, 默认值是Always。
Always:当容器失效时,由kubelet自动重启该容器。
OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
Never:无论容器运行状态如何,kubelet都不会重启该容器。
kubelet重启策略与控制器息息相关,可用于管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通过kubelet管理(静态Pod)。每种控制器对Pod的重启策略如下:
RC和DaemonSet:必须设置Always,需确保容器持续运行。
Job:OnFailure或Never,确保容器执行完成后不再重启。
kubelet:在Pod失效时自动重启它,无论将RestartPolicy设置为什么值,也不会对Pod进行健康检查。
三、健康检查
对Pod的健康检查可以通过两类探针来检查:LivenessProbe和ReadinessProbe。
LivenessProbe探针:用于判断容器是否存活(Running状态)。如果LivenessProbe探针探测到容器不健康,kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回值永远是Success。
ReadinessProbe探针:用于判断容器是否启动完成(read状态),可以接受请求。如果ReadinessProbe探针检测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器的所在Pod的Endpoint。
kubelet定期从LivenessProbe探针来诊断容器的健康状况。LivenessProbe有以下三种实现方式。
(1)ExecAction:在容器内部执行一个命令,如果该命令返回码为0,则表明容器健康。
(2)TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果能建立起TCP连接,则表明容器健康。
(3)HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应状态码大于等于200且小于400,则认为容器状态健康。
对于每种探测方式,都需要设置initialDelaySeconds和timeoutSeconds两个参数,含义如下。
initialDelaySeconds:启动容器后进行首次健康检查的等待时间,单位为s。
timeoutSeconds:健康检查发送请求后等待响应的超时时间,单位为s。当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器。