Egress Gateway 用于控制 Pod 的外部网络访问,使用一组静态地址,具备以下特性:
同时,Egress Gateway 存在以下限制:
每个 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 将对应路由标记为不可用, 实现快速故障检测与恢复。
Egress Gateway 使用多网卡同时访问内外网, 因此需要创建 Network Attachment Definition 以连接外部网络。 以下示例展示了使用 macvlan 插件和 Kube-OVN 提供的 IPAM:
<network attachment definition name>.<namespace>。你可以使用任意 CNI 插件创建 Network Attachment Definition 来访问对应网络。
创建 VPC Egress Gateway 资源,示例如下:
上述资源会在 default 命名空间下创建名为 gateway1 的 VPC Egress Gateway, 以下 Pod 将通过 macvlan1 子网访问外部网络:
匹配 .spec.selectors 的 Pod 访问外部网络时将启用 SNAT。
创建完成后,查看 VPC Egress Gateway 资源:
查看更多信息:
查看工作负载:
查看 Pod 中的 IP 地址、路由和 iptables 规则:
在 Gateway Pod 中抓包验证网络流量:
OVN Logical Router 上自动创建路由策略:
如需启用负载均衡,修改 .spec.replicas,示例如下:
基于 BFD 的高可用依赖 VPC BFD LRP 功能, 需要修改 VPC 资源以启用 BFD Port。 以下示例为默认 VPC 启用 BFD Port:
启用 BFD Port 后,对应 OVN Logical Router 上会自动创建专用的 BFD LRP:
随后,在 VPC Egress Gateway 中将 .spec.bfd.enabled 设置为 true,示例如下:
查看 VPC Egress Gateway 信息:
查看 BFD 连接状态:
如果所有 Gateway 实例均不可用,应用了 VPC Egress Gateway 的出口流量将被丢弃。
| 字段 | 类型 | 可选 | 默认值 | 描述 | 示例 | ||
|---|---|---|---|---|---|---|---|
| enabled | boolean | 是 | false | 是否启用 BFD Port。 | true | ||
| ip | string | 否 | - | BFD Port 使用的 IP 地址。 不得与其他地址冲突。支持 IPv4、IPv6 及双栈。 | 169.255.255.255 | ||
| fdff::1 | |||||||
| 169.255.255.255,fdff::1 | |||||||
| nodeSelector | matchLabels | object | 是 | - | 用于选择运行 BFD Port 的节点的标签选择器。 BFD Port 绑定选中节点的 OVN HA Chassis Group,以 Active/Backup 模式工作。 若未指定,Kube-OVN 会自动选择最多三个节点。 可通过执行 kubectl ko nbctl list ha_chassis_group 查看所有 OVN HA Chassis Group 资源。 | 键值对映射。 | - |
| matchExpressions | object 数组 | 是 | - | 标签选择器要求列表,要求之间为 AND 关系。 | - | ||
| 字段 | 类型 | 可选 | 默认值 | 描述 | 示例 | ||||
|---|---|---|---|---|---|---|---|---|---|
| vpc | string | 是 | 默认 VPC 名称 (ovn-cluster) | VPC 名称。 | vpc1 | ||||
| replicas | integer/int32 | 是 | 1 | 副本数。 | 2 | ||||
| prefix | string | 是 | - | 工作负载部署名称的不可变前缀。 | veg- | ||||
| image | string | 是 | - | 工作负载部署使用的镜像。 | docker.io/kubeovn/kube-ovn:v1 .14.0-debug | ||||
| internalSubnet | string | 是 | 默认 VPC 内的子网名称。 | 用于访问内外网的子网名称。 | subnet1 | ||||
| externalSubnet | 否 | - | ext1 | ||||||
| internalIPs | string 数组 | 是 | - | 用于访问内外网的 IP 地址。支持 IPv4、IPv6 及双栈。 | |||||
| externalIPs | |||||||||
| bfd | enabled | boolean | 是 | false | BFD 配置。 | 是否为 Egress Gateway 启用 BFD。 | - | ||
| minRX | integer/int32 | 是 | 1000 | BFD 的最小接收/发送间隔,单位毫秒。 | 500 | ||||
| minTX | |||||||||
| multiplier | integer/int32 | 是 | 3 | BFD 乘数。 | 1 | ||||
| policies | snat | boolean | 是 | false | 出口策略。 | 是否启用 SNAT/MASQUERADE。 | true | ||
| ipBlocks | string 数组 | 是 | - | 应用网关的 IP 段。 | 192.168.0.1 | ||||
| 192.168.0.0/24 | |||||||||
| fd00::1 | |||||||||
| fd00::/120 | |||||||||
| subnets | string 数组 | 是 | - | 应用网关的 VPC 子网名称。 | subnet1 | ||||
| selectors | namespaceSelector | matchLabels | object | 是 | - | 通过命名空间选择器和 Pod 选择器配置出口策略。 | 命名空间选择器。空标签选择器匹配所有命名空间。 | 键值对映射。 | - |
| matchExpressions | object 数组 | 是 | - | 标签选择器要求列表,要求之间为 AND 关系。 | - | ||||
| podSelector | matchLabels | object | 是 | - | Pod 选择器。空标签选择器匹配所有 Pod。 | 键值对映射。 | - | ||
| matchExpressions | object 数组 | 是 | - | 标签选择器要求列表,要求之间为 AND 关系。 | - | ||||
| nodeSelector | matchLabels | object | 是 | - | 用于选择运行工作负载部署的节点的节点选择器。 | 键值对映射。 | - | ||
| matchExpressions | object 数组 | 是 | - | 标签选择器要求列表,要求之间为 AND 关系。 | - | ||||
| matchFields | object 数组 | 是 | - | 字段选择器要求列表,要求之间为 AND 关系。 | - | ||||
| tolerations | key | string | 是 | - | 用于调度 VPC Egress Gateway 实例的容忍度。 | Key 是容忍的污点键,空表示匹配所有污点键。 | node-role.kubernetes.io/control-plane | ||
| operator | string | 是 | Equal | Operator 表示键与值的关系。有效值为 Exists 和 Equal。 | Exists | ||||
| value | string | 是 | - | Value 是容忍的污点值。 | - | ||||
| effect | string | 是 | - | Effect 表示匹配的污点效果。空表示匹配所有效果。 | NoSchedule | ||||
| tolerationSeconds | integer | 是 | - | TolerationSeconds 表示容忍污点的时间(仅对 effect 为 NoExecute 的容忍度有效,否则忽略)。 | - | ||||
| trafficPolicy | string | 是 | Cluster | 仅在启用 BFD 时生效。 | Local | ||||