1、前言
之前了解到kubectl get pod的时候可以看到status列会有Running CrashLoopBackOff等状态,于是就想了解一下到底有多少种状态,并且代表了什么意思,但经过查阅官网文档发现,pod状态其实只有5种,这完全超出了我之前的认真,于是专门了解了一下其中的区别
2、pod阶段
2.1 基本解释
Pod 的
status
字段是一个 PodStatus 对象,其中包含一个phase
字段。Pod 的阶段是 Pod 在其生命周期中所处位置的简单宏观概述。 该阶段并不是对容器或 Pod 状态的综合汇总,也不是为了成为完整的状态机。
Pod 阶段的数量和含义是严格定义的。 除了本文档中列举的内容外,不应该再假定 Pod 有其他的
phase
值。
以上引用自官网解释,说白了就是没什么卵用,并不能一眼就定位到问题,以下是具体阶段和解释
取值 | 描述 |
---|---|
Pending | Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 |
Running | Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 |
Succeeded | Pod 中的所有容器都已成功终止,并且不会再重启。 |
Failed | Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。 |
| 因为某些原因无法取得 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 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中。
字段名称 | 描述 |
---|---|
type | Pod 状况的名称 |
status | 表明该状况是否适用,可能的取值有 "True ", "False " 或 "Unknown " |
lastProbeTime | 上次探测 Pod 状况时的时间戳 |
lastTransitionTime | Pod 上次从一种状态转换到另一种状态时的时间戳 |
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 | 容器创建中 |
PodInitializing | pod 初始化中 |
DockerDaemonNotReady | docker还没有完全启动 |
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。