配置集中式网关

集中式网关允许子网内的 Pods 使用固定 IP 访问外部网络。这对于网络审计、IP 白名单和防火墙规则管理等安全操作尤为重要,因为您需要识别和控制来自特定源 IP 的流量。在集中式网关模式下,所有来自 Pods 的出站流量都会通过指定的网关节点路由,实现集中式的网络策略执行和监控。

NOTE

集中子网下的 Pods 无法通过 hostport 或带有 externalTrafficPolicy: Local 的 NodePort 类型 Service 访问。

如果您希望子网内的流量使用固定 IP 访问外部网络,以便进行审计和白名单等安全操作, 可以将子网中的网关类型设置为 centralized。 在集中式网关模式下,Pods 访问外部网络的报文首先会被路由到特定节点的 ovn0 网卡, 然后通过主机的路由规则出站。 当 natOutgoing 设置为 true 时,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 字段,用于将 ECMP 开关迁移到子网级别。您可以根据不同子网设置是否启用 ECMP 模式。kube-ovn-controller 部署中的 enable-ecmp 参数不再使用。升级到 v1.12.0 版本后,子网开关会自动继承原全局开关参数的值。
NOTE

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

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

使用标签选择器指定网关节点

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

NOTE
  • 如果 gatewayNode 不为空,则优先使用 gatewayNode,忽略 gatewayNodeSelectors
  • 多个选择器之间采用 OR 逻辑——匹配任意选择器的节点都会成为网关节点。
  • 当节点标签发生变化时,系统会自动更新网关节点列表。
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