Kubernetes (K8S) 网络原理

CNI插件与Overlay网络集成概述

容器网络接口(CNI)插件是Kubernetes网络的核心组件,负责为Pod配置网络连接。不同的CNI插件采用不同的技术实现Pod网络,其中许多插件支持Overlay网络模式。本页将详细介绍主流CNI插件如何与各种Overlay网络技术集成,帮助您选择最适合自己环境的网络解决方案。

CNI与Overlay网络的关系

CNI(Container Network Interface)是Kubernetes用于配置Pod网络的标准接口,而Overlay网络是一种实现跨节点Pod通信的技术方案。CNI插件通过实现CNI接口,利用Overlay网络技术为Pod提供网络连接。不同CNI插件支持不同的Overlay技术,如VXLAN、Geneve、IPinIP等,各有优缺点。

Flannel与Overlay网络集成

Flannel是最简单、使用最广泛的CNI插件之一,特别适合初学者和小型集群。它支持多种后端网络模式,包括几种Overlay网络技术。

VXLAN模式
Host-GW模式
UDP模式
配置与调优

Flannel VXLAN模式

VXLAN是Flannel的默认后端模式,也是最常用的Overlay网络实现。在这种模式下,Flannel为每个节点创建一个VXLAN设备(通常名为flannel.1),作为VTEP(VXLAN Tunnel Endpoint)。

工作原理

  1. Flannel为每个节点分配一个子网(如10.244.1.0/24)
  2. 创建flannel.1 VXLAN接口,并配置路由表
  3. 维护FDB(转发数据库)和ARP表,将目标Pod子网映射到对应节点的IP
  4. 当Pod发送跨节点数据包时,通过VXLAN隧道封装和转发
Flannel VXLAN架构

图1: Flannel VXLAN网络架构

配置示例

# Flannel VXLAN配置示例(ConfigMap) apiVersion: v1 kind: ConfigMap metadata: name: kube-flannel-cfg namespace: kube-system data: net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "VNI": 1, "Port": 4789, "DirectRouting": false } }

优缺点

优点
  • 兼容性好,几乎可以在任何环境中工作
  • 配置简单,适合初学者
  • 无需特殊网络配置,可穿越NAT
缺点
  • 有约50字节的封装开销
  • 性能略低于直接路由模式
  • 需要调整MTU避免分片

Flannel Host-GW模式

Host-GW(Host Gateway)模式不是真正的Overlay网络,而是使用直接路由方式。它将每个节点作为网关,直接路由到其他节点的Pod子网。

工作原理

  1. Flannel为每个节点分配一个Pod子网
  2. 在每个节点上添加静态路由,将其他节点的Pod子网路由到对应节点IP
  3. 数据包直接通过物理网络转发,无需封装

配置示例

# Flannel Host-GW配置示例 apiVersion: v1 kind: ConfigMap metadata: name: kube-flannel-cfg namespace: kube-system data: net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "host-gw" } }

优缺点

优点
  • 性能接近裸机网络,延迟低
  • 无封装开销
  • 配置简单
缺点
  • 要求所有节点在同一个二层网络
  • 不能穿越NAT或不同子网
  • 节点数量增加时路由表会变大

Flannel UDP模式

UDP模式是Flannel最早的后端实现,使用UDP封装数据包。这种模式现在已经很少使用,主要用于不支持VXLAN的旧系统。

工作原理

  1. Flannel在每个节点上运行flanneld进程
  2. 创建TUN设备(flannel0)
  3. flanneld将数据包封装在UDP中并转发

配置示例

# Flannel UDP配置示例 apiVersion: v1 kind: ConfigMap metadata: name: kube-flannel-cfg namespace: kube-system data: net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "udp" } }

优缺点

优点
  • 兼容性最好,几乎在任何环境都能工作
  • 简单易懂
  • 可穿越复杂网络
缺点
  • 性能最差,有严重的CPU开销
  • 延迟高
  • 不建议在生产环境使用

Flannel配置与调优

Flannel的性能可以通过多种方式优化,特别是在VXLAN模式下:

1. 启用DirectRouting

DirectRouting是一种混合模式,当两个节点在同一子网时使用直接路由,否则使用VXLAN。这可以在保持兼容性的同时提高性能。

"Backend": { "Type": "vxlan", "DirectRouting": true }

2. MTU优化

正确设置MTU对于避免分片和提高性能至关重要:

# 在Flannel配置中设置MTU "Backend": { "Type": "vxlan", "MTU": 1450 } # 或者在命令行参数中设置 --iface-mtu=1450

3. 接口选择

在多网卡环境中,指定正确的网卡接口:

# 使用特定接口 --iface=eth1 # 或使用IP范围匹配 --iface-regex=192\.168\..*

4. 监控与故障排查

# 查看Flannel日志 kubectl logs -n kube-system -l app=flannel # 检查VXLAN接口 ip -d link show flannel.1 # 查看路由表 ip route | grep flannel # 检查FDB表 bridge fdb show dev flannel.1

Calico与Overlay网络集成

Calico是一个功能丰富的CNI插件,以其高性能和强大的网络策略功能而闻名。虽然Calico默认使用BGP直接路由模式,但它也支持多种Overlay网络技术,适用于不同的网络环境。

IPinIP模式
VXLAN模式
WireGuard加密
配置与调优

Calico IPinIP模式

IPinIP是Calico默认的Overlay网络模式,它通过在IP数据包外层再封装一层IP头来实现跨网段通信。

工作原理

  1. Calico为每个节点分配一个Pod CIDR
  2. 创建tunl0接口用于IPinIP封装
  3. 使用BGP协议交换路由信息
  4. 当需要跨网段通信时,使用IPinIP封装
  5. 同一网段内的通信可以配置为直接路由,无需封装
Calico IPinIP架构

图2: Calico IPinIP网络架构

配置示例

# 安装Calico并配置IPinIP模式 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml # 配置IPinIP模式(使用CustomResource) cat <<EOF | kubectl apply -f - apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: cidr: 10.244.0.0/16 ipipMode: Always natOutgoing: true EOF

IPinIP模式变体

Calico支持三种IPinIP模式:

  • Always: 总是使用IPinIP封装,即使在同一子网内
  • CrossSubnet: 只在跨子网通信时使用IPinIP封装
  • Never: 不使用IPinIP封装,仅使用直接路由(非Overlay模式)

优缺点

优点
  • 封装开销较小(仅20字节IP头)
  • 性能较好,接近直接路由
  • 配置灵活,可混合使用直接路由
缺点
  • 不支持多租户(无VNI概念)
  • 某些防火墙可能阻止IP协议4(IPinIP)
  • 需要调整MTU

Calico VXLAN模式

从v3.7开始,Calico添加了对VXLAN的支持,为不允许BGP或IPinIP的环境提供了更好的选择。

工作原理

  1. Calico创建vxlan.calico接口作为VTEP
  2. 使用VXLAN封装二层数据帧
  3. 维护VTEP转发表
  4. 支持与标准VXLAN设备互操作
Calico VXLAN架构

图3: Calico VXLAN网络架构

配置示例

# 配置Calico使用VXLAN模式 cat <<EOF | kubectl apply -f - apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: cidr: 10.244.0.0/16 ipipMode: Never vxlanMode: Always natOutgoing: true EOF

VXLAN模式变体

与IPinIP类似,Calico的VXLAN也支持三种模式:

  • Always: 总是使用VXLAN封装
  • CrossSubnet: 只在跨子网通信时使用VXLAN
  • Never: 不使用VXLAN(默认)

优缺点

优点
  • 兼容性好,几乎在所有环境中工作
  • 支持多租户(使用VNI)
  • 与其他VXLAN设备互操作
缺点
  • 封装开销较大(约50字节)
  • 性能略低于IPinIP
  • 需要更大的MTU调整

Calico WireGuard加密

从v3.13开始,Calico支持使用WireGuard为Overlay网络提供加密功能,保护节点间通信安全。

工作原理

  1. 在每个节点上创建WireGuard接口
  2. 生成公钥/私钥对
  3. 通过Kubernetes API交换公钥
  4. 建立加密隧道
  5. 可与IPinIP或VXLAN结合使用
Calico WireGuard加密架构

图4: Calico WireGuard加密网络架构

配置示例

# 启用Calico WireGuard加密 cat <<EOF | calicoctl apply -f - kind: FelixConfiguration apiVersion: projectcalico.org/v3 metadata: name: default spec: wireguardEnabled: true EOF # 验证WireGuard状态 kubectl get node -o yaml | grep -A3 -i wireguard

优缺点

优点
  • 提供强大的加密保护
  • 性能开销小(比IPsec快)
  • 配置简单,自动密钥管理
缺点
  • 需要内核支持WireGuard
  • 有额外的CPU开销
  • 增加约60字节封装开销

Calico配置与调优

Calico提供了丰富的配置选项,可以根据环境需求进行调优:

1. 混合模式配置

在复杂网络环境中,可以配置混合模式,结合直接路由和Overlay网络的优势:

# 配置CrossSubnet模式 apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: cidr: 10.244.0.0/16 ipipMode: CrossSubnet natOutgoing: true

2. MTU优化

根据Overlay模式调整MTU:

# 配置Calico MTU kind: FelixConfiguration apiVersion: projectcalico.org/v3 metadata: name: default spec: mtu: 1440 # 对于VXLAN # mtu: 1480 # 对于IPinIP # mtu: 1420 # 对于WireGuard

3. 性能优化

# 启用eBPF数据平面(需要Calico v3.13+) kubectl patch installation default --type=merge -p '{"spec": {"calicoNetwork": {"linuxDataplane": "BPF"}}}' # 禁用不必要的日志 kind: FelixConfiguration apiVersion: projectcalico.org/v3 metadata: name: default spec: logSeverityScreen: Warning

4. 监控与故障排查

# 检查Calico节点状态 kubectl get pods -n kube-system -l k8s-app=calico-node # 查看Calico日志 kubectl logs -n kube-system -l k8s-app=calico-node # 检查IPinIP接口 ip -d link show tunl0 # 检查VXLAN接口 ip -d link show vxlan.calico # 查看BGP状态 calicoctl node status