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 A | Container B | None | Always | OnFailure | 
|---|---|---|---|---|
| Waiting | Waiting | Pending | Pending | Pending | 
| Waiting | Running | Pending | Pending | Pending | 
| Waiting | Non-zero terminated | Pending | Pending | Pending | 
| Waiting | Zero terminated | Pending | Pending | Pending | 
| Running | Running | Running | Running | Running | 
| Running | Non-zero terminated | Running | Running | Running | 
| Running | Zero terminated | Running | Running | Running | 
| Non-zero terminated | Non-zero terminated | Failed | Running | Running | 
| Non-zero terminated | Zero terminated | Failed | Running | Running | 
| Zero terminated | Zero terminated | Succeeded | Running | Succeeded | 
这是我用来测试的manifest,如果有兴趣可以自己动手做一做。https://github.com/chengqing-su/kubernetes-learning/tree/master/pod-lifecycle