主题
RKE1 + Kubernetes 1.16.3 kubelet PLEG 与 docker 超时分析文档
一、问题背景
- 集群:RKE1 + Kubernetes 1.16.3(苏州 / 云平台 SZB 集群)
- 节点:szb13032(IP: 10.181.13.32)
- 现象:CoreDNS Pod
coredns-6d546f654-9qxkz长期处于ContainerCreating,Pod IP 为<none>,但 Calico 注解中已写入podIP: 10.42.65.220/32。 - 数据来源:
kubelet.log(2026-07-23 02:54 ~ 03:03 时段)
二、日志核心证据
1. docker runtime RPC 调用超时(直接原因)
E0723 02:56:05.343346 remote_runtime.go:295] ContainerStatus "55c01376..." from runtime service failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded
E0723 02:56:05.343435 kuberuntime_manager.go:935] getPodContainerStatuses for pod "coredns-6d546f654-9qxkz_kube-system(...)" failed: rpc error: code = DeadlineExceeded desc = context deadline exceededkubelet 通过 dockershim 调 dockerd 查询容器状态,dockerd 在 2 分钟内没有响应,导致 DeadlineExceeded。
2. Pod 同步持续失败
E0723 02:54:21.069227 pod_workers.go:191] Error syncing pod 227b4c0c... ("coredns-6d546f654-9qxkz_kube-system(...)"), skipping: rpc error: code = DeadlineExceeded desc = context deadline exceeded从 02:54 到 03:03 持续近 9 分钟,每隔约 12~15 秒就有一次同步失败,全部指向同一个 coredns Pod。
3. PLEG 失活导致节点 NotReady(反复出现)
I0723 02:57:05.291662 setters.go:539] Node became not ready: ... Message:PLEG is not healthy: pleg was last seen active 3m0.084060838s ago; threshold is 3m0s
I0723 02:57:05.353453 kubelet.go:1839] skipping pod synchronization - PLEG is not healthy: pleg was last seen active 3m0.14594837s ago; threshold is 3m0sPLEG 超过 3 分钟无法刷新,kubelet 跳过 Pod 同步,节点被 node-controller 标记为 NotReady。日志中 03:01 再次出现同样报错,说明 PLEG 周期性失活,节点在 Ready/NotReady 之间抖动。
4. iptables 锁竞争
E0723 02:58:33.819906 kubelet_network_linux.go:53] Failed to ensure that nat chain KUBE-MARK-DROP exists: error creating chain "KUBE-MARK-DROP": exit status 4: Another app is currently holding the xtables lock. Stopped waiting after 5s.iptables 被其他进程长期占用,kubelet 创建 NAT 链失败,可能叠加导致网络准备阶段阻塞。
5. Trident CSI 插件注册失败(旁枝问题)
E0723 02:55:31.302868 goroutinemap.go:150] ... failed to get plugin info using RPC GetInfo at socket /var/lib/kubelet/plugins/csi.trident.netapp.io/csi.sock, err: ... unknown service pluginregistration.RegistrationTrident CSI 与 K8s 1.16 pluginregistration 服务不兼容,导致 kubelet 每 2 分钟重试注册。这会占用 goroutine,但不是 coredns 起不来的主因。
6. 拉取 Secret 失败(旁枝问题)
W0723 02:58:05.382868 kubelet_pods.go:849] Unable to retrieve pull secret cattle-system/yunda-reg-915 for cattle-system/cattle-node-agent-9cjzl due to secret "yunda-reg-915" not found.该 warning 针对的是 cattle-node-agent-9cjzl(Rancher agent),与 coredns 无关。
三、根因链
dockerd 响应慢 / 卡死
↓
kubelet → docker RPC 调用超时(DeadlineExceeded)
↓
PLEG 超过 3 分钟无法刷新 → PLEG is not healthy
↓
kubelet 跳过 Pod 同步;节点被 node-controller 标记 NotReady
↓
coredns 容器已创建但无法启动(ContainerCreating,IP 未写入 Pod 状态)根本触发点:szb13032 上的 docker daemon 性能或死锁。
可能与以下因素叠加:
- 节点负载过高 / CPU 或 IO 被打满
- docker storage driver 退化(devicemapper/loop-lvm 老问题)
- iptables 锁被其他进程(calico/kube-proxy/firewalld)长期持有
- docker 版本过旧,长期运行后出现 goroutine 泄漏
四、排查命令(在 szb13032 上执行)
bash
# 1. 确认 dockerd 是否还在响应
docker version
docker info
# 2. 查看 dockerd 日志中的 hang / timeout / deadlock
journalctl -u docker --since "1 hour ago" | grep -iE "error|hang|timeout|deadlock|level=error" | tail -50
# 3. 查看 coredns 容器在 docker 中的真实状态
docker ps -a | grep coredns
docker inspect 55c01376c5991fa86b2f05ac12b424b868a98022c938317974452c150dcfc5ab | jq '.State'
# 4. 检查节点资源瓶颈
top -bn1 | head -20
df -h /var/lib/docker
df -i /var/lib/docker
iostat -xz 1 5
# 5. 检查 docker 存储驱动与数据目录
docker info | grep -i "storage driver\|server version"
du -sh /var/lib/docker/*
# 6. 检查 iptables 锁持有情况
ps aux | grep -E 'iptables|firewalld|calico|kube-proxy'五、临时恢复与根治建议
临时恢复
- 重启 docker(会中断该节点所有容器,建议在业务低峰执行):
bash
systemctl restart docker
systemctl restart kubelet- 重启后观察 coredns:
bash
kubectl -n kube-system get pods -l k8s-app=kube-dns -o wide -w根治建议
| 方向 | 措施 |
|---|---|
| docker 版本与存储驱动 | 升级到较新 Docker 版本;避免使用 devicemapper/loop-lvm;推荐 overlay2 + xfs |
| 节点负载治理 | 排查节点 CPU/IO 瓶颈,必要时扩容或分散 Pod |
| iptables 锁竞争 | 避免 firewalld 与 kube-proxy/calico 同时操作 iptables;必要时引入 iptables-nft 或升级后使用 ipvs 模式 |
| Trident CSI 注册错误 | 升级 Trident 版本或禁用不兼容的 pluginregistration(旁枝,可顺手处理) |
| 长期方案 | 集群升级至较新 K8s 版本,RKE1 + 1.16.3 已停止维护,dockershim 在 1.24+ 被移除 |
六、结论
- CoreDNS
ContainerCreating的直接原因不是 IP 耗尽,而是 docker runtime 对 kubelet 的 RPC 调用超时; - 容器已创建但无法启动,同时伴随 PLEG 失活、节点 NotReady 抖动;
- 应优先检查并修复 szb13032 上的 docker daemon 健康状态;
- 同步治理 iptables 锁竞争与 Trident CSI 注册噪音;
- 长期建议升级集群版本。
文档生成时间:2026-07-23数据来源:kubelet.log(szb13032)