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 |