告别NotReady:K8s 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频繁重启或被OOMKilled
kubectl 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:tag
3. 配置文件调优实战
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: "500Mi"4. 高级排错技巧
当常规方法无效时,这些命令能提供更深层信息:
# 检查IPVS规则 ipvsadm -Ln # 追踪网络包路径 traceroute <目标PodIP> # 检查网络接口 ip addr show典型问题处理流程:
- 确认网络插件Pod正常运行
- 验证节点间网络连通性
- 检查IP分配是否冲突
- 排查防火墙/安全组规则
- 验证内核模块加载情况
5. 替代方案与灾备措施
当主要网络插件持续失败时,可考虑以下备选方案:
方案对比表:
| 特性 | Calico | Flannel | Cilium |
|---|---|---|---|
| 网络策略 | 支持 | 有限支持 | 完整支持 |
| 性能 | 高 | 中等 | 极高 |
| 配置复杂度 | 中等 | 简单 | 复杂 |
| 资源消耗 | 较高 | 低 | 中等 |
临时恢复方案:
# 使用hostNetwork模式临时恢复 kubectl patch deployment my-app -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'记得在最终解决问题后移除临时方案,以确保集群网络安全隔离。