5 分钟搞懂 K8S Pod Terminating/Unknown 故障排查

简介: 5 分钟搞懂 K8S Pod Terminating/Unknown 故障排查

Kubernetes 集群中的 Pod 有时候会进入 Terminating 或 Unknown 状态,本文列举了 6 种可能的原因,帮助我们排查这种现象。原文: K8s Troubleshooting — Pod in Terminating or Unknown Status



有时我们会看到 K8S 集群中的 pod 进入"Terminating"或"Unknown"状态,pod 进入这两种状态可能有以下原因:



  • 优雅终止周期(Graceful termination period): 当 pod 被删除时,会进入"Terminating"状态,等待容器优雅关闭。如果容器关闭所需时间超过默认期限(默认 30 秒),则 pod 将保持在"Terminating"状态。
  • Finalizers: Finalizer 是一种允许在删除资源之前清理资源的机制。如果 pod 有 Finalizer,并且相关的清理操作被卡住或没有响应,则 pod 将保持在"Terminating"状态。
  • 无响应容器(Unresponsive containers): 如果 pod 中的容器在终止过程中没有响应 SIGTERM 信号,则可能导致 pod 卡在"Terminating"状态。
  • 节点问题(Node issues): 如果节点无响应、断开连接或遇到其他问题,pod 可能会进入"Unknown"状态。在这种情况下,Kubernetes 控制平面无法确定 pod 的实际状态。
  • 网络问题(Network issues): 节点与 Kubernetes 控制平面之间的连接问题可能导致 pod 进入"Unknown"状态。例如,如果控制平面无法与节点通信,则无法接收来自 pod 的状态更新。
  • Kubelet 问题: 如果节点上运行的 Kubelet 进程出现问题或崩溃,可能会导致无法将 pod 状态上报给控制平面,从而造成 pod 进入"Unknown"状态。

故障排查

优雅终止周期(Graceful termination period)

K8S 中的优雅终止周期是在删除 pod 时,容器的优雅关闭时间。在此期间,容器接收 SIGTERM 信号,执行必要的清理工作,例如关闭连接,完成正在进行的任务,并在资源终止之前释放资源,默认为 30 秒。


  • 检查 pod 状态和事件: 通过kubectl检查 pod 的状态和事件以获取相关信息:


$ kubectl describe pod <pod-name> -n <namespace>

复制代码


  • 检查容器日志:


$ kubectl logs <pod-name> -c <container-name> -n <namespace> --previous

复制代码


  • 调整优雅终止周期: 如果容器始终需要更多的时间来清理资源,可以通过在 pod 的 YAML 文件中设置terminationGracePeriodSeconds字段来调整 pod 的终止周期。


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  terminationGracePeriodSeconds: 60
  containers:
  - name: my-container
    image: my-image

复制代码

Finalizers

Finalizer 允许在删除资源之前清理资源,如果 pod 上存在 Finalizer,并且相关的清理操作被卡住或没有响应,则 pod 将保持在"Terminating"状态。例如:


apiVersion: v1
kind: Pod
metadata:
  name: my-finalizer-pod
  finalizers:
    - example.com/cleanup
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["sh", "-c", "sleep 3600"]

复制代码


检查是否有 finalizer,可以运行以下命令:


$ kubectl get pod <pod-name> -n <namespace> -o json

复制代码


如果确定不需要 finalizer,或者确定可以将其安全删除,可以使用kubectl patch命令。但是,这样做要小心,因为可能会导致意想不到的副作用:


$ kubectl patch pod <pod-name> -n <namespace> -p '{"metadata":{"finalizers":["<finalizer-1>", "<finalizer-2>", ...]}}'

复制代码

无响应容器(Unresponsive containers)

当容器消耗过多系统资源时,可能会进入无响应状态。


  • kubectl describe命令查看 Pod 状态和事件。


$ kubectl describe pod <pod-name> -n <namespace>

复制代码


  • 检查 Pod/container 日志:


$ kubectl logs <pod-name> -c <container-name> -n <namespace>

复制代码


  • 强制删除 pod: 可以强制删除被卡住的 pod


$ kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0

复制代码

节点/网络/Kubelet 问题

执行以下步骤处理节点问题:


  • 检查节点状态/事件: 检查 pod 所在节点的状态:


$ kubectl describe node <node-name>
$ kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<node-name>

复制代码


  • 检查节点系统日志


$ journalctl -u kubelet
$ journalctl -u docker
$ journalctl -u containerd
$ cat /var/log/messages

复制代码


  • 排空节点: 如果已经确定了节点问题,并且需要执行维护,可以排空节点以安全驱逐所有正在运行的 pod,并将节点标记为不可调度:


$ kubectl drain <node-name>

复制代码

结论




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
286 25
|
12月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
8月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
278 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
205 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
214 1
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
168 1
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
220 1
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2158 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1554 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
本文讲的是Kubernetes之Pod调度【编者的话】Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
2927 0

热门文章

最新文章

推荐镜像

更多