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>
相关推荐
Waay15 分钟前
K8s ETCD 详解|备份恢复+静态Pod原理+kubectl查询底层流程(面试必考)
面试·kubernetes·etcd
松岩25 分钟前
dcgm-exporter部分指标
kubernetes
我是谁??3 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
Patrick_Wilson3 小时前
K8s 探针避坑:Next.js 不同部署模式下的健康检查实践
kubernetes·node.js·next.js
运维瓦工3 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
Plastic garden4 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
Plastic garden4 小时前
k8s(11) Pod 控制器,服务发现与存储管理
kubernetes
与海boy4 小时前
docker compose minio
docker·容器·eureka
星辰徐哥5 小时前
云原生核心特性:容器化、微服务与DevOps的通俗解读
微服务·云原生·devops