配置 Egress Gateway
目录
关于 Egress Gateway
Egress Gateway 用于控制 Pod 的外部网络访问,使用一组静态地址,具有以下特性:
- 通过 ECMP 实现 Active-Active 高可用,支持水平吞吐量扩展
- 通过 BFD 实现快速故障切换(<1秒)
- 支持 IPv6 和双栈
- 通过 NamespaceSelector 和 PodSelector 实现细粒度路由控制
- 通过 NodeSelector 实现 Egress Gateway 的灵活调度
同时,Egress Gateway 具有以下限制:
- 使用 macvlan 作为底层网络连接,要求底层网络支持 Underlay
- 多实例 Gateway 模式下,需要多个 Egress IP
- 目前仅支持 SNAT,不支持 EIP 和 DNAT
- 目前不支持记录源地址转换关系
实现细节
每个 Egress Gateway 由多个具有多个网络接口的 Pod 组成。 每个 Pod 有两个网络接口:一个加入虚拟网络,用于 VPC 内通信, 另一个通过 Macvlan 连接到底层物理网络,用于外部网络通信。 虚拟网络流量最终通过 Egress Gateway 实例内的 NAT 访问外部网络。
每个 Egress Gateway 实例在 OVN 路由表中注册其地址。 当 VPC 内的 Pod 需要访问外部网络时, OVN 使用源地址哈希将流量转发到多个 Egress Gateway 实例地址, 实现负载均衡。随着 Egress Gateway 实例数量增加, 吞吐量也可以水平扩展。
OVN 使用 BFD 协议探测多个 Egress Gateway 实例。 当某个 Egress Gateway 实例故障时,OVN 将对应路由标记为不可用, 实现快速故障检测和恢复。
注意事项
- 仅 Kube-OVN CNI 支持 Egress Gateway。
- Egress Gateway 需要 Multus-CNI。
使用方法
创建 Network Attachment Definition
Egress Gateway 使用多个网卡同时访问内网和外网, 因此需要创建 Network Attachment Definition 以连接外部网络。 下面是使用 macvlan 插件和 Kube-OVN 提供的 IPAM 的示例:
- 连接外部网络的宿主机接口。
- Provider 名称,格式为
<network attachment definition name>.<namespace>。 - 用于标识外部网络的 Provider 名称,必须与 NetworkAttachmentDefinition 中一致。
你可以使用任意 CNI 插件创建 Network Attachment Definition 来访问对应网络。
创建 VPC Egress Gateway
创建 VPC Egress Gateway 资源,示例如下:
- 创建 VPC Egress Gateway 实例的命名空间。
- VPC Egress Gateway 实例的副本数。
- 连接外部网络的外部子网。
- VPC Egress Gateway 适用的节点选择器。
- VPC Egress Gateway 适用的命名空间和 Pod 选择器。
- VPC Egress Gateway 的策略,包括 SNAT 及适用的子网/IP 段。
- 是否为该策略启用 SNAT。
- 策略适用的子网。
- 策略适用的 IP 段。
上述资源会在 default 命名空间下创建名为 gateway1 的 VPC Egress Gateway, 以下 Pod 会通过 macvlan1 子网访问外部网络:
- default 命名空间中的 Pod。
- subnet1 子网下的 Pod。
- IP 属于 CIDR 10.18.0.0/16 的 Pod。
匹配 .spec.selectors 的 Pod 始终启用 SNAT 访问外部网络。
创建完成后,查看 VPC Egress Gateway 资源:
查看更多信息:
查看工作负载:
查看 Pod 内的 IP 地址、路由和 iptables 规则:
在 Gateway Pod 中抓包验证网络流量:
OVN Logical Router 上自动创建路由策略:
- VPC Egress Gateway 用于转发 .spec.policies 指定 Pod 流量的逻辑路由器策略。
- VPC Egress Gateway 用于转发 .spec.selectors 指定 Pod 流量的逻辑路由器策略。
如果需要启用负载均衡,修改 .spec.replicas,示例如下:
启用基于 BFD 的高可用
基于 BFD 的高可用依赖于 VPC BFD LRP 功能, 因此需要修改 VPC 资源以启用 BFD Port。 以下示例为默认 VPC 启用 BFD Port:
- 是否启用 BFD Port。
- BFD Port 的 IP 地址,必须是有效且不与其他 IP/子网冲突的地址。
- 用于选择运行 BFD Port 的节点的节点选择器,BFD Port 绑定选中节点的 OVN HA Chassis Group,以 Active/Backup 模式工作。
启用 BFD Port 后,会在对应的 OVN Logical Router 上自动创建专用的 BFD LRP:
- 在 OVN Logical Router 上创建的 BFD Port。
随后,在 VPC Egress Gateway 中将 .spec.bfd.enabled 设置为 true,示例如下:
- Egress Gateway 所属的 VPC。
- Egress Gateway 实例连接的内部子网。
- Egress Gateway 实例连接的外部子网。
- 是否为 Egress Gateway 启用 BFD。
- BFD 的最小接收间隔,单位毫秒。
- BFD 的最小发送间隔,单位毫秒。
- BFD 的乘数,决定多少次丢包后判定故障。
查看 VPC Egress Gateway 信息:
查看 BFD 连接状态:
如果所有 Gateway 实例均不可用,应用了 VPC Egress Gateway 的出口流量将被丢弃。