Kubernetes 集群网络插件迁移:从 Flannel 到 Calico 实战总结

一、知识总结

本文完整记录了 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 集群的网络管理打下坚实基础。

相关推荐
陈陈CHENCHEN17 小时前
【Kubernetes】纯 IPv6 K8s 集群访问外部 IPv4 服务
云原生·容器·kubernetes
troy12818 小时前
如何在谷歌云(Google Cloud)上部署 Kubernetes 集群
云原生·容器·kubernetes
xiaoligangting18 小时前
太原岗亭款式齐全
云原生
程序员清风1 天前
Docker、Nginx 与 Kubernetes 部署 AI 后端服务
nginx·docker·kubernetes
Zhu7581 天前
离线二进制部署-Kubernetes-v1.36.4
容器·贪心算法·kubernetes
程序猿阿越1 天前
containerd如何拉取镜像
后端·kubernetes·源码阅读
Elastic 中国社区官方博客1 天前
Kubernetes attributes processor v1:它对 EDOT Collector 意味着什么
java·大数据·elasticsearch·搜索引擎·贪心算法·kubernetes·全文检索
分布式存储与RustFS1 天前
升级 RustFS 二进制不停机:一条一条换,留一条退路
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
xiaoligangting2 天前
太原防火岗亭
云原生
bllovepigpig2 天前
操作系统个人学习笔记(四):K8s基础
笔记·学习·kubernetes