转:http://blog.csdn.net/horsefoot/article/details/52324830

(一)  核心概念

Pod是kubernetes中的核心概念,kubernetes对于Pod的管理也就是对Pod生命周期的管理,对Pod生命周期的管理也就是对Pod状态的管理,我们通过下面Pod相关的各个实体信息关系图可以分析出来kubernetes是如何管理Pod状态的。

Kubernetes1.3:POD生命周期管理-LMLPHP

(二)  结构体介绍

Pod这个结构体中有个变量Status,通过这个变量可以得到每个Pod的状态信息,这个Status变量对应的结构体是PodStatus,从图中可以看出来Pod状态信息同四个变量相关,分别是Phase、Conditions、InitContainerStatuses和ContainerStatuses,这四个变量分别表示Pod所在生命周期阶段、Pod生命周期需要满足的条件、Pod中所有初始化容器状态、Pod中所有应用容器状态。

变量Phase有五个可选的值,分别是Pending、Running、Succeeded、Failed和Unknown。

Kubernetes1.3:POD生命周期管理-LMLPHP

这个五个值的含义分别是:

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。

Kubernetes1.3:POD生命周期管理-LMLPHP

这三个值得含义分别是:

1)       Always:表示对容器一直执行重启策略。如果不设置RestartPolicy,那么Always是默认值。

2)       OnFailure:表示在容器失败的时候重启容器。

3)       Never:表示在对容器不执行重启策略。

变量Conditions对应结构体PodCondition,在这个结构体中有两个变量Type和Status。变量Type表示有效的条件类型,变量Status表示每种类型对应的状态。

变量Type有三个可选的值,分别是PodScheduled、Ready和Initialized。

Kubernetes1.3:POD生命周期管理-LMLPHP

这三个值的含义分别是:

1)       PodScheduled:表示Pod处在调度过程中。

2)       Ready:表示Pod已经能够提供服务了。

3)       Initialized:表示Pod中所有初始化容器都已经成功启动了。

变量Status表示每种Type对应的状态,有三个可选的值,分别是True、False和Unknown。

Kubernetes1.3:POD生命周期管理-LMLPHP

这三个值的含义分别是:

1)       True:表示Pod处于某种类型的有效条件中。

2)       False:表示Pod不在某种类型的有效条件中。

3)       Unknown:表示kubernetes无法判断Pod是否在某种类型的有效条件中。

变量InitContainerStatuses和ContainerStatuses对应结构体ContainerStatus,记录Pod中所有初始化容器状态和所有应用容器状态,结构体ContainerStatus表示一个容器的状态,在这个结构体中变量State表示容器当前状态,变量State对应结构体ContainerState。结构体ContainerState中包括三个变量Waiting、Running和Terminated,分别表示等待状态、运行状态和结束状态,结构体ContainerState中三个变量只能有一个处在生效状态,如果无法确定哪个剩下,那么会选择等待状态。

Kubernetes1.3:POD生命周期管理-LMLPHP

变量Terminated对应结构体ContainerStateTerminated,结构体ContainerStateTerminated中有一个变量ExitCode,通过这个变量来记录上面提到的容器退出代码,如果容器正常退出那么退出代码为0,否则为其他值。

(三)  设置Pod生命周期

设置Pod生命周期,也就是设置结构体PodStatus中变量Phase的值,下面的流程图展示了如何设置变量Phase的值。

Kubernetes1.3:POD生命周期管理-LMLPHP

在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状态。

05-28 20:38