原因
节点状态显示为 NotReady,其核心原因通常是 CNI(容器网络接口)配置未初始化。
具体的报错信息可能如下:
container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized。
简单来说,这意味着你的 K8S 集群缺少必要的网络插件,导致节点无法完成网络初始化并进入就绪状态。没有网络插件,Pod 之间就无法通信,集群自然无法正常工作。
解决方案(完整可操作步骤)
1. 先确认集群中未部署任何网络插件
首先,我们需要验证问题是否确实源于网络插件的缺失。可以通过以下命令检查 kube-system 命名空间下是否存在主流的网络插件 Pod:
kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium|weave'
如果这条命令没有任何输出,那么就确认了集群中确实没有部署 CNI 网络插件,这正是导致节点 NotReady 的根源。
2. 部署主流的 Calico 网络插件(推荐)
Calico 是 Kubernetes 生态中最常用、功能强大的网络插件之一,其性能与安全性表现优异,兼容性也很好。推荐使用以下命令进行一键部署:
# 部署 Calico 网络插件(适配 K8S 1.24+ 版本)
kubectl apply -f https://docs.projectcalico.org/v3.28/manifests/calico.yaml
# 验证 Calico Pod 是否启动
kubectl get pods -n kube-system -l k8s-app=calico-node
正常情况下,所有 calico-node Pod 会在 1-2 分钟内启动并进入 Running 状态,这表明 CNI插件 已成功部署。
3. 备选方案:部署 Flannel 网络插件
如果你在部署 Calico 时遇到问题,或者需要一个更轻量级的方案,可以尝试部署 Flannel。Flannel 配置简单,是许多入门级集群的选择。
# 先删除已部署的 Calico(如果之前部署过)
kubectl delete -f https://docs.projectcalico.org/v3.28/manifests/calico.yaml
# 部署 Flannel 插件
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.25.0/Documentation/kube-flannel.yml
# 验证 Flannel Pod 状态
kubectl get pods -n kube-system -l app=flannel
4. 验证节点状态恢复
部署完网络插件后,请等待 2-3 分钟,让插件完成初始化并配置节点网络。之后,执行以下关键命令检查节点状态:
kubectl get nodes
如果一切顺利,所有节点的 STATUS 都应该从 NotReady 变为 Ready。这是判断问题是否解决的最直接标志。
5. 特殊情况:如果网络插件 Pod 启动失败
偶尔,网络插件 Pod 本身可能因为系统环境问题而无法启动。如果遇到这种情况,请按以下步骤排查:
-
检查网络连通性:网络插件需要从镜像仓库拉取镜像,并需要节点间网络互通。
# 检查节点是否能访问外网(拉取镜像需要)
ping -c 2 registry.cn-hangzhou.aliyuncs.com
# 检查节点间网络互通(在 master 节点 ping node 节点)
ping -c 2 192.168.0.xxx # 请替换为你的 node 节点 IP
-
检查防火墙和 SELinux:它们可能会阻断 Pod 网络所需的端口和流量。
# 临时关闭防火墙(生产环境请谨慎配置安全组或防火墙规则)
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭 SELinux(使其处于 Permissive 模式)
setenforce 0
完成这些检查并调整后,再次观察网络插件 Pod 的状态。
总结
遇到 K8S集群 节点 NotReady 时,可以遵循以下思路:
- 核心问题定位:绝大多数情况下,原因是 K8S 集群未部署 CNI 网络插件,导致节点网络初始化失败。
- 解决关键步骤:部署如 Calico 或 Flannel 等主流 CNI 插件,这是 Kubernetes 集群能够正常运行的基础组件,负责 Pod 的网络通信。
- 验证标准:成功的标志有两个:一是部署的网络插件(Calico/Flannel)的所有 Pod 处于
Running 状态;二是执行 kubectl get nodes 命令显示所有节点状态为 Ready。
在云原生技术实践中,理解和正确配置容器网络是至关重要的一环。如果你在部署过程中遇到其他复杂问题,欢迎在 云栈社区 的技术论坛中与其他开发者交流探讨。