告别NotReadyK8s v1.23集群网络插件部署全攻略当你终于完成Kubernetes v1.23集群的基础安装却在最后一步遭遇网络插件部署失败时那种功亏一篑的挫败感我深有体会。节点状态顽固地显示NotReady就像一扇即将打开的门被突然卡住。本文将带你系统排查Calico/Flannel部署失败的六大症结并提供五种经过实战验证的解决方案。1. 网络插件部署失败的深度诊断在master节点执行kubectl get nodes看到NotReady状态时先别急着重装。通过以下命令组合能快速定位问题根源# 检查节点详细状态 kubectl describe node node-name # 查看网络插件Pod日志 kubectl logs -n kube-system pod-name -c container-name # 检查网络插件Pod状态 kubectl get pods -n kube-system -o wide常见故障模式通常呈现以下特征镜像拉取失败的症状Pod状态持续显示ImagePullBackOff日志中出现failed to pull image错误国内环境直接使用国外镜像仓库时尤为常见网络策略冲突的表现Pod状态为Running但节点仍NotReady跨节点Pod无法互相ping通日志中出现network plugin not ready提示资源配置不足的迹象Pod频繁重启或被OOMKilledkubectl describe显示CPU/内存不足工作节点配置低于2核4GB时容易发生2. 国内环境加速部署方案2.1 使用国内镜像源替换对于Calico部署修改官方yaml中的镜像地址# 原镜像地址 image: docker.io/calico/cni:v3.26.0 # 替换为 image: registry.aliyuncs.com/google_containers/calico-cni:v3.26.0Flannel的快速部署方案# 使用阿里云镜像源 curl -sSL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | \ sed s/quay.io\/coreos/registry.aliyuncs.com\/google_containers/g | \ kubectl apply -f -2.2 离线安装包方案当环境完全无法连接外网时可提前下载所需组件在可联网机器下载资源包# Calico资源包 wget https://github.com/projectcalico/calico/releases/download/v3.26.0/release-v3.26.0.tgz # Flannel资源包 wget https://github.com/flannel-io/flannel/releases/download/v0.22.0/flannel-v0.22.0-linux-amd64.tar.gz传输到集群节点后手动加载镜像docker load -i calico-node.tar docker tag local-image:tag official-image:tag3. 配置文件调优实战3.1 IP地址池配置Calico的CIDR配置需要与kubeadm初始化参数一致# custom-resources.yaml 关键片段 spec: calicoNetwork: ipPools: - cidr: 192.168.0.0/16 natOutgoing: trueFlannel的net-conf.json配置{ Network: 10.244.0.0/16, Backend: { Type: vxlan } }3.2 资源限制调整对于资源有限的测试环境可降低网络插件资源需求# Calico容器资源限制示例 resources: requests: cpu: 100m memory: 100Mi limits: cpu: 500m memory: 500Mi4. 高级排错技巧当常规方法无效时这些命令能提供更深层信息# 检查IPVS规则 ipvsadm -Ln # 追踪网络包路径 traceroute 目标PodIP # 检查网络接口 ip addr show典型问题处理流程确认网络插件Pod正常运行验证节点间网络连通性检查IP分配是否冲突排查防火墙/安全组规则验证内核模块加载情况5. 替代方案与灾备措施当主要网络插件持续失败时可考虑以下备选方案方案对比表特性CalicoFlannelCilium网络策略支持有限支持完整支持性能高中等极高配置复杂度中等简单复杂资源消耗较高低中等临时恢复方案# 使用hostNetwork模式临时恢复 kubectl patch deployment my-app -p {spec:{template:{spec:{hostNetwork:true}}}}记得在最终解决问题后移除临时方案以确保集群网络安全隔离。