Skip to content

rke1-k8s1.16.3 szb13032 节点异常排查处理记录

一、问题现象

节点 szb13032 出现异常,表现为 Kubernetes 节点状态异常或 Pod 调度/运行异常(具体现象待补充)。

二、处理过程

时间操作结果
-重启 kubelet 服务未解决
-重启 docker 服务服务 hang 住,无法正常完成重启
-重启物理主机问题解决,节点恢复正常

三、可能原因分析

3.1 Docker daemon 卡死或死锁

重启 kubelet 无法恢复,说明问题可能不在 kubelet 本身,而在 Docker daemon 层面。重启 Docker 时 hang 住,进一步说明 Docker daemon 处于异常状态,可能原因:

  • 某个容器进程处于不可中断睡眠状态(D 状态),导致 Docker daemon 无法完成容器停止
  • Docker daemon 内部死锁或事件队列阻塞
  • containerd/runc 调用超时或卡死

3.2 系统资源耗尽

  • PID 耗尽:大量僵尸进程或容器进程导致无法创建新进程
  • 文件描述符耗尽:Docker 打开过多 socket/文件句柄
  • 内存压力:系统内存不足触发 OOM 或频繁回收
  • 磁盘 I/O 打满:Docker 数据目录所在磁盘繁忙或只读

3.3 Kernel / cgroup 问题

  • cgroup 目录残留或损坏,导致 Docker 无法创建/销毁容器
  • kernel 版本较老(3.10.0-1160),存在已知的 cgroup/docker 相关 bug
  • 内核参数(如 kernel.keys.root_maxbytes)达到上限

3.4 kubelet 与 Docker 通信异常

kubelet 通过 CRI 或 dockershim 调用 Docker,如果 Docker daemon 响应超时或拒绝服务,kubelet 会报告节点 NotReady,但重启 kubelet 无法恢复。

四、kubelet2.log 关键日志分析

4.1 coredns 调度到 szb13032 后启动失败

kubelet2.log 可以看到,coredns Pod coredns-6d546f654-7mt65 被调度到 szb13032 后,经历了以下过程:

时间事件
09:05:27coredns Pod 被 ADD,Volume Mount 成功
09:05:27kubelet 尝试创建 sandbox:No sandbox for pod ... Need to start a new one
09:05:28PLEG 报告 ContainerDied,Calico CNI 成功分配 IP 10.42.65.223/32
09:07:28首次报错StartContainer ... failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded
09:07:28failed to "StartContainer" for "coredns" with RunContainerError: "context deadline exceeded"
09:07:29ContainerStatus ... failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded

4.2 Docker runtime 持续超时

从 09:07:28 到 09:12:36,kubelet 对 coredns 容器的 StartContainerContainerStatus 调用反复失败:

E0723 09:07:28.400175    4261 remote_runtime.go:222] StartContainer "578228..." from runtime service failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded
E0723 09:07:29.105832    4261 remote_runtime.go:295] ContainerStatus "578228..." from runtime service failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded
E0723 09:09:30.152894    4261 remote_runtime.go:295] ContainerStatus "578228..." from runtime service failed: rpc error: code = DeadlineExceeded desc = context deadline exceeded
...
E0723 09:12:36.598120    4261 pod_workers.go:191] Error syncing pod ac64bb5c-759a-43e5-aab7-d9937357cc22 ("coredns-6d546f654-7mt65_kube-system(...)"): rpc error: code = DeadlineExceeded desc = context deadline exceeded

4.3 PLEG 不健康导致节点 NotReady

由于 Docker runtime 无法及时返回容器状态,kubelet 的 PLEG(Pod Lifecycle Event Generator)无法更新 Pod 状态:

I0723 09:10:30.598147    4261 kubelet.go:1839] skipping pod synchronization - PLEG is not healthy: pleg was last seen active 3m0.478590295s ago; threshold is 3m0s
I0723 09:10:34.471412    4261 setters.go:539] Node became not ready: {Type:Ready Status:False ... Reason:KubeletNotReady Message:PLEG is not healthy: pleg was last seen active 3m4.351821652s ago; threshold is 3m0s}

09:11:35 节点恢复 NodeReady,但 coredns 的 DeadlineExceeded 错误仍在持续。

4.4 日志结论

  • coredns 本身不是根因:CNI 网络分配正常,Volume 挂载正常,容器镜像已存在
  • 真正的问题是 Docker runtime 对 kubelet 的 CRI 调用无响应/超时
  • 这导致容器启动失败、状态获取失败、PLEG 不健康、节点 NotReady
  • 与之前排查判断一致:问题出在 Docker daemon 或系统底层,而非 kubelet 或 coredns 本身

五、后续应补充收集的信息

由于问题已通过重启物理机恢复,建议下次遇到类似问题时优先收集以下信息:

4.1 节点状态

bash
kubectl get node szb13032 -o yaml
kubectl describe node szb13032

4.2 kubelet 状态与日志

bash
# 在节点上执行
systemctl status kubelet
journalctl -u kubelet -n 1000 --no-pager

4.3 Docker 状态与日志

bash
# 在节点上执行
systemctl status docker
journalctl -u docker -n 1000 --no-pager
docker info
docker ps

4.4 系统资源

bash
# 在节点上执行
dmesg | tail -n 200
free -h
df -h
ps aux | wc -l
cat /proc/sys/kernel/pid_max
ls /var/run/docker.sock
ls -la /var/lib/docker/

4.5 容器运行时进程状态

bash
# 在节点上执行
ps aux | grep dockerd | grep -v grep
ps aux | grep containerd | grep -v grep
ps aux | grep "D\+" | head -n 20

4.6 挂起的 Docker 操作

bash
# 在节点上执行
docker ps -a | grep -i exit
docker system events --since 1h

六、建议的预防与改进措施

  1. 启用 Docker 和 kubelet 的 watchdog 配置 systemdRestart=alwaysTimeoutStartSec,避免服务 hang 住时无响应。

  2. 升级容器运行时 考虑将 Docker 升级到更稳定的版本,或迁移到 containerd。RKE1 1.16.3 当前使用 Docker 19.3.8,可评估升级。

  3. 监控系统资源 增加对以下指标的监控和告警:

    • 节点 PID 使用率
    • 文件描述符使用率
    • Docker daemon 健康状态
    • kubelet / docker 服务状态
    • 磁盘 I/O 和只读状态
  4. 定期清理 Docker 资源 清理 exited 容器、无用镜像和卷,避免资源累积:

    bash
    docker system prune -a --volumes
  5. 保留现场信息 下次遇到类似问题时,在重启物理机之前先执行 sosreport 或收集 /var/log/messagesdmesgjournalctl 等日志。

七、结论

本次 szb13032 节点异常通过重启物理主机恢复,初步判断问题出在 Docker daemon 或系统底层资源层面,而非 kubelet 本身。由于现场已被重启清除,建议后续加强监控并在故障发生时优先收集日志,以便定位根因。