一、前言:

  • 本页面讲述 Pod 的生命周期。 Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少 其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。
  • Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 被终止。
  • restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。

二、Pod生命周期:

image

.

第一阶段:

  • 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用重新创建的容器替换了旧容器。

posted on 2022-04-06 20:56  史振兴  阅读(377)  评论(0编辑  收藏  举报