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>
相关推荐
阿里云云原生5 小时前
Agent 数据飞轮平台的选型和实践
云原生
做运维的阿瑞6 小时前
云项目可观测性与成本治理:告警、日志、Dashboard 与预算标签
大数据·云原生·云计算·terraform
无人生还别怕7 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
知已难寻8 小时前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
分布式存储与RustFS8 小时前
模型权重散落在每台 GPU?用 RustFS 给 vLLM 做共享权重库
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
木雷坞9 小时前
Baserow Docker部署:导入设备借用CSV,再用表单新增登记
运维·docker·容器
fb_123459 小时前
从探针到权限:一篇吃透 Kubernetes 健康检查、RBAC 认证授权与 Dashboard 可视化管理
云原生·容器·kubernetes
wefg110 小时前
【Docker】基本指令
运维·docker·容器
mengge.cloud10 小时前
10-28-Kubernetes健康检查认证授权与Dashboard
云原生·容器·kubernetes
做运维的阿瑞11 小时前
EKS 可销毁环境:集群创建、应用部署到账单归零
云原生·云计算·terraform