Pod生命周期中的状态解释

1、前言

        之前了解到kubectl get pod的时候可以看到status列会有Running CrashLoopBackOff等状态,于是就想了解一下到底有多少种状态,并且代表了什么意思,但经过查阅官网文档发现,pod状态其实只有5种,这完全超出了我之前的认真,于是专门了解了一下其中的区别

2、pod阶段

   2.1 基本解释     

Pod 的 status 字段是一个 PodStatus 对象,其中包含一个 phase 字段。

Pod 的阶段是 Pod 在其生命周期中所处位置的简单宏观概述。 该阶段并不是对容器或 Pod 状态的综合汇总,也不是为了成为完整的状态机。

Pod 阶段的数量和含义是严格定义的。 除了本文档中列举的内容外,不应该再假定 Pod 有其他的 phase 值。

以上引用自官网解释,说白了就是没什么卵用,并不能一眼就定位到问题,以下是具体阶段和解释

取值描述
PendingPod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
RunningPod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
SucceededPod 中的所有容器都已成功终止,并且不会再重启。
FailedPod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。

Unknown

因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

2.2 查看方式

[root@ ~]# kubectl get pod nginx-75d85f4fb4-kpfbd -o yaml|tail
    state:
      running:
        startedAt: "2022-05-13T00:06:18Z"
  hostIP: 192.168.20.216
  phase: Running
  podIP: 10.213.0.140
  podIPs:
  - ip: 10.213.0.140
  qosClass: Burstable
  startTime: "2022-03-25T07:20:53Z"
[root@ ~]# kubectl get pod test -o yaml|tail
      waiting:
        message: back-off 5m0s restarting failed container=test pod=test_default(159a941e-133e-428e-a9c1-5ee9e09c035f)
        reason: CrashLoopBackOff
  hostIP: 192.168.20.217
  phase: Running
  podIP: 10.213.0.12
  podIPs:
  - ip: 10.213.0.12
  qosClass: Guaranteed
  startTime: "2022-05-24T09:09:18Z"
[root@ ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
ack-place-holder-5dbc547d6c-ghgvg   1/1     Running            1          176d
nginx-75d85f4fb4-kpfbd              1/1     Running            1          108d
test                                0/1     CrashLoopBackOff   13722      48d

        通过以上命令可以看出nginx和test两个pod的phase字段值都为Running,但test并没有真正的running,这里的Running仅仅代表pod在Running阶段而已

3、Pod状况

        3.1 基本解释

Pod 有一个 PodStatus 对象,其中包含一个 PodConditions 数组。Pod 可能通过也可能未通过其中的一些状况测试。

  • PodScheduled:Pod 已经被调度到某节点;
  • ContainersReady:Pod 中所有容器都已就绪;
  • Initialized:所有的 Init 容器 都已成功完成;
  • Ready:Pod 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中。
字段名称描述
typePod 状况的名称
status表明该状况是否适用,可能的取值有 "True", "False" 或 "Unknown"
lastProbeTime上次探测 Pod 状况时的时间戳
lastTransitionTimePod 上次从一种状态转换到另一种状态时的时间戳
reason机器可读的、驼峰编码(UpperCamelCase)的文字,表述上次状况变化的原因
message人类可读的消息,给出上次状态转换的详细信息

以上引用自官方文档,这个pod状况还算是有点用处,可以大致看出在哪里出了问题

3.2 查看方法 

[root@ ~]# kubectl get pod test -o yaml|grep ^status -A 22
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2022-05-24T09:09:18Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2022-07-11T19:54:56Z"
    message: 'containers with unready status: [test]'
    reason: ContainersNotReady
    status: "False"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2022-07-11T19:54:56Z"
    message: 'containers with unready status: [test]'
    reason: ContainersNotReady
    status: "False"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2022-05-24T09:09:18Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
[root@ ~]#
[root@ ~]# kubectl describe pod test |grep Conditions -A 5
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True

以上两条命令可以看到,详细和粗略的Conditions信息

4、容器状态和状态原因

4.1 容器状态基本概念

        Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。 你可以使用容器生命周期回调来在容器生命周期中的特定时间点触发事件。

        一旦调度器将 Pod 分派给某个节点,kubelet 就通过 容器运行时开始为 Pod 创建容器。 容器的状态有三种:Waiting(等待)、Running(运行中)和 Terminated(已终止)。

        要检查 Pod 中容器的状态,你可以使用 kubectl describe pod <pod 名称>。 其输出中包含 Pod 中每个容器的状态。每种状态都有特定的含义:

Waiting:

        如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如,从某个容器镜像 仓库拉取容器镜像,或者向容器应用 Secret 数据等等。 当你使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,你也会看到一个 Reason 字段,其中给出了容器处于等待状态的原因。

Running:

  Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。 如果你使用 kubectl 来查询包含 Running 状态的容器的 Pod 时,你也会看到 关于容器进入 Running 状态的信息。

Terminated:

        处于 Terminated 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败。 如果你使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时,你会看到 容器进入此状态的原因、退出代码以及容器执行期间的起止时间。

        如果容器配置了 preStop 回调,则该回调会在容器进入 Terminated 状态之前执行。

4.2 容器状态原因

常见的原因如下

InvalidImageName无法解析镜像名称
ImageInspectError无法校验镜像
ErrImageNeverPull策略禁止拉取镜像
ImagePullBackOff镜像正在重试拉取
RegistryUnavailable连接不到镜像中心
ErrImagePull通用的拉取镜像出错
CreateContainerConfigError不能创建kubelet使用的容器配置
CreateContainerError创建容器失败
m.internalLifecycle.PreStartContainer执行hook报错
RunContainerError启动容器失败
PostStartHookError执行hook报错
ContainersNotInitialized容器没有初始化完毕
ContainersNotReady容器没有准备完毕
ContainerCreating容器创建中
PodInitializingpod 初始化中
DockerDaemonNotReadydocker还没有完全启动
NetworkPluginNotReady网络插件还没有完全启动

4.3 查看方法

[root@iZ2zef1e034gg98bajpqw6Z ~]# kubectl describe pod test
Name:         test
Namespace:    default
... ...
Containers:
  test:
    Container ID:   docker://485f6f180fde2b39b90f3dedb9a7ad1b12cffd1e7d644c10f9f84356908772fa
    Image:          curlimages/curl:7.83.0
    Image ID:       docker-pullable://curlimages/curl@sha256:ee13f32055704ad511b5df93cbb9117ba76e603bcc86a175de765d389f79e91c
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    2
      Started:      Tue, 12 Jul 2022 11:35:41 +0800
      Finished:     Tue, 12 Jul 2022 11:35:41 +0800
    Ready:          False
    Restart Count:  13727
    Limits:
... ...
[root@iZ2zef1e034gg98bajpqw6Z ~]# kubectl describe pod nginx-75d85f4fb4-kpfbd
Name:         nginx-75d85f4fb4-kpfbd
Namespace:    default
... ...
Containers:
  nginx:
    Container ID:   docker://2c8d7088ab01b911b49172db5ed45585e753180dc8a0884d13b866a7da4132a4
    Image:          nginx:1.17.9
    Image ID:       docker-pullable://nginx@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Fri, 13 May 2022 08:06:18 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    255
      Started:      Fri, 25 Mar 2022 15:21:15 +0800
      Finished:     Fri, 13 May 2022 08:05:44 +0800
... ...

        state即为容器状态,Reason即为状态原因,last state为上次的状态和原因,状态为Running的时候没有原因,所以我们在get pod的时候看到的status字段的值若不为Running的时候取自Reason字段值,若为Running时则为Running。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值