一、前言:
- 本页面讲述 Pod 的生命周期。 Pod 遵循一个预定义的生命周期,起始于
Pending
阶段,如果至少 其中有一个主要容器正常启动,则进入Running
,之后取决于 Pod 中是否有容器以 失败状态结束而进入Succeeded
或者Failed
阶段。 - Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 被终止。
- restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。
二、Pod生命周期:
.
第一阶段:
-
Pending:
正在创建Pod但是Pod中的容器还没有全部被创建完成,处于此状态的Pod应该检查Pod依赖的存储是否有权限挂载、镜像是否可以下载、调度是否正常等。 -
Failed
Pod中有容器启动失败而导致pod工作异常。 -
Unknown
由于某种原因无法获得pod的当前状态,通常是由于与pod所在的node节点通信错误。 -
Succeeded
Pod中的所有容器都被成功终止即pod里所有的containers均已terminated。
第二阶段:
-
Unschedulable:
Pod不能被调度,kube-scheduler没有匹配到合适的node节点 -
PodScheduled
pod正处于调度中,在kube-scheduler刚开始调度的时候,还没有将pod分配到指定的pid,在筛选出合适的节点后就会更新etcd数据,将pod分配到指定的pod -
Initialized
所有pod中的初始化容器已经完成了 -
ImagePullBackOff:
Pod所在的node节点下载镜像失败 -
Running
Pod内部的容器已经被创建并且启动。 -
Ready
表示pod中的容器已经可以提供访问服务
.
.
三、Pod重启策略:
Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never
。默认值是 Always。
- Always:在任何情况下,只要容器不在运行状态,就自动重启容器。
- OnFailure:当容器失败时(容器停止运行且退出码不为0),k8s自动重启该容器。
- Never:不论容器运行状态如何都不会重启该容器,Job或CronJob。
在实际使用时,我们需要根据应用运行的特性,合理设置这三种恢复策略。
对于包含多个容器的 Pod,只有它里面所有的容器都进入异常状态后,Pod 才会进入 Failed 状态。在此之前,Pod 都是 Running 状态。此时,Pod 的 READY 字段会显示正常容器的个数,比如:
点击查看代码
$ kubectl get pod test-liveness-exec
NAME READY STATUS RESTARTS AGE
liveness-exec 0/1 Running 1 1m
如果一个 Pod 里只有一个容器,然后这个容器异常退出了。那么,只有当 restartPolicy=Never 时,这个 Pod 才会进入 Failed 状态。而其他情况下,由于 Kubernetes 都可以重启这个容器,所以 Pod 的状态保持Running 不变,RESTARTS信息统计了Pod的重启次数。需要注意的是:虽然是重启,但背后其实是Kubernetes用重新创建的容器替换了旧容器。