本周两次Kubernetes Pod因网络问题崩溃,附节点与Pod事件详情
我来帮你梳理下这个Kubernetes Pod网络崩溃问题的前因后果,再一步步给出排查思路和解决办法:
从你提供的节点事件日志,能清晰看到完整的故障传导链:
Warning OOMKilling 44m kernel-monitor, gke-iagree-cluster-1-main-pool-5632d628-wgzr Memory cgroup out of memory: Kill process 1560920 (runc:[2:INIT])
Warning TaskHung 31m kernel-monitor, gke-iagree-cluster-1-main-pool-5632d628-wgzr INFO: task dockerd:1883293 blocked for more than 300 seconds.
Warning Rebooted 30m kubelet, gke-iagree-cluster-1-main-pool-5632d628-wgzr Node gke-iagree-cluster-1-main-pool-5632d628-wgzr has been rebooted
首先节点发生内存耗尽(OOM),内核杀死了容器运行时关键进程runc:[2:INIT],直接破坏了容器运行环境的稳定性;紧接着dockerd进程被阻塞超过5分钟,说明容器服务已经彻底异常;最终节点触发自动重启,但重启后kubelet未能正确获取PodCIDR,导致Kubenet网络插件初始化失败,进而引发Pod的网络就绪告警,Pod被强制重建。
验证节点PodCIDR分配状态
执行命令查看节点的PodCIDR是否正常分配:kubectl describe node gke-iagree-cluster-1-main-pool-5632d628-wgzr | grep PodCIDR如果输出为空,说明kube-controller-manager没有成功给节点分配网段。
检查kube-controller-manager日志
查看集群中kube-controller-manager的运行日志,排查是否存在PodCIDR分配失败的报错,比如CIDR地址池耗尽、权限不足等问题。排查节点内存压力
查看节点当前内存使用情况,确认是否存在持续内存过载:# 在节点本地执行 free -h # 或者通过kubectl远程查看 kubectl top node gke-iagree-cluster-1-main-pool-5632d628-wgzr检查容器运行时状态
在节点上确认docker和runc服务是否正常:systemctl status docker systemctl status runc # 查看docker日志 journalctl -u docker -f
手动修复PodCIDR并重启kubelet
如果节点PodCIDR为空,先手动分配集群可用的网段(替换成你集群CIDR池中的有效网段):kubectl patch node gke-iagree-cluster-1-main-pool-5632d628-wgzr -p '{"spec":{"podCIDR":"10.244.XX.XX/24"}}'然后重启节点上的kubelet服务:
systemctl restart kubelet缓解节点内存压力
- 检查节点上所有Pod的资源请求和限制配置,清理或调整超额占用内存的Pod;
- 清理节点上无用的容器、镜像和缓存:
docker system prune -af - 如果是节点硬件规格不足,考虑升级节点配置,或者调整集群调度策略,避免高内存Pod集中调度到同一节点。
修复容器运行时稳定性
- 升级runc和docker到与Kubernetes版本兼容的稳定版本,避免已知的OOM或进程阻塞bug;
- 给dockerd配置合理的内存限制,编辑
/etc/docker/daemon.json添加内存参数(根据节点实际情况调整值):
保存后重启docker服务:{ "memory": "4g", "exec-opts": ["native.cgroupdriver=systemd"], "storage-driver": "overlay2" }systemctl restart docker
配置节点OOM监控与自动恢复
搭建Prometheus+Alertmanager监控节点内存使用率,设置阈值告警;同时可以配置Pod驱逐策略,当节点内存不足时自动驱逐低优先级Pod,避免OOM导致节点崩溃。
内容的提问来源于stack exchange,提问作者PaulMB

