Kubernetes 网络
一、单主机网络通信
1. Docker 单机网络
-
Docker网络接口为虚拟接口,内核直接复制数据包转发,不需要经过物理网卡,转发效率高。
-
默认创建
docker0Linux网桥,使用veth pair成对虚拟网卡:一端宿主机网桥,一端容器内部。 -
docker0配置IP与子网,实现主机和容器互通。
-
外部主机访问容器:必须端口映射。
工具:brctl 来自
bridge‑utils包。
2. Containerd 单机网络
原理和Docker类似:创建容器时,在宿主机与容器内部生成一对虚拟veth接口实现连通。
二、跨主机网络通信
跨主机:不同节点上的Pod连通。
- 原生方案:
overlay、macvlan - 主流CNI插件:
Flannel、Calico、Weave
网络模型 Underlay vs Overlay
| 类型 | 说明 | 性能 |
|---|---|---|
| Underlay | 直接使用底层物理网络转发Pod流量,无隧道封装 | 性能高 |
| Overlay | 在宿主机网络之上构建虚拟隧道,数据包封装UDP传输;常用vxlan | 有封装开销,性能略低;可利用现有网络,防止交换机MAC表耗尽 |
主流CNI插件对比
1. Flannel
-
host‑gw(Underlay)
- 原理:节点添加静态路由,目标Pod网段下一跳指向目标节点IP;无报文封装
- 约束:底层网络路由可达;公有云大多不支持
- 性能:高
-
VXLAN(Overlay)
-
原理:跨节点Pod报文封装VXLAN‑UDP包头,宿主机传输,对端解封装
-
约束:只要求节点之间IP互通,公有云通用
-
性能:存在封包解包开销
⚠️Flannel只负责连通,不提供NetworkPolicy网络策略
-
2. Calico
-
BGP模式(Underlay):BGP协议交换Pod路由,无隧道封装,性能最优;需要网络允许BGP发布路由。
-
IPIP / VXLAN(Overlay):底层不支持BGP时启用隧道封装;适配公有云,有性能损耗。
✨核心亮点:原生支持
NetworkPolicyPod防火墙策略。
3. Weave
- 默认Overlay UDP隧道,节点间封装Pod流量,自动发现节点。
- 特性:内置DNS、支持NetworkPolicy、支持加密隧道。
- 缺点:隧道占用CPU,大规模集群性能较差。
4. Macvlan(Underlay)
- 原理:宿主机物理网卡虚拟多张网卡,每个Pod拥有独立MAC,直接接入物理局域网。
- ✅优点:性能极高,延迟低,Pod等同于物理主机。
- ❌限制:
-
父网卡不能开启桥接;
-
同一宿主机Macvlan子接口Pod之间不能直接互通;
-
IP规划复杂,虚拟化环境容易冲突。
使用场景:Pod需要分配局域网独立IP,被局域网物理设备直接访问。
三、容器网络模型 CNM & CNI
解决:容器运行时与网络插件解耦。
1. CNM(Container Network Model)
- Docker提出,libnetwork实现。
- 三大组件:
- Sandbox:容器网络栈;Linux Network Namespace实现,包含网卡、路由、DNS。
- Endpoint:将Sandbox接入网络;典型实现veth‑pair;一个Endpoint只能属于一个网络、一个Sandbox。
- Network:一组Endpoint集合;如Linux Bridge、VLAN。
2. CNI(Container Network Interface)
Google + CoreOS 制定的标准,K8s使用CNI。
两类插件:
- CNI Plugin:配置容器网络(网卡、路由)
- IPAM Plugin:负责Pod IP地址分配管理。
CNM vs CNI对比
| 特点 | CNM | CNI |
|---|---|---|
| 标准实现 | libnetwork | cni规范 |
| 最小单元 | 容器 | Pod |
| 守护进程依赖 | 依赖dockerd | 不依赖守护进程 |
| 跨主机通信 | 依赖外部KV数据库 | 自带KV数据库 |
| 灵活度 | 绑定docker | 插件可以随意替换 |
四、Calico网络详解
Calico隧道模式 IPIP vs VXLAN
| 项目 | IPIP隧道 | VXLAN隧道 |
|---|---|---|
| 隧道类型 | 三层IP隧道 | 二层UDP隧道 |
| 传输载体 | IP协议号4 | UDP 4789端口 |
| 二层MAC | 不带MAC头 | 完整二层帧(MAC) |
| 包头开销 | 较小 | 包头更大,MTU需要调小 |
| 公有云 | 很多云厂商封禁协议4,无法工作 | UDP端口一般放行,兼容性好 |
| 广播组播 | 不支持 | 支持 |
| Calico配置 | ipipMode:Always vxlanMode:Never |
ipipMode:Never vxlanMode:Always |
| 虚拟网卡 | tunl0 | vxlan.calico |
模式选择
- IPIP适合:私有机房,允许IP协议4;只需要单播通信,追求更小包头。⚠️公有云大多拦截IPIP协议。
- VXLAN适合:公有云;底层网络拦截IP协议;需要二层广播;缺点:包头大,MTU调小,性能略低。
Calico工作模式(ipipMode / vxlanMode)
三个取值:Always / Never / CrossSubnet
- Always:所有跨节点Pod全部走隧道封装(Overlay)
- Never:关闭隧道,BGP原生路由Underlay;路由下一跳指向节点物理网卡,性能最优。
- CrossSubnet混合模式:同子网节点通信不走隧道;跨子网节点自动启用隧道封装。
注意:无论隧道开关,Calico始终运行BGP进程,BGP负责同步Pod网段;隧道开关只决定数据包是否封装。