728 字
2 分钟
为什么集群需要 Overlay 网络
在 Kubernetes 和 Docker Swarm 等容器编排平台中,Overlay 网络是连接多个主机上容器的关键技术。为什么需要 Overlay 网络?它解决了什么问题?
一、容器网络的基础问题
1.1 单机容器网络
flowchart LR
subgraph 主机 A
C1[容器 1]
C2[容器 2]
N[Network Namespace]
end
C1 <--> C2
单机上,容器通过 Linux Bridge 或 veth 对通信。
1.2 跨主机通信的需求
flowchart LR
subgraph 主机 1
C1[容器 1]
end
subgraph 主机 2
C2[容器 2]
end
C1 -->|通信| C2
Note: 容器 1 如何找到容器 2?
问题:
- 多个主机上的容器 IP 可能冲突
- 主机网络和容器网络需要隔离
- 动态扩缩容需要网络自动调整
二、Overlay 网络的解决方案
2.1 什么是 Overlay 网络?
flowchart LR
subgraph Underlay (物理网络)
H1[主机 1]
H2[主机 2]
end
subgraph Overlay (虚拟网络)
C1[容器 1]
C2[容器 2]
end
C1 <-->|Overlay| C2
C1 -->|封装| H1
H1 -->|解封| H2
H2 -->|封装| C2
Overlay 网络:在物理网络之上构建的虚拟网络。
2.2 Overlay 的优势
| 优势 | 说明 |
|---|---|
| IP 隔离 | 容器使用独立 IP 段,不与物理网络冲突 |
| 透明迁移 | 容器可以在主机间迁移而 IP 不变 |
| 规模扩展 | 支持大规模容器集群 |
| 网络自动化 | 容器网络自动化管理 |
三、VXLAN:主流的 Overlay 协议
3.1 VXLAN 原理
flowchart LR
subgraph 原始数据包
E[以太网头]
I[IP 头]
U[UDP 头]
V[VXLAN 头]
D[原始数据]
end
subgraph 封装后
OE[外部以太网头]
OI[外部 IP 头]
OU[外部 UDP 头]
OV[VXLAN 头]
E2[以太网头]
I2[IP 头]
D2[原始数据]
end
E --> OV
I --> OV
U --> OV
V --> OV
D --> OV
OV --> OE
OV --> OI
OV --> OU
OV --> E2
OV --> I2
OV --> D2
VXLAN(Virtual eXtensible LAN):
- 使用 UDP 封装
- 24 位 VNI,支持 1600 万个虚拟网络
- 通过 VTEP(VXLAN Tunnel End Point)封装/解封
3.2 VXLAN 的工作流程
sequenceDiagram
participant C1 as 容器 1
participant V1 as VTEP 1
participant P as 物理网络
participant V2 as VTEP 2
participant C2 as 容器 2
C1->>V1: 发送数据包(目标容器 2)
V1->>V1: 添加 VXLAN 头(VNI=100)
V1->>P: 封装为 UDP 包(目标主机 2 IP)
P->>V2: 路由到目标主机
V2->>V2: 移除 VXLAN 头
V2->>C2: 传递原始数据包
四、Kubernetes 中的 Overlay 网络
4.1 CNI 插件的角色
flowchart LR
K[Kubernetes] --> CNI[CNI 插件]
CNI --> F[Flannel]
CNI --> C[Cilium]
CNI --> CB[Calico]
F -->|使用| VXV[VXLAN]
C -->|使用| VXE[VXLAN/eBPF]
CB -->|使用| IP[IPIP/BGP]
4.2 Flannel 的实现
# Flannel 配置文件{ "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" }}| 模式 | 说明 |
|---|---|
| VXLAN | 使用 VXLAN 封装,推荐用于生产 |
| host-gw | 直接路由,性能更好,需要二层连通 |
| UDP | 性能最差,已弃用 |
4.3 Pod 网络流程
sequenceDiagram
participant P1 as Pod A
participant N as Node 1 CNI
participant V as VTEP
participant P2 as Pod B
participant N2 as Node 2 CNI
P1->>N: 发送数据包(Pod B IP)
N->>V: 查询路由表,找到 Pod B 在 Node 2
V->>V: VXLAN 封装
V->>N2: 通过物理网络发送到 Node 2
N2->>P2: 解封装,传递到 Pod B
五、Overlay vs Underlay
5.1 对比
| 特性 | Underlay | Overlay |
|---|---|---|
| 网络类型 | 物理网络 | 虚拟网络 |
| IP 分配 | DHCP/静态 | 容器网络插件 |
| 隔离性 | 差 | 好 |
| 灵活性 | 低 | 高 |
| 性能 | 高 | 有额外开销 |
| 复杂度 | 低 | 高 |
5.2 何时使用 Overlay
| 场景 | 推荐 |
|---|---|
| 多主机容器集群 | 必须使用 Overlay |
| 大规模容器网络 | Overlay(VXLAN) |
| 容器需要独立 IP 段 | Overlay |
| 高性能应用 | Underlay 或 host-gw |
六、性能考量
6.1 Overlay 的开销
flowchart LR
subgraph 无封装
D[数据]
end
subgraph VXLAN 封装
E[Ethernet]
I[IP]
U[UDP]
V[VXLAN]
D2[数据]
end
D -->|原始| O1[约 0% 开销]
E -->|封装| O2[约 5-10% CPU 开销]
VXLAN 开销:
- CPU:封装/解封需要额外处理
- 带宽:额外的头部开销(约 50 字节/包)
- 延迟:略有增加
6.2 优化建议
# 1. 使用网卡 offloadethtool -K eth0 tx-gso-robust on
# 2. 调整 UDP 封装端口# 使用较大的 RSS 队列七、总结
7.1 为什么需要 Overlay 网络
| 原因 | 说明 |
|---|---|
| IP 隔离 | 容器网络与物理网络隔离 |
| 跨主机通信 | 容器在不同主机上仍能通信 |
| 可扩展性 | 支持大规模集群 |
| 自动化 | 网络配置自动化管理 |
7.2 VXLAN 的特点
| 特性 | 说明 |
|---|---|
| VNI | 24 位,支持 1600 万虚拟网络 |
| 封装 | UDP 封装,穿越物理网络 |
| 兼容性 | 兼容现有物理网络设备 |
核心观点:Overlay 网络是云原生时代的必然选择,它让容器网络与物理网络解耦,实现了容器集群的灵活性和可扩展性。
参考资料
- VXLAN RFC 7348 — VXLAN 标准
- Kubernetes CNI — CNI 插件
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时
相关文章 智能推荐
1
为什么 Kubernetes 要替换 Docker
技术科普 深入解析 Kubernetes 宣布弃用 Docker 的原因,containerd 和 CRI 的角色,以及容器运行时的演进。
2
为什么 Docker 使用分层镜像
技术科普 深入解析 Docker 镜像分层设计的原理,理解 UnionFS、OverlayFS 如何实现高效的镜像存储与分发。
3
什么是容器?
技术科普 容器技术深度解析——从容器概念、镜像结构、容器网络、存储、安全,全面掌握容器技术的本质与实践。
4
为什么 MAC 地址不需要全球唯一
技术科普 深入解析 MAC 地址的作用范围,为什么只需要在局域网内唯一,以及与 IP 地址的区别。
5
为什么 CDN 能加速访问
技术科普 深入解析 CDN 加速的核心原理,理解边缘缓存、智能解析与就近接入的技术实现。






