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 的 minRX/minTX,单位毫秒。 | 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 关系。 | - | ||||
trafficPolicy | string | 是 | Cluster | 仅在启用 BFD 时生效。 | Local |