Pod 的整个生命周期中被系统定义为各种状态,熟悉Pod的各种状态对于理解如何设置Pod 的调度策略,重启策略是很有必要的。

Pod 状态如下表:

状态值

描述

Pending

API Server 已经创建该Pod,但在Pod 内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程

Running

Pod 内所有容器均已创建,且至少有一个容器处于运行状态,正在启动状态或正在重启状态

Succeded

Pod 内所有容器均成功执行后退出,且不会再重启

Failed

Pod内所有容器均已退出,但至少有一个容器为退出失败状态

Unknown

由于某种原因无法获取该Pod 的状态,可能由于网络通信不畅导致

Pod 的重启策略应用于Pod 内的所有容器,并且仅在Pod 所处的Node上由kubelet 进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet 将根据RestartPolicy 的设置进行相应的操作。

Pod 的重启策略包括Always,OnFailure 和 Never , 默认值为Always。
(1)Always: 当容器失效时,由kubelet自动重启该容器。
(2)OnFailure: 当容器终止运行且退出码不为0 时,由kubelet 自动重启该容器。
(3)Never: 不论容器运行状态如何,kubelet 都不会重启该容器。

kubelet 重启失效容器的时间间隔以sync-frequency 乘以2n 来计算,例如 1,2,4,8倍等,最长延时5min,并且在成功重启后10min 后重置该时间。

Pod 的重启策略与控制方式息息相关,当前可用于管理Pod 的控制器包括ReplicationController ,Job,DaemonSet,还可以通过kubelet 管理(静态Pod)。

每种控制器对Pod 的重启策略要求如下:
(1)RC和DaemonSet : 必须设置为Always,需要保证该容器持续运行。
(2)Job : OnFailure 或 Never,确保容器执行完成后不再重启。
(3)kubelet : 在Pod 失效时自动重启它,不论将RestartPolicy 设置为什么值,也不会对Pod进行健康检查。

结合Pod 的状态和重启策略,下表列出一些常见状态转换场景。

序号

Pod包含的容器数

Pod当前的状态

发生事件

1

包含1个容器

Running

容器退出成功

2

包含1个容器

Running

容器退出失败

3

包含2个容器

Running

1个容器退出失败

4

包含2个容器

Running

容器被OOM“杀掉”

Pod的结果状态

序号

RestartPolicy=Always

RestartPolicy=OnFailure

RestartPolicy=Never

1

Running

Succeeded

Succeeded

2

Running

Running

Failed

3

Running

Running

Running

4

Running

Running

Failed