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的状态和事件以获取相关信息:

bash 复制代码
kubectl describe pod <pod-name> -n <namespace>
 #检查容器日志
kubectl logs <pod-name> -c <container-name> -n <namespace> --previous

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

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  terminationGracePeriodSeconds: 60
  containers:
  - name: my-container
    image: my-image

Finalizers

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

bash 复制代码
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,可以运行以下命令:

bash 复制代码
kubectl get pod <pod-name> -n <namespace> -o json

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

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

无响应容器(Unresponsive containers)

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

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

bash 复制代码
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所在节点的状态:

bash 复制代码
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,并将节点标记为不可调度:

bash 复制代码
kubectl drain <node-name>
相关推荐
重生之我是cxk13 分钟前
docker多架构镜像构建
docker·容器·架构
Ares-Wang44 分钟前
kubernetes》》k8s》》ConfigMap 、Secret
云原生·容器·kubernetes
半吊子的程序狗1 小时前
docker测试镜像源
运维·docker·容器
Pasregret1 小时前
05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南
java·微服务·云原生·架构
XDIGAS2 小时前
Dockerfile项目实战-单阶段构建Vue2项目
docker·容器·centos·node.js·vue
码--到成功2 小时前
向量数据库Qdrant 安装 不使用docker
运维·docker·容器
阿里云云原生5 小时前
MCP 正当时:FunctionAI MCP 开发平台来了!
云原生
慧一居士5 小时前
Kubernetes(K8S)内部功能总结
云原生·容器·kubernetes
rider1895 小时前
【4】k8s集群管理系列--harbor镜像仓库本地化搭建
云原生·容器·kubernetes
郝同学的测开笔记5 小时前
云原生探索系列(十五):Go 语言通道
后端·云原生·go