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