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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 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",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
13天前
|
Kubernetes API 调度
k8s中节点无法启动Pod
【10月更文挑战第3天】
48 6
|
13天前
|
存储 Kubernetes Perl
K8S中Pod启动异常
【10月更文挑战第3天】
28 2
|
15天前
|
应用服务中间件 调度 nginx
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
|
19天前
|
Kubernetes API 调度
k8s学习--pod的所有状态详解(图例展示)
k8s学习--pod的所有状态详解(图例展示)
|
15天前
|
JSON Kubernetes API
在K8S中,什么是静态Pod?
在K8S中,什么是静态Pod?
|
17天前
|
Kubernetes 应用服务中间件 调度
k8s的Pod常见的几种调度形式
k8s的Pod常见的几种调度形式
17 0
|
19天前
|
Kubernetes 固态存储 调度
k8s学习--如何控制pod调度的位置
k8s学习--如何控制pod调度的位置
|
20天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
90 17
|
13天前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
112 1
|
18天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
59 1