当前位置: 首页 > news >正文

从Flannel迁移到Calico:在Ubuntu 24.04上为K8s v1.28更换网络插件的完整避坑指南

从Flannel迁移到Calico:在Ubuntu 24.04上为K8s v1.28更换网络插件的完整避坑指南

当Kubernetes集群规模扩大或安全需求提升时,许多团队会面临网络插件的选择困境。Flannel以其简单易用著称,但当需要更精细的网络策略、BGP支持或高性能网络时,Calico往往成为专业运维团队的首选。本文将带你深入理解两种插件的核心差异,并提供从Flannel平滑迁移到Calico的完整路线图。

1. 迁移前的关键决策与准备

1.1 Flannel与Calico的架构对比

在拆除旧网络架构前,必须理解两者的根本区别。Flannel采用简单的overlay网络模型,而Calico提供的是纯三层网络方案:

特性FlannelCalico
网络模型Overlay (VXLAN/主机网关)三层路由 (BGP/VXLAN/IPIP)
策略支持仅基础网络隔离细粒度网络策略(NetworkPolicy)
性能损耗较高(封装开销)较低(原生路由)
适用场景中小规模集群大规模/安全敏感型集群
地址分配全局分配每节点独立CIDR块

关键发现:当集群节点超过50个或需要跨机房组网时,Calico的BGP路由优势会显著降低网络延迟。

1.2 环境预检清单

执行以下命令确认当前环境状态:

# 检查现有Flannel组件 kubectl get daemonset -n kube-system -l app=flannel # 记录当前Pod IP分配情况 kubectl get pods -o wide --all-namespaces > flannel_ip_record.txt # 验证网络连通性 kubectl run net-test --image=alpine --rm -it -- ping 8.8.8.8

必须备份的关键数据

  • /etc/cni/net.d/目录下的所有CNI配置
  • 所有自定义NetworkPolicy资源
  • kube-proxy的当前配置模式(iptables/ipvs)

注意:迁移过程中会短暂中断集群网络,建议在维护窗口期操作,并确保关键业务有容灾方案。

2. 安全移除Flannel的实操步骤

2.1 优雅卸载Flannel组件

错误的卸载方式会导致"僵尸"IP分配问题,以下是经过验证的清理流程:

# 1. 先删除DaemonSet避免自动恢复 kubectl delete daemonset kube-flannel-ds -n kube-system # 2. 清理CNI接口配置 sudo rm -f /etc/cni/net.d/10-flannel.conflist sudo ip link delete cni0 2>/dev/null # 3. 检查残留进程 ps aux | grep -E 'flanneld|kube-flannel'

常见陷阱:直接删除Flannel命名空间会导致某些节点网络僵死。应先缩容DaemonSet至0副本:

kubectl scale daemonset kube-flannel-ds -n kube-system --replicas=0

2.2 处理残留网络配置

Flannel创建的iptables规则和路由表项需要手动清理:

# 清除Flannel相关的iptables规则 sudo iptables-save | grep -v FLANNEL | sudo iptables-restore # 删除路由表项(示例为AWS环境) route -n | grep flannel.1 | awk '{print $1}' | xargs -I {} sudo route del -net {} netmask 255.255.255.0

对于使用VXLAN模式的Flannel,还需清理虚拟网络设备:

sudo ip link delete flannel.1 2>/dev/null

3. Calico的深度定制安装

3.1 版本匹配矩阵

Calico v3.28与Kubernetes版本的兼容性常被忽视,以下是关键匹配关系:

Calico版本支持的K8s版本关键特性差异
v3.251.24-1.26基础BGP支持
v3.261.25-1.27增强Windows节点支持
v3.281.27-1.29服务网格集成、eBPF数据平面

推荐使用Operator安装方式,它提供声明式配置和自动升级路径:

# 下载Operator清单 curl -L https://github.com/projectcalico/calico/releases/download/v3.28.0/tigera-operator.yaml -o tigera-operator.yaml # 部署Operator kubectl create -f tigera-operator.yaml

3.2 定制IP池配置

修改custom-resources.yaml时,这些参数直接影响网络性能:

apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - name: ipv4-pool cidr: 10.244.0.0/16 blockSize: 24 encapsulation: VXLANCrossSubnet natOutgoing: true nodeSelector: all() nodeAddressAutodetectionV4: interface: "ens*|eth*" # 匹配多网卡环境

性能调优建议

  • 生产环境建议blockSize设为26(每个节点62个IP)
  • 同机房节点使用IPIP封装,跨机房用VXLAN
  • 启用natOutgoing使Pod能访问外部网络

4. 迁移后的验证与排错

4.1 健康检查三部曲

  1. 组件状态检查
watch kubectl get pods -n calico-system

正常状态下应看到:

  • calico-node-* (每个节点1个)
  • calico-kube-controllers-* (1个副本)
  • calico-typha-* (3个副本用于大规模集群)
  1. BGP对等验证(如果启用BGP):
kubectl exec -ti <calico-node-pod> -n calico-system -- birdcl show protocols

输出应显示Established状态的对等连接。

  1. 端到端测试
kubectl run test-nginx --image=nginx kubectl create poddisruptionbudget test-pdb --selector=run=test-nginx --max-unavailable=1 kubectl exec test-nginx -- curl -I http://www.google.com

4.2 典型故障处理手册

案例一:Node持续NotReady症状:calico-nodePod报错"BIRD is not ready" 解决方案:

# 检查网络接口匹配规则 kubectl edit installation default -n calico-system # 在spec.calicoNetwork.nodeAddressAutodetectionV4中添加: interface: "ens.*|eth.*" # 重启Calico节点 kubectl delete pod -n calico-system -l k8s-app=calico-node

案例二:DNS解析失败症状:Pod内无法解析集群服务名称 快速修复:

# 检查CoreDNS Pod是否被分配了IP kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide # 临时解决方案(如需): kubectl edit configmap/coredns -n kube-system # 在Corefile中添加: forward . /etc/resolv.conf { prefer_udp }

案例三:网络策略不生效调试步骤:

# 查看Felix日志(每个节点上) kubectl logs -n calico-system <calico-node-pod> -c felix # 检查全局网络策略 calicoctl get globalnetworkpolicy -o yaml # 启用策略日志(临时调试) calicoctl patch globalnetworkpolicy <policy-name> --patch='{"spec": {"logSeverityScreen": "Info"}}'

5. 高级配置场景

5.1 BGP与网络硬件集成

在企业级部署中,Calico可以通过BGP协议与物理网络设备交互。典型拓扑配置示例:

apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: edge-router-1 spec: peerIP: 192.168.0.254 asNumber: 64512 nodeSelector: has(edge-router)

路由优化技巧

  • 使用Route Reflector模式避免全网状连接
  • 通过communities属性控制路由传播范围
  • 对关键业务Pod添加nodeAffinity确保部署在特定节点

5.2 网络策略实战模板

Calico的网络策略比Kubernetes原生策略更强大,以下是生产级示例:

apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: frontend-to-db spec: selector: role == 'frontend' types: - Egress egress: - action: Allow protocol: TCP destination: selector: role == 'database' ports: [5432] - action: Deny destination: nets: [0.0.0.0/0]

策略编写原则

  1. 先定义默认拒绝所有流量的全局策略
  2. 按最小权限原则逐步开放必要通信
  3. 使用命名端口(port name)而非数字端口
  4. 对生产环境策略添加description注解

迁移到Calico不仅是网络组件的更换,更是集群网络架构的升级。在完成基础迁移后,建议逐步探索这些高级特性:

  • 基于eBPF的数据平面加速
  • 服务网格集成(如Istio)
  • 网络流量可视化(Calico Enterprise)
  • 安全审计日志与合规检查
http://www.jsqmd.com/news/561055/

相关文章:

  • GPS定位背后的数学:卫星位置解算中的10个关键公式与迭代算法详解
  • 微信读书助手wereader:打造你的专属数字阅读管理系统
  • 手把手教你用AT命令搞定MQTT连接与发布(附阿里云物联网平台日志排查法)
  • Unity基础:GameObject游戏对象的创建与管理
  • 实战:LLM的网页工具箱:Fetch与GeneralSearch的协同作战
  • 手把手教你用Python模拟实现信号量、管程和互斥锁(附完整代码)
  • 开源工具yfinance数据获取技术指南:从行业痛点到实战解决方案
  • 3分钟搞定AI大模型下载:text-generation-webui智能下载系统全解析
  • LabelImg图像处理优化:从视觉增强到高效标注的全流程解决方案
  • 10G以太网Subsystem避坑指南:复位敏感性与时钟配置的实战经验
  • EcomGPT-7B电商大模型Python爬虫实战:竞品数据智能采集与分析
  • 基于SolidWorks宏的草图点坐标批量提取与自动化处理
  • 3分钟掌握Charticulator:免费开源的可视化图表构建终极指南
  • 企业办公环境下的麒麟系统安全加固:基于Kylin V10 SP1的账户、外设与联网管控实战
  • 别再手动敲命令了!宝塔面板Docker管理器一键部署网心云全记录
  • 从原理到代码:一文搞懂Cholesky分解在MATLAB中的高效实现
  • SadTalker实战指南:从环境搭建到性能优化的全方位解决方案
  • 别只盯着电路!电刺激器电源设计的核心:如何根据人体阻抗精准计算电压电流需求
  • 别再只改版本号了!深入CreepJS源码,看它如何识破伪造的Chromium 106
  • 东莞seo引擎优化和网站推广有什么区别
  • 正点原子lwIP实战指南——从FreeRTOS移植到网络应用开发
  • 如何快速解除Cursor限制:免费工具一键重置设备标识
  • 揭秘量化因子评估:从理论到实践的投资策略优化指南
  • RV1106 LVGL9.2.3 Ffmpeg组件视频播放实战:从编译到UI集成的完整指南
  • 从Vim模式切换,到国产化论述:一份给非CS专业同学的Linux应试“生存指南”
  • Ollama部署internlm2-chat-1.8b:支持多模态扩展(未来兼容)的技术路线前瞻
  • 在PC上玩Switch游戏:Ryujinx模拟器完全指南
  • 3大场景轻松解决资源下载难题:res-downloader让网络内容获取效率提升3倍
  • Wechaty Puppet WeChat:微信网页协议自动化解决方案的技术深度解析
  • Realistic Vision V5.1 虚拟摄影棚实战:基于STM32F103C8T6的硬件触发联动方案