配置集中式网关

集中式网关允许子网内的 Pods 使用固定 IP 访问外部网络。这在网络审计、IP 白名单和防火墙规则管理等安全运维场景中尤其有用,因为这些场景需要识别并控制来自特定源 IP 的流量。在集中式网关模式下,来自 Pods 的所有出站流量都会经由指定的网关节点转发,从而实现统一的网络策略强制执行和监控。

NOTE

集中式子网下的 Pods 不能通过 hostportexternalTrafficPolicy: Local 的 NodePort 类型 Service 访问。

如果你希望子网内的流量以固定 IP 访问外部网络,用于审计和白名单等安全运维场景, 可以将 Subnet 中的网关类型设置为集中式。 在集中式网关模式下,来自 Pods 访问外部网络的数据包会先被路由到特定节点的 ovn0 网卡, 然后通过主机的路由规则向外转发。 当 natOutgoingtrue 时,Pod 访问外部网络时将使用特定节点的 IP。

集中式网关示例如下,其中 gatewayType 字段为 centralizedgatewayNode 为 Kubernetes 中特定机器的 NodeName。

apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: centralized
spec:
  protocol: IPv4
  cidrBlock: 10.166.0.0/16
  default: false
  excludeIps:
  - 10.166.0.1
  gateway: 10.166.0.1
  gatewayType: centralized
  gatewayNode: "node1,node2"
  natOutgoing: true
  • 如果集中式网关需要为出站网络指定某台机器的特定网卡, gatewayNode 格式可以改为 kube-ovn-worker:172.18.0.2, kube-ovn-control-plane:172.18.0.3
  • 自 Kube-OVN v1.12.0 起,Subnet crd 定义中新增了 enableEcmp spec 字段,用于将 ECMP 开关迁移到子网级别。你可以根据不同的子网设置是否启用 ECMP 模式。kube-ovn-controller deployment 中的 enable-ecmp 参数已不再使用。在升级到 v1.12.0 后,之前版本的子网开关会自动继承原全局开关参数的值。
NOTE

在集中式网关 ECMP 模式下,kube-ovn-controller 通过 ping 主动探测节点状态,5s 内检测故障,并在 5s-10s 内完成故障切换,在此期间部分流量可能会失败。

在集中式网关主备模式下,故障切换基于 Node Ready 状态,在断电情况下可能需要几分钟才能完成切换。

使用 Label 选择器指定网关节点

除了直接指定节点名称外,你还可以使用 gatewayNodeSelectors 通过 label 选择器动态选择网关节点。 这种方式更加灵活,尤其适用于节点名称不固定,或者需要根据 label 动态选择网关的场景。

NOTE
  • 如果 gatewayNode 不为空,则优先使用 gatewayNode,并忽略 gatewayNodeSelectors
  • 多个选择器之间采用 OR 逻辑进行评估——匹配任意一个选择器的节点都会成为网关节点。
  • 当节点 label 发生变化时,系统会自动更新网关节点列表。
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: centralized-selector
spec:
  protocol: IPv4
  cidrBlock: 10.166.0.0/16
  default: false
  excludeIps:
  - 10.166.0.1
  gateway: 10.166.0.1
  gatewayType: centralized
  gatewayNodeSelectors:
    - matchLabels:
        role: gateway
    - matchExpressions:
        - key: node-type
          operator: In
          values: ["gateway", "egress"]
  natOutgoing: true