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 的状态和事件以获取相关信息:
检查容器日志:
调整优雅终止周期: 如果容器始终需要更多的时间来清理资源,可以通过在 pod 的 YAML 文件中设置
terminationGracePeriodSeconds
字段来调整 pod 的终止周期。
Finalizers
Finalizer 允许在删除资源之前清理资源,如果 pod 上存在 Finalizer,并且相关的清理操作被卡住或没有响应,则 pod 将保持在"Terminating"状态。例如:
检查是否有 finalizer,可以运行以下命令:
如果确定不需要 finalizer,或者确定可以将其安全删除,可以使用kubectl patch
命令。但是,这样做要小心,因为可能会导致意想不到的副作用:
无响应容器(Unresponsive containers)
当容器消耗过多系统资源时,可能会进入无响应状态。
用
kubectl describe
命令查看 Pod 状态和事件。
检查 Pod/container 日志:
强制删除 pod: 可以强制删除被卡住的 pod
节点/网络/Kubelet 问题
执行以下步骤处理节点问题:
检查节点状态/事件: 检查 pod 所在节点的状态:
检查节点系统日志
排空节点: 如果已经确定了节点问题,并且需要执行维护,可以排空节点以安全驱逐所有正在运行的 pod,并将节点标记为不可调度:
结论
你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!
版权声明: 本文为 InfoQ 作者【俞凡】的原创文章。
原文链接:【http://xie.infoq.cn/article/b645952f9909105694535e4a3】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论