Kubernetes v1.21.2 StatefulSet Pod终止卡住问题排查与解决求助
解决Kubernetes v1.21.2 StatefulSet Pod 持续Terminating问题
问题原因
从报错日志里的device or resource busy可以明确:Pod对应的网络命名空间(netns)被进程占用,导致kubelet无法删除该网络命名空间,进而Pod一直卡在Terminating状态。常见触发场景包括:
- 容器内有进程脱离了主PID命名空间(比如通过
nsenter进入过该网络命名空间的外部进程,或者容器内进程fork后后台运行但未正常退出) - CNI网络插件在清理网络资源时出现异常,残留的进程占用了netns资源
解决步骤
1. 定位占用网络命名空间的进程
登录到Pod所在的Node节点,执行以下命令找出占用目标netns的进程:
# 替换为日志里的netns路径 NETNS_PATH="/var/run/netns/cni-f9ccb1de-ed43-dff6-1b86-1260e07178e6" # 用lsof直接查找关联进程 lsof $NETNS_PATH
如果lsof无输出,用inode匹配的方式查找:
# 获取目标netns的inode号 INODE=$(stat -c %i $NETNS_PATH) # 遍历所有进程,找到挂载该netns的进程 for pid in $(ls /proc | grep -E '^[0-9]+$'); do if [ -L /proc/$pid/ns/net ]; then if [ $(stat -c %i /proc/$pid/ns/net) -eq $INODE ]; then echo "占用netns的进程PID: $pid" ps -p $pid -f fi fi done
2. 终止占用进程
找到对应PID后,强制终止进程:
# 替换为实际找到的PID kill -9 <PID>
如果有多个占用进程,批量终止:
for pid in <PID1> <PID2>; do kill -9 $pid done
3. 手动清理Pod(可选)
如果进程终止后Pod仍卡在Terminating状态,执行强制删除命令:
kubectl delete pod <pod-name> --namespace <你的命名空间> --grace-period=0 --force
4. 预防问题复发
- 检查CNI插件(如Calico、Flannel)版本是否与Kubernetes v1.21.2兼容,建议升级到官方推荐的兼容版本
- 查看CNI插件日志,排查是否存在资源清理异常:
# 以Calico为例,查看节点插件日志 kubectl logs -n kube-system <calico-node-pod-name>
- 确认
/etc/cni/net.d/目录下的CNI配置文件无损坏或错误配置
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

