Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >两张思维导图,帮你理清 K8s 中 Pod 的 phase 和 conditions

两张思维导图,帮你理清 K8s 中 Pod 的 phase 和 conditions

作者头像
我的小碗汤
发布于 2023-03-19 09:20:25
发布于 2023-03-19 09:20:25
1.3K00
代码可运行
举报
文章被收录于专栏:我的小碗汤我的小碗汤
运行总次数:0
代码可运行

原文: http://www.knockatdatabase.com/2022/05/21/kubernetes-pod-phase-and-pod-conditions/

pod 的 phase

phase 作用

用于描述、查看、分析 pod 当前处于什么状态。

有哪些 phase

通常情况下,在 pod 的生命周期中,每个 pod 会处于 5 个不同的 phase:pending,running,succeed,failed,unknown。同一时间,1 个 pod 只能处于 1 个 phase。

  • 当 pod 刚被创建时,它处于 pending 这个 phase,等待被调度;
  • 如果 pod 中的一个或多个 container 处于运行状态时,那么 pod 就处于 running phase;
  • 如果 pod 中的 container 不是被设置为无限运行下去的情况下(比如执行定时任务或一次性任务),且 container 运行结束,那么 pod 处于 succeed phase;
  • 反之,如果 pod 中的 container 不是被设置为无限运行下去的情况下(比如执行定时任务或一次性任务),且 container 运行失败,那么 pod 处于 failed phase;
  • 如果 pod 所在 node 上的 kubelet 出现故障或意外,而停止向 Kubernetes API server 报告它所在 node 上的 pod 的状态时,那么此时该 node 上的 pod 就处于 unknown phase;

如何查看 pod 的 phase

由于 pod 的 phase 字段位于 pod 的 manifest 中的 Status 部分,也就是说 ,我们可以从 Kubernetes API server 那里获取 pod 的 yaml 文件,然后从 status 字段中找到 pod 的 phase。那么,我们就可以,通过 kubectl get pod pod_name -o yaml|grep phase 来查看 pod 的 phase:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master-node ~]# kubectl get pods
NAME                       READY   STATUS      RESTARTS   AGE
curl                       1/1     Running     0          6d9h
curl-with-ambassador       2/2     Running     0          28d
downward                   1/1     Running     0          28d
fortune-configmap-volume   2/2     Running     0          36d
fortune-https              2/2     Running     0          35d
my-job-jfhz9               0/1     Completed   0          6d9h
[root@master-node ~]# kubectl get pods curl -o yaml|grep phase
  phase: Running
[root@master-node ~]# kubectl get pods my-job-jfhz9 -o yaml|grep phase
  phase: Succeeded
[root@master-node ~]#

从上,我们通过 pod 的 yaml 文件里获取了它们的 phase。其中的 my-job-jfhz9 是一个 job 且已经执行完成。所以,它处于 succeed 的 phase。

pod 的 conditions

pod 有了 phase,为什么还要有 conditions

因为 pod 的 phase 比较简单的描述了 pod 处于哪个具体情况,但是没有明确说明具体原因。

pod 的 conditions 的作用

用于描述 1 个 pod 当前是否处于哪个 phase,以及处于该 phase 的原因。及作为一个辅助手段,详细的展示 pod 的状态信息,用于问题排查分析时提供更多依据。同一时间,1 个 pod 可能处于多个 conditions。

pod 的 conditions 分类

通常分为 4 个 conditions:PodScheduled,Initialized,ContainersReady,Ready。见名知意:

  • PodScheduled:意味着 pod 是否已经被调度到某个 node;
  • Initialized:Pod 的 init containers 是否全部完成;
  • ContainersReady:pod 中的所有 container 是否全部就绪;但这并不意味着 pod 也 ready;
  • Ready:pod 是否就绪;只有 pod 中的所有 container 就绪,且 pod 的 readiness probe 也完成了,意味着 pod 可以对外提供服务了,才是 ready 状态。

如何查看 pod 的 conditions

同样,由于 pod 的 conditions 源于 yaml 格式的 manifest 中的 Status 字段,我们可以从 yaml 文件里查看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master-node ~]# kubectl get pods curl -o yaml
apiVersion: v1
kind: Pod
...
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2022-05-09T15:23:37Z"
    status: "True"
    type: Initialized                         #conditions状态2
  - lastProbeTime: null
    lastTransitionTime: "2022-05-09T15:23:51Z"
    status: "True"
    type: Ready                               #conditions状态4
  - lastProbeTime: null
    lastTransitionTime: "2022-05-09T15:23:51Z"
    status: "True"
    type: ContainersReady                     #conditions状态3
  - lastProbeTime: null
    lastTransitionTime: "2022-05-09T15:23:37Z"
    status: "True"
    type: PodScheduled                        #conditions状态1
  containerStatuses:
  - containerID: docker://9d56be349349b7581a4178b11895167b5be8c1c68ce1630f440389a1e8257a35
    image: docker.io/rancher/curl:latest
    imageID: docker-pullable://docker.io/rancher/curl@sha256:85aea1846e2e9b921629e9c3adf0c5aa63dbdf13aa84d4dc1b951982bf42d1a4
    lastState: {}
    name: main
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2022-05-09T15:23:50Z"
  hostIP: 172.16.11.161
  phase: Running
  podIP: 10.244.2.245
  podIPs:
  - ip: 10.244.2.245
  qosClass: BestEffort
  startTime: "2022-05-09T15:23:37Z"
[root@master-node ~]#

从上,我们可以从 yaml 中的 Status 字段里的 conditions 字段看到 pod 的 4 个 conditions。

同样,我们也可以通过 kubectl describe pod 来获取 conditions:kubectl describe pod pod_name|grep Conditions: -A 5

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master-node ~]# kubectl describe pod curl|grep Conditions: -A 5
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
[root@master-node ~]# kubectl describe pod my-job-jfhz9|grep Conditions: -A5
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
[root@master-node ~]#

表示要过滤 Conditions:字段,然后,-A5 表示紧随其后的 5 行。-A 5 之间也可以留空格,不影响结果。

比如:上述我们看到的类型为 job 的 pod my-job-jfhz9 它的 conditions 中,有多个是 False 的。为什么呢?我们同样,可以从 kubectl get pods pod_name -oyaml 里查看到类似下述的说明信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conditions:
    - lastProbeTime: null
      lastTransitionTime: "2022-05-09T15:22:23Z"
      reason: PodCompleted
      status: "True"
      type: Initialized
    - lastProbeTime: null
      lastTransitionTime: "2022-05-09T15:24:44Z"
      reason: PodCompleted
      status: "False"
      type: Ready
    - lastProbeTime: null
      lastTransitionTime: "2022-05-09T15:24:44Z"
      reason: PodCompleted
      status: "False"
      type: ContainersReady
    - lastProbeTime: null
      lastTransitionTime: "2022-05-09T15:22:19Z"
      status: "True"
      type: PodScheduled

我们,从 reason 字段里,看到 pod 处于某个状态下的具体原因。原来,ContainersReady 的状态为 false 的原因,是 PodCompleted 了。

其中的 lastProbeTime 表示的该 conditions 在什么时间被检查过,名字中虽然有 probe,但是它跟 probe 没有关系; lastTransitionTime 表示该 conditions 在什么时间点儿发生的变化;

小结

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
K8S 拉取私有仓库镜像
在使用Kubernetes(k8s)从私有仓库拉取镜像时,会出现无法拉去镜像的情况,私有仓库需要认证才能访问,如果Kubernetes无法通过认证,就会导致拉取失败,这时我们就需要手动创建私有仓库的登录信息。
小陈运维
2024/12/05
1770
K8S 拉取私有仓库镜像
部署 Kubernetes + KubeVirt 以及 KubeVirt的基本使用
KubeVirt目的是让虚拟机运行在容器中,下面就用下KubeVirt的几个基本操作:
后端云
2022/06/09
4.1K0
部署 Kubernetes + KubeVirt 以及 KubeVirt的基本使用
Kubernetes K8S之Pod生命周期与探针检测
每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效。在设计时可以充分利用这一特性,将一组密切相关的服务进程放入同一个Pod中;同一个Pod里的容器之间仅需通过localhost就能互相通信。
踏歌行
2020/10/15
1.7K0
Kubernetes K8S之Pod生命周期与探针检测
Kubectl命令行jsonpath的使用
JSONPath 模板由 {} 包起来的 JSONPath 表达式组成。Kubectl 使用 JSONPath 表达式来过滤 JSON 对象中的特定字段并格式化输出。除了原始的 JSONPath 模板语法,以下函数和语法也是有效的:
聂伟星
2020/08/27
5.7K0
院长手把手教学---Job实验
[root@k8s-master ~]# kubectl create -f job.yaml
院长技术
2020/12/02
5360
kubernetes之pod健康检查
LivenessProbe和ReadinessProbe均可配置以下三种探针实现方式: 可参考官方文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
仙人技术
2020/04/28
1.1K0
Kubernetes(k8s)常用资源的使用、Pod的常用操作
答:k8s是通过定义一个Pod的资源,然后在Pod里面运行容器的。K8s最小的资源单位Pod。
别先生
2020/06/23
1.3K0
Kubernetes(k8s)常用资源的使用、Pod的常用操作
研发工程师玩转Kubernetes——使用Deployment进行多副本维护
多副本维护是指,对一组在任何时候都处于运行状态的 Pod 副本的稳定集合进行维护。说的直白点,就是保证某种的Pod数量会被自动维持——增加了该类Pod会自动删除多余的,减少了该类Pod会自动新增以弥补,以保证Pod数量不变。 Kubernetes是一个一直在迭代更新的系统,其多副本维护方案也经历了几个版本大的改动。本文将采用最新的Deployment方案,而不是老版本的ReplicaSet和ReplicationController。
方亮
2023/05/26
7330
研发工程师玩转Kubernetes——使用Deployment进行多副本维护
kubernetes-深入理解pod对象(七)
Pod中可以同时运行多个进程(作为容器运行)协同工作。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境和依赖,它们总是被同时调度。
yuezhimi
2020/09/30
8760
kubernetes-深入理解pod对象(七)
linux下轻量级工具:yq(json,yaml)格式转换工具安装和使用
有时需要将json和yaml格式的配置文件进行相互转换,那么在linux的环境下,yq就是一个很好的命令行的工具。
johnhuster的分享
2023/11/13
4.3K0
k8s集群运维篇–kubectl常用命令
当然最基础的我就一笔带过: 查看帮助: [root@master1 ~]# kubectl --help 查看版本:(至今,yum安装的版本竟然是1.5.2,,这两天准备升级到1.8x) [[email protected] ~]# kubectl --version Kubernetes v1.5.2 get get命令用于获取集群的一个或一些resource信息。 使用–help查看详细信息。 Ps:kubectl的帮助信息、示例相当详细,而且简单易懂。建议大家习惯使用帮助信息。kubectl可以列出集
老七Linux
2018/05/31
56.6K0
k8s基础-健康检查机制
这里我探测了一个并不存在的地址,所以pod在探测失败后肯定会重启 启动该pod,启动成功后查看pod的描述和日志
dogfei
2020/07/31
8660
【云+社区年度征文】院长手把手教学,编写一个简单的yaml文件,包含两个容器
创建一个Pod,里面包含两个容器,一个Nginx和Tomcat 注意:不要在一个Pod下创建使用同样的端口的容器,这样会导致错误
院长技术
2020/11/23
5200
k8s-pod管理
k8s是通过docker来做资源限制的,可以先查看下,pod在哪个节点上运行的,然后查看下容器的具体信息
dogfei
2020/07/31
7630
client-go gin的简单整合十-Update
完成了client-go gin的简单整合九-Create的namespace deployment pod的 创建操作,现在进行一下update修改的操作!
对你无可奈何
2022/06/22
5120
K8S 拉取私有仓库镜像
在使用Kubernetes(k8s)从私有仓库拉取镜像时,会出现无法拉去镜像的情况,私有仓库需要认证才能访问,如果Kubernetes无法通过认证,就会导致拉取失败,这时我们就需要手动创建私有仓库的登录信息。
小陈运维
2024/11/30
3160
Kubernetes 集群常用操作总结
一、卸载步骤 卸载: kubeadm reset 清理: kubeadm reset -f modprobe -r ipip lsmod rm -rf ~/.kube/ rm -rf /etc/kubernetes/ rm -rf /etc/systemd/system/kubelet.service.d rm -rf /etc/systemd/system/kubelet.service rm -rf /usr/bin/kube* rm -rf /etc/cni rm -rf /opt/cni rm
高楼Zee
2021/05/11
9910
k8s学习八:pod
pod-label的作用就是在pod中添加标识,用来对资源进行区分和选择,例如上面的 app=go 
仙士可
2022/09/28
6250
k8s学习八:pod
k8s安装redis单机版
# 1.创建data目录 [root@node1 redis]# pwd /home/summer/redis [root@node1 redis]# mkdir -p /home/summer/redis/data [root@node1 redis]# chmod -R 777 /home/summer/redis/data # 2.整体目录 [root@master redis]# ll 总用量 8 drwxrwxrwx 2 root root 24 1月 4 14:41 conf drw
summerking
2022/09/19
1.6K0
k8s安装redis单机版
据说只有高端机器才配运行K8S,网友:1G内存的渣渣跑起来了!
K3S是一个完全符合Kubernetes的发行版。可以使用单一二进制包安装(不到 100MB),安装简单,内存只有一半,最低0.5G内存就能运行。
macrozheng
2021/03/09
6950
相关推荐
K8S 拉取私有仓库镜像
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验