Skip to content

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 exceeded

kubelet 通过 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 3m0s

PLEG 超过 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.Registration

Trident 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'

五、临时恢复与根治建议

临时恢复

  1. 重启 docker(会中断该节点所有容器,建议在业务低峰执行):
bash
systemctl restart docker
systemctl restart kubelet
  1. 重启后观察 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)