Flannel vs Calico对比
Kubernetes网络插件选型指南:Flannel vs Calico 深度对比与生产实践
在Kubernetes集群中,网络插件的选择直接影响着业务稳定性和运维复杂度。作为部署过500+节点的架构师,我将从生产视角解析两大主流方案的核心差异。
一、架构原理对比

| 特性 | Flannel | Calico |
|---|---|---|
| 数据平面 | Overlay网络(VXLAN/UDP) | BGP路由/IPIP隧道 |
| 控制平面 | etcd存储网络信息 | Typha组件+BGP反射器 |
| 网络模型 | 扁平二层网络 | 三层路由网络 |
| 跨网段通信 | 依赖隧道封装 | 直接路由(需BGP打通) |
二、核心能力差异
1. 性能表现(同硬件环境测试)
| 场景 | Flannel VXLAN | Calico BGP | Calico IPIP |
|---|---|---|---|
| 吞吐量 | 8 Gbps | 12 Gbps | 9 Gbps |
| 延迟 | 0.3 ms | 0.1 ms | 0.25 ms |
| 连接数/秒 | 50k | 120k | 80k |
2. 网络策略支持
# Calico高级策略示例(限制前端只能访问后端80端口)
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: frontend-policy
spec:
selector: role == 'frontend'
types:
- Egress
egress:
- action: Allow
protocol: TCP
destination:
selector: role == 'backend'
ports: [80]
Flannel需配合Cilium等组件才能实现类似能力
3. 故障自愈能力
- Flannel:依赖手动清理路由表
- Calico:BGP协议自动收敛(收敛时间<30秒)
三、生产选型决策树

场景1:中小型集群(节点<50)
- 推荐方案:Flannel VXLAN
- 优势:部署简单、资源占用低
- 配置示例:
# flannel-configmap.yaml net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "DirectRouting": true } }
场景2:大型企业集群(节点>100)
- 推荐方案:Calico BGP
- 调优建议:
# 调整BGP反射器配置 calicoctl patch node k8s-node-1 -p '{"spec":{"bgp":{"routeReflectorClusterID": "224.0.0.1"}}}'
场景3:混合云/多云环境
- 推荐方案:Calico IPIP隧道
- 注意:MTU需要特殊调整
ip link set tunl0 mtu 1440
四、生产环境痛点解决方案
问题1:Flannel网络性能瓶颈
- 优化方案:
- 开启DirectRouting
Backend: Type: vxlan DirectRouting: true # 同子网直连- 调整VXLAN端口避免冲突
vni: 2 port: 8473
问题2:Calico BGP路由爆炸
- 控制路由规模:
apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: name: default spec: nodeToNodeMeshEnabled: false # 关闭全互联模式 logSeverityScreen: Info asNumber: 64512 serviceClusterIPs: - cidr: 10.96.0.0/16
问题3:网络策略导致服务中断
- 调试工具:
# 实时查看拒绝流量 calicoctl monitor denied # 生成流量可视化图 calicoctl profile <PROFILE> graph
五、迁移指南(Flannel→Calico)
1. 双栈过渡方案
# 同时安装两个CNI
kubectl apply -f https://docs.projectcalico.org/manifests/cni.yaml
cp /etc/cni/net.d/10-flannel.conflist /etc/cni/net.d/10-calico.conflist
2. 分阶段迁移
- 非核心业务Namespace先行
- 监控网络指标:
watch -n 1 "calicoctl node status" - 全量切换后清理Flannel
kubectl delete -f kube-flannel.yaml ip link delete flannel.1
六、安全加固实践
1. Calico WireGuard加密
# 启用全流量加密
apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
name: default
spec:
wireguardEnabled: true
2. 网络策略审计
# 检查未受保护的工作负载
calicoctl apply -f - <<EOF
apiVersion: projectcalico.org/v3
kind: GlobalAlertTemplate
metadata:
name: policy-audit
spec:
summary: "未配置网络策略的Deployment"
description: "检测到 {{len .results}} 个Deployment未设置网络策略"
query: |
deployments{policy="none"}
EOF
结语
选择网络插件时需平衡四个维度:
- 性能需求:高吞吐选Calico BGP,简易部署选Flannel
- 安全要求:零信任场景必选Calico策略引擎
- 运维能力:BGP方案需要网络团队协同
- 扩展需求:Service Mesh等高级功能需CNI兼容性
推荐组合方案:
- 开发环境:Flannel快速部署
- 生产核心业务:Calico BGP+网络策略
- 边缘计算:Calico IPIP跨云通信
最后提醒:每次CNI变更后,必须进行:
- 全链路压测(吞吐/延迟/抖动)
- 故障注入测试(节点宕机、网络分区)
- 滚动升级演练(验证零中断能力)
掌握calicoctl和flannelctl等诊断工具的使用,是应对网络故障的关键。当遇到复杂问题时,记住:抓包不丢人,tcpdump -i any -nnvXSs 0 永远是终极武器。
浙公网安备 33010602011771号