在 Kubernetes 的网络模型中,"Pod 到 Pod 全网互通" 是最基本的设计理念,而想要实现这一点,就必须借助容器网络插件(CNI)。在众多 CNI 插件中,Flannel 是最早一批 Kubernetes 支持的插件之一,以简单、轻量著称,是很多集群网络入门部署的首选。
本文将带你深入理解 Flannel 的网络架构、工作机制、几种后端模式的对比,并结合实际部署案例分析其适用场景与局限。
一、什么是 Flannel?
Flannel 是 CoreOS 推出的一个简单的容器网络解决方案,它的核心目标是为每个 Pod 分配一个独立的子网,实现 Kubernetes 集群中 Pod 的跨主机通信。
它并不直接管理容器网络接口(veth 等),而是负责主机间的 IP 地址管理与数据包转发,依赖 CNI 插件来接入容器网络。
简而言之:
Flannel = 负责 Pod 网段的分配 + 跨主机通信的路由转发
CNI 插件 = 负责给 Pod 配置 IP、网卡、路由等底层接口
二、Flannel 的网络架构
Flannel 的核心组件包括:
- flanneld 守护进程:在每台节点上运行,负责子网分配、维护路由表、转发数据包。
- Etcd 存储中心:保存子网分配和网络配置等元数据。
- 后端插件:决定具体的数据包封装/传输方式,如 vxlan、host-gw 等。
网络拓扑如下:
lua
+-------------------+ +-------------------+
| Node A | | Node B |
| | | |
| flanneld (10.1.1.0/24) | flanneld (10.1.2.0/24)
| | | | | |
| vxlan0 | <=====> | vxlan0 |
| | | | | |
| Pod1 (10.1.1.2) | | Pod2 (10.1.2.3) |
+-------------------+ +-------------------+
每个节点通过 flanneld 申请一个 Pod 子网段,节点之间通过 VXLAN 或其他隧道方式互通。
三、Flannel 支持的后端类型
Flannel 的数据包传输机制由后端(backend)决定,不同后端适用于不同场景:
后端类型 | 特点说明 | 适用场景 |
---|---|---|
vxlan | 默认,使用内核 VXLAN 封装数据包,支持 NAT 穿透 | 公有云、异构网络、跨三层通信 |
host-gw | 直接使用主机路由转发,效率高 | 同一二层网络,节点能互 ping |
udp | 最早期方式,使用 UDP 封装,性能差 | 仅用于测试 |
aws/gce | 使用云厂商自有路由表 | 公有云场景 |
ipsec | 为 VXLAN 封包增加加密能力,提升安全性 | 对安全性有要求的部署 |
推荐:
- 通用部署:使用
vxlan
,部署最广泛 - 高性能同网段集群:使用
host-gw
- 安全合规需求:使用
ipsec
四、Flannel 如何实现 Pod 间通信?
以 VXLAN 模式为例,通信过程如下:
- Pod A 发起请求,目标是 Pod B 的 IP(例如 10.1.2.3)。
- 查询路由表,发现 10.1.2.0/24 属于 Node B。
- Flannel 使用 VXLAN 将数据封装为 UDP 包,发送至 Node B。
- Node B 的 flanneld 解包,交给目标 Pod。
这个过程绕过了 Kubernetes Service 层,直接建立底层 Pod 到 Pod 的 overlay 网络,性能上优于 kube-proxy,但劣于 Cilium、Calico 的 BPF 优化方案。
五、Flannel 实际部署指南
以下是 Flannel 在 Kubernetes 中常见部署方式(以 kubeadm 集群为例):
1. 下载并部署 Flannel 配置
bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
该配置会:
- 安装 flanneld DaemonSet
- 配置 CNI 插件(写入 /etc/cni/net.d/)
- 创建 VXLAN 网络(默认 10.244.0.0/16)
2. 查看网络是否正常
bash
kubectl get pods -n kube-flannel
kubectl get nodes -o wide
验证:
- 每个 Node 上都运行了 flannel pod
- Pod IP 分配正常,不冲突
- 跨主机 ping 通正常
六、Flannel 的优势与局限
✅ 优势
- 部署简单:一键部署,适合新手上手
- 社区成熟:文档多,案例多
- 兼容性强:支持多种 Kubernetes 版本
❌ 局限
问题类型 | 说明 |
---|---|
性能瓶颈 | VXLAN 封包需走内核协议栈,存在额外开销 |
功能不足 | 不支持 NetworkPolicy、缺少加密、监控能力差 |
可观测性不足 | 无法内建可视化网络拓扑 |
维护状态不活跃 | 开发活跃度不如 Cilium/Calico |
七、Flannel 的替代方案?
CNI 插件 | 核心优势 | 场景推荐 |
---|---|---|
Calico | 支持网络策略、性能优秀 | 企业生产环境 |
Cilium | eBPF 驱动,支持可视化、API 防火墙 | 高安全性 + 可观测性 |
Canal | Calico + Flannel 混合方案 | 过渡迁移方案 |
如果你正在进行网络策略、服务网格、零信任、安全治理等方向的建设,推荐尽早迁移到 Cilium 或 Calico。
总结
Flannel 作为 Kubernetes 网络的启蒙插件,以其部署简洁、配置简单的特性,成为早期网络部署的热门选择。然而在现代 Kubernetes 网络安全、性能与可观测性不断增强的背景下,Flannel 的能力已逐渐难以满足复杂需求。