0%

Pod的生命周期

kubelet 接受通过各种机制(主要是通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpec 中描述的容器处于良好的运行状态。

在本文中主要介绍在Kubernetes中容器的状态,Pod阶段以及两者之间的关系。

容器的状态

容器有3个状态: Waiting, Running and Terminated

State描述
Waiting该状态是容器的默认状态。如果容器的状态不是Running或者Terminated,那么一定就是Waiting状态。为了提供更多的信息,与该状态一起显示的还有出现该状态的原因以及相关信息。
Running如果容器的状态是Running,则说明容器正常运行且没有任何异常。一旦容器进入Running状态,如果存在postStart钩子(hook),则执行这个钩子。与该状态一起出现的还有容器进入该状态的时间。
Terminated当容器中的任务已经执行完成且容器已经停止运行。在容器退出前,如果存在preStop钩子,则先执行该钩子。与该状态一起出现的还有出现该状态的原因以及退出码。

Pod的阶段(phase)

Pod的阶段是Pod在其生命周期中所处位置的简单概括。

Pod阶段的含义以及数量是受到严格保护的。目前总共有5个阶段,如下所示。

Phase描述
挂起(Pending)Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
运行中(Running)该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建,且至少有一个容器正在运行或者正处于启动或重启状态。
成功(Succeeded)Pod 中的所有容器都被成功终止,并且不会再重启。
失败(Failed)Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知(Unknown)因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

容器的状态与Pod阶段之间的关系

下面通过一个例子来讲述容器和Pod以及Pod重启策略之间的关系。前两列是一个Pod中两个容器的状态,后面三列是Pod的restartPolicy为None,Always,OnFailure时的状态。

Container AContainer BNoneAlwaysOnFailure
WaitingWaitingPendingPendingPending
WaitingRunningPendingPendingPending
WaitingNon-zero terminatedPendingPendingPending
WaitingZero terminatedPendingPendingPending
RunningRunningRunningRunningRunning
RunningNon-zero terminatedRunningRunningRunning
RunningZero terminatedRunningRunningRunning
Non-zero terminatedNon-zero terminatedFailedRunningRunning
Non-zero terminatedZero terminatedFailedRunningRunning
Zero terminatedZero terminatedSucceededRunningSucceeded

这是我用来测试的manifest,如果有兴趣可以自己动手做一做。https://github.com/chengqing-su/kubernetes-learning/tree/master/pod-lifecycle