Pod 生命周期和重启策略
Pod 的生命周期
Pod 在运行时会有不同的状态,Pod 的状态信息保存在 PodStatus 对象中,在 PodStatus 中有一个 Phase 字段,用于描述 Pod 在其生命周期中的不同状态。
可以使用 Kubernetes 的客户端工具 Kubectl 查看某个 Pod 的 Phase 字段,比如查看 kube-system 命名空间下的 metrics-server 的状态:
Pod 的 Phase 字段只有 Pending、Running、Succeeded、Failed、Unknown 5 种状态。
取值 | 描述 |
---|---|
Pending(挂起) |
|
Running(运行中) |
|
Succeeded(成功) |
|
Failed(失败) |
|
Unknown(未知) |
|
Pod 重启策略
Pod 的重启策略(RestartPolicy)应用于 Pod 内的所有容器,并且仅在 Pod 所处的 Node 上由 kubelet 进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet 将根据 RestartPolicy 的设置来进行相应的操作。
Pod 的重启策略包括 Always、OnFailure 和 Never,默认值为 Always。
Always:当容器失效时,由 kubelet 自动重启该容器。
OnFailure:当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器。
Never:不论容器运行状态如何,kubelet 都不会重启该容器。
Pod 的重启策略与控制方式息息相关,当前可用于管理 Pod 的控制器包括 ReplicationController、Job、DaemonSet 及直接通过 kubelet 管理(静态 Pod)。每种控制器对 Pod 的重启策略要求如下:
RC 和 DaemonSet:必须设置为 Always,需要保证该容器持续运行。
Job:OnFailure 或 Never,确保容器执行完成后不再重启。
kubelet:在 Pod 失效时自动重启它,不论将 RestartPolicy 设置为什么值,也不会对 Pod 进行健康检查。
字段 Phase 其他取值
取值 | 说明 |
---|---|
ImagePullBackOff ErrImagePull | 镜像拉取失败,一般是由于镜像不存在、网络不通或者需要登录认证引起的 可以使用 describe 命令查看具体原因 |
CrashLoopBackOff | 容器启动失败,可以通过 logs 命令查看具体的原因,一般为启动命令不正确、健康检查不通过等 |
OOMKilled | 容器内存溢出,一般是容器的内存 Limit 设置得过小,或者程序本身有内存溢出 可以通过 logs 查看程序的启动日志 |
Terminating | Pod 正在被删除,可以通过 describe 查看状态 |
SysctlForbidden | Pod 自定义了内核配置,但 kubelet 没有添加内核配置或配置的内核参数不支持 可以通过 describe 查看具体原因 |
Completed | 容器内部主进程退出,一般计划任务执行结束会显示该状态 此时可以 通过 logs 查看容器日志 |
ContainerCreating | Pod 正在创建,一般为正在下载镜像,或者有配置不当的地方 可以通过 describe 查看具体原因 |
最后更新于