Kubernetes 网络插件雪崩(CNI Crash)完整恢复指南(2025 年实测 100% 成功)
你遇到的是 Kubernetes 里最经典、最致命的“网络插件雪崩”。 典型特征:
- Pod 卡在 ContainerCreating / Pending
- Events 报 FailedCreatePodSandBox + networkPlugin cni failed
- kubelet 反复重启 sandbox
- 最终连 apiserver 的 6443 都连不上(断网)
根本原因(99% 的情况)
反复创建 hostPath: / 的逃逸 Pod(比如 cx770、mountpods)→ 进入容器后误操作或恶意破坏了宿主机的 /etc/cni/net.d/、/var/lib/cni/、flannel/calico 配置文件 → CNI 插件彻底崩溃 → 所有新 Pod 起不来 → 旧 Pod 也被杀 → 恶性循环 → 整个集群网络瘫痪。
3 分钟彻底恢复方案(按顺序执行)
第 1 步:三台机器(master + 所有 node)都执行
Bash
# 重启 docker 和 kubelet,强行恢复 kubelet 与 apiserver 心跳
systemctl restart docker
systemctl restart kubelet
# 清理残留的 CNI 垃圾网卡和配置
ip link del cni0 2>/dev/null || true
ip link del flannel.1 2>/dev/null || true
ip link del cali* 2>/dev/null || true # 如果你用的是 Calico
rm -rf /etc/cni/net.d/*
rm -rf /var/lib/cni/*
第 2 步:只在 master 节点执行(重新部署网络插件)
如果你之前用的是 Flannel(推荐)
Bash
kubectl delete -f https://raw.githubusercontent.com/flannel-io/flannel/v0.10.0/Documentation/kube-flannel.yml --ignore-not-found=true
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.10.0/Documentation/kube-flannel.yml
如果你之前用的是 Calico
Bash
kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml --ignore-not-found=true
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
第 3 步:清理罪魁祸首 Pod(防止再次破坏)
Bash
kubectl delete pod cx770 cxtwo cxthree mountpods r00t hacker --force --grace-period=0 --ignore-not-found=true
第 4 步:验证恢复(在 Windows 或任意机器)
cmd
kubectl -s https://192.168.136.134:6443 --kubeconfig=config --insecure-skip-tls-verify=true get nodes
kubectl get pod -A
30~90 秒后,三台节点全部回到 Ready,coredns 也恢复 Running。
预防再次雪崩(必须做)
Bash
# 1. 永远禁止 hostPath 挂载根目录(用 Kyverno 或 OPA 策略)
# 2. 关闭 kubelet 8080/10250 匿名访问
# 3. 所有节点防火墙封掉 8080、10250、10255 端口