转:http://blog.****.net/horsefoot/article/details/52324830
(一) 核心概念
Pod是kubernetes中的核心概念,kubernetes对于Pod的管理也就是对Pod生命周期的管理,对Pod生命周期的管理也就是对Pod状态的管理,我们通过下面Pod相关的各个实体信息关系图可以分析出来kubernetes是如何管理Pod状态的。
(二) 结构体介绍
Pod这个结构体中有个变量Status,通过这个变量可以得到每个Pod的状态信息,这个Status变量对应的结构体是PodStatus,从图中可以看出来Pod状态信息同四个变量相关,分别是Phase、Conditions、InitContainerStatuses和ContainerStatuses,这四个变量分别表示Pod所在生命周期阶段、Pod生命周期需要满足的条件、Pod中所有初始化容器状态、Pod中所有应用容器状态。
变量Phase有五个可选的值,分别是Pending、Running、Succeeded、Failed和Unknown。
这个五个值的含义分别是:
1) Pending:kubernetes已经开始创建Pod,但是Pod中的一个或多个容器还没有被启动。比如Pod正处在应该被分配到哪个节点上这个调度过程中,或者kubernetes还在从镜像仓库中下载Pod中容器镜像这个下载过程中。
2) Running:kubernetes已经将Pod分配到节点上,并且Pod中的所有容器都启动了。还包括Pod中至少有一个容器仍然在运行状态,或者正在重新启动状态。
3) Succeeded:Pod中的所有容器都处在终止状态,并且这些容器是自主正常退出到终止状态的,也就是退出代码为0,而且kubernetes也没有重启任何容器。
4) Failed:Pod中的所有容器都处在终止状态,并且至少有一个容器不是正常终止的,也就是退出代码不为0,或者是由于系统强行终止的。
5) Unknown:由于一些特殊情况无法获取Pod状态,比如由于网络原因无法同Pod所在的主机通讯。
变量Phase的取值还取决于结构体PodSpec中的RestartPolicy变量,这个RestartPolicy变量是用来设置Pod中容器重启策略的,包括三个可选值,分别是Always、OnFailure和Never。
这三个值得含义分别是:
1) Always:表示对容器一直执行重启策略。如果不设置RestartPolicy,那么Always是默认值。
2) OnFailure:表示在容器失败的时候重启容器。
3) Never:表示在对容器不执行重启策略。
变量Conditions对应结构体PodCondition,在这个结构体中有两个变量Type和Status。变量Type表示有效的条件类型,变量Status表示每种类型对应的状态。
变量Type有三个可选的值,分别是PodScheduled、Ready和Initialized。
这三个值的含义分别是:
1) PodScheduled:表示Pod处在调度过程中。
2) Ready:表示Pod已经能够提供服务了。
3) Initialized:表示Pod中所有初始化容器都已经成功启动了。
变量Status表示每种Type对应的状态,有三个可选的值,分别是True、False和Unknown。
这三个值的含义分别是:
1) True:表示Pod处于某种类型的有效条件中。
2) False:表示Pod不在某种类型的有效条件中。
3) Unknown:表示kubernetes无法判断Pod是否在某种类型的有效条件中。
变量InitContainerStatuses和ContainerStatuses对应结构体ContainerStatus,记录Pod中所有初始化容器状态和所有应用容器状态,结构体ContainerStatus表示一个容器的状态,在这个结构体中变量State表示容器当前状态,变量State对应结构体ContainerState。结构体ContainerState中包括三个变量Waiting、Running和Terminated,分别表示等待状态、运行状态和结束状态,结构体ContainerState中三个变量只能有一个处在生效状态,如果无法确定哪个剩下,那么会选择等待状态。
变量Terminated对应结构体ContainerStateTerminated,结构体ContainerStateTerminated中有一个变量ExitCode,通过这个变量来记录上面提到的容器退出代码,如果容器正常退出那么退出代码为0,否则为其他值。
(三) 设置Pod生命周期
设置Pod生命周期,也就是设置结构体PodStatus中变量Phase的值,下面的流程图展示了如何设置变量Phase的值。
在kubernetes1.3的POD中,有两类容器,一类是系统容器(POD Container),一类是用户容器(User Container),在用户容器中,现在又分成两类容器,一类是初始化容器(Init Container),一类是应用容器(App Container),设置Pod生命周期需要使用到用户容器。
首先检查Pod中所有初始化容器状态,接着检查Pod中所有应用容器状态,接着根据这两类容器状态和RestartPolicy来设置Pod生命周期。
如下为根据具体不同的条件设置Pod生命周期的例子:
1. 如果Pod中存在任何一个初始化容器,当这个初始化状态是Terminated,并且这个初始化容器非正常退出,也就是退出代码不为0,并且RestartPolicy是Never,那么Pod生命周期为Failed。
2. 如果Pod中存在任何一个初始化容器,当这个初始化容器状态是Waiting,并且这个初始化容器上一次终止状态不为空,也就是LastTerminationState不为空,并且这个初始化容器上一次是非正常退出,也就是退出代码不为0,并且RestartPolicy是Never,那么Pod生命周期为Failed。
3. 如果Pod中存在任何一个应用容器,当这个应用容器状态是Waiting,并且这个应用容器上一次终止状态为空,也就是LastTerminationState为空,那么Pod生命周期为Pending。也就是说当Pod中有应用容器没有开始运行的时候,Pod生命周期为Pending。
4. 如果Pod中所有应用容器都不存在Waiting状态,或者Pod中存在Waiting状态的应用容器,但是这些应用容器上一次终止状态不为空,如果满足上面两种情况之一,并且Pod中存在一个Running状态的应用容器,那么Pod生命周期为Running。也就是说当Pod中所有应用容器都出于正常启动状态,并且存在一个状态是Running的应用容器时,那么Pod生命周期为Running。
5. 如果Pod中不存在Running状态的应用容器,当满足这个条件时,如果Pod中存在Terminated状态的应用容器,或者Pod中存在Waiting状态的应用容器,并且这些应用容器的上一次终止状态不为空,这时候如果RestartPolicy是Always,那么Pod生命周期为Running,也就是说Pod中所有应用容器都存在重启状态,这时候如果RestartPolicy不是Always,那么如果所有应用容器都正常终止,那么Pod生命周期为Succeeded,这时候如果RestartPolicy为Never,那么如果有一个容器处在失败状态,Pod生命周期就是Failed,这时候如果RestartPolicy是OnFailure,那么如果有一个容器处在重启失败状态,Pod生命周期就是Running。
6. 如果都不满足上面条件,那么Pod生命周期默认处在Pending状态。