一、知识总结
本文完整记录了 Kubernetes 集群将网络插件从 Flannel 迁移到 Calico 的全过程,核心思路是:下载 Calico 部署文件 → 镜像本地化(上传 Harbor)→ 修改 YAML 配置 → 删除旧插件 Flannel → 启用 Calico → 验证网络连通性。整个流程围绕「先准备、后切换、再验证」的原则展开,确保集群网络平滑过渡。
二、核心步骤回顾
1. 下载 Calico 部署文件
首先从官方仓库下载 Calico v3.32.2 的部署 YAML 文件,这是后续所有操作的基础。官方建议将所有主机的内存调整为 4G,以保证 Calico 组件稳定运行。
bash
curl https://raw.githubusercontent.com/projectcalico/calico/v3.32.2/manifests/calico-typha.yaml -o calico.yaml
2. 镜像本地化(上传 Harbor)
Calico 部署涉及 4 个核心镜像:cni、node、kube-controllers、typha。由于生产环境通常无法直接访问外网,需要先将镜像拉取下来,打上 Harbor 私有仓库的标签后推送上去,实现离线部署。
bash
# 拉取镜像
docker pull quay.io/calico/cni:v3.32.2
docker pull quay.io/calico/node:v3.32.2
docker pull quay.io/calico/kube-controllers:v3.32.2
docker pull quay.io/calico/typha:v3.32.2
打标签并推送
docker tag quay.io/calico/cni:v3.32.2 reg.timinglee.org/calico/cni:v3.32.2
docker push reg.timinglee.org/calico/cni:v3.32.2
操作前需先在 Harbor 中创建 calico 的公开项目,确保各节点都能拉取镜像。
3. 修改 YAML 配置
部署文件需要做三处关键修改:
- 镜像地址 :将
quay.io/calico/前缀替换为本地 Harbor 地址calico/,共 6 处。 - 关闭 IPIP 封装 :将
CALICO_IPV4POOL_IPIP的值改为"Never",使用纯 BGP 模式。 - 指定 Pod 网段 :将
CALICO_IPV4POOL_CIDR设置为"10.244.0.0/16",与原有 Flannel 网段保持一致,避免地址冲突。 - 指定检测网卡 :将
CALICO_AUTODETECTION_METHOD设置为"interface=eth0",确保 Calico 正确识别集群通信网卡。
4. 删除 Flannel 网络插件
切换前必须先清理旧插件,否则两个 CNI 插件会冲突。操作分两步:先删除 Flannel 的资源对象,再清理各节点上的 CNI 配置文件。
bash
# 删除 Flannel 资源
kubectl delete -f kube-flannel.yml
清理各节点 CNI 配置(100、10、20 为节点 IP 尾号)
for id in 100 10 20; do
ssh -l root 172.25.254.$id "rm -rf /etc/cni/net.d/10-flannel.conflist"
done
5. 启用 Calico 并验证
应用新的部署文件后,通过 kubectl get pods 确认所有 Calico 组件处于 Running 状态,包括 calico-node、calico-typha 和 calico-kube-controllers。最后创建一个测试 Pod,验证跨节点网络是否正常。
bash
kubectl apply -f calico.yaml
kubectl run testpod --image nginx:latest
kubectl get pods -o wide
curl 10.244.36.68
测试 Pod 成功获取到 10.244.36.68 的 IP,且通过 curl 能访问到 nginx 默认页面,说明 Calico 网络已正常工作。
三、关键要点与注意事项
- 网段一致性 :Calico 的 Pod 网段必须与 Flannel 保持一致(
10.244.0.0/16),否则切换后已有服务会因 IP 变化而中断。 - 镜像本地化:离线环境务必提前将镜像推送到 Harbor,并同步修改 YAML 中的镜像地址,避免部署时拉取失败。
- 清理旧插件 :删除 Flannel 时不仅要删资源,还要清理各节点的
/etc/cni/net.d/配置文件,防止 CNI 插件冲突。 - IPIP 模式选择 :同网段内建议关闭 IPIP 封装(
Never),减少性能开销;跨网段场景才需要开启。 - 验证不可省略:切换完成后务必创建测试 Pod 并验证跨节点通信,确保网络真正可用。
四、总结
本次迁移的核心价值在于:通过镜像本地化实现离线部署,通过网段一致性和旧插件清理实现平滑切换,通过测试 Pod 验证网络可用性。掌握这套「准备 → 切换 → 验证」的方法论,可以推广到其他 CNI 插件的迁移场景,为 Kubernetes 集群的网络管理打下坚实基础。