前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Kubernetes(k8s)-Pod状态(Status)

Kubernetes(k8s)-Pod状态(Status)

作者头像
运维小路
发布2025-02-25 08:31:03
发布2025-02-25 08:31:03
16800
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面介绍了很多类型的工作负载,最后都会落实到具体的Pod上的。上一小节我们也介绍了Pod的创建流程,实际运维中Pod状态也会根据实际情况进行变化,所以了解Pod的各种状态,对于分析处理问题非常有帮助。

在 Kubernetes 中,Pod 的生命周期涵盖了多个状态,其中包括一些长期状态和短暂状态。下面是这些状态的综合描述:

长期状态

  1. Pending(挂起):Pod 已经被 Kubernetes 系统接受,但一个或多个容器尚未被创建或调度,可能出现问题的原因是没有合适的节点,或者标签亲和性等不匹配,通过descirbe命令可以看到具体原因。
  2. Running(运行中):Pod 已经被调度到一个节点上,所有容器都被创建,至少有一个容器正在运行、启动或重启。如果是1/1, 2/2这种前后一致就说明是正常状态,如果前后数字不一致,就说明有部分容器异常。
  3. Completed(成功完成):Pod 中的所有容器都正常运行完成,并且退出码为 0。哪些Job任务或者InitContainers正常执行退出的容器就是这个状态。
  4. Unknown(未知):Pod 的状态无法被 Kubernetes 确定,通常是由于与 Pod 所在节点的通信故障。
  5. Evicted(被驱逐):Pod 被系统驱逐,通常是因为资源紧张,如内存或磁盘空间不足。属于服务器主动状态驱逐的,如果是维护管理员主动驱逐则Pod会被删除,不会保留状态。

短暂状态

  1. ContainerCreating:Pod 已经被调度到一个节点但容器尚未完全创建。Kubernetes 可能在拉取镜像、设置网络和准备储存卷。如果是长期存在,则说明该Pod异常,需要检查。Kubernetes 可能在拉取镜像、设置网络和准备储存卷。如果是长期存在,则说明该Pod异常,需要检查。如果是长期存在,则说明该Pod异常,需要检查。
  2. Init:Waiting:Pod 有初始化容器,这些容器在主容器启动前运行,如果正在等待它们完成,则会显示此状态。
  3. Terminating:Pod 正在被删除,处于清理和资源回收过程中。
  4. CrashLoopBackOff:Pod 中的一个或多个容器尝试启动后失败,Kubernetes 正在尝试重新启动容器。
  5. ImagePullBackOff/ErrImagePull:Kubernetes 无法拉取指定的容器镜像。

当然其实这些所谓的长期和短暂状态其实不太准确,因为如果出现问题,这些状态就会长期保持,比如我们前面讲解InitContainers,就故意设置错误让这个初始化无法完成,他的状态就会长期维持在Init:xxx状态。

我们通过前面的状态,只能看到一个Pod状态,如果想要知道引发这个状态的详细信息,则可以通过下面的命令来实现。

代码语言:javascript
代码运行次数:0
复制
kubectl get pod <pod-name>
kubectl describe pod <pod-name>

kubectl describe pod 的输出中,Events 部分会显示 Pod 的生命周期中的各种短暂状态和相关事件,提供有关 Pod 创建、启动或删除过程中发生的详细信息,有助于诊断和解决问题。

但是这些状态并不绝对,短期状态也可能持续存在,比如下载镜像失败,就会持续存在。

特别注意Terminating状态如果长期不消失则只能强制删除,但是一般不要轻易这样操作。

要强制删除一个 Pod,你可以使用 kubectl 命令并传递 --force--grace-period=0 参数。这将立即删除 Pod 而不等待优雅终止的过程。请记住,强制删除可能会导致 Pod 中运行的服务不正常终止,可能会引起数据不一致或其他问题。只有当 Pod 无法正常删除时,才建议使用强制删除。

下面是强制删除 Pod 的命令:

代码语言:javascript
代码运行次数:0
复制
kubectl delete pod <pod-name> --force --grace-period=0

这里的 <pod-name> 是你想要删除的 Pod 的名字。

如果节点失联,节点的Pod出现Unknown状态,一般不需要手工删除,只要等待节点恢复以后,这些Pod就会被自动删除。

另一个注意事项是,如果 Pod 被设置了 finalizers(终结器),那么即使使用了 --force 参数,它仍可能不会被立即删除。这是因为 finalizers 是用于在删除资源之前执行特定的清理工作。在这种情况下,你可能需要编辑 Pod 资源以移除 finalizers:

代码语言:javascript
代码运行次数:0
复制
kubectl edit pod <pod-name>

然后删除或清空 metadata.finalizers 字段,保存并退出编辑器,Pod 将被删除。

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

本文分享自 运维小路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档