kubeovn vpc-nat-gw BGP 场景使用

22 阅读7分钟

BGP 相关文档总览

当前仓库里所有和 BGP 直接相关的使用文档主要是:

其中,BGP 的整体用法 + VPC NAT GW 联动场景,几乎都在 with-bgp 这个高级文档里vpc 文档更多是介绍 VPC NAT 的基础能力,并在 noDefaultEIP 字段处区分了「非 BGP 网关模式」。


BGP 功能范围梳理

1. BGP 能发布哪些对象

来自 with-bgp.md

  • 支持 BGP 发布的对象:

    • Pod IP
    • 子网 CIDR(Subnet)
    • ClusterIP 类型 Service 的 IP
    • VPC NAT Gateway 上绑定的 EIP
  • 目的:

    • 通过 BGP 把这些地址发布给外部路由器,让外部网络可以直接路由进入集群内部,而不是只依赖底层网络 ARP 或手动静态路由。
  • 核心组件:

    • kube-ovn-speaker(内部使用 GoBGP):
      • 和上游路由建立 BGP 邻居。
      • 发布路由条目。
      • 把路由的 next-hop 指向自身。

2. BGP + Pod / Subnet 发布

文档章节:“发布 Pod/Subnet 路由”

  • 前置条件:

    • 对应 Subnet 的 natOutgoing 需要设为 false,让 Pod IP 直接出现在 Underlay 网络里(避免被 SNAT 掩盖)。
  • 开启发布的注解:

    kubectl annotate pod sample ovn.kubernetes.io/bgp=true
    kubectl annotate subnet ovn-default ovn.kubernetes.io/bgp=true
    
  • 取消发布:

    kubectl annotate pod sample ovn.kubernetes.io/bgp-
    kubectl annotate subnet ovn-default ovn.kubernetes.io/bgp-
    

3. BGP + Service (ClusterIP)

文档章节:“发布 ClusterIP 类型 Service 路由”

  • speaker 参数:

    • --announce-cluster-ip=true:允许对外发布 ClusterIP。
  • Service 注解:

    kubectl annotate service sample ovn.kubernetes.io/bgp=true
    

    取消:

    kubectl annotate service sample ovn.kubernetes.io/bgp-
    

BGP + VPC NAT Gateway 使用场景整理(重点)

核心在 with-bgp“发布 EIPs” / “Publishing EIPs” 章节,配合 vpc 文档中 VPC NAT GW 的基础配置。

1. NAT 网关的两种发布模式

文档中对 EIP 的发布方式有两种:

  • ARP 模式(默认始终开启)

    • NAT GW 在外部网络上通过 ARP 响应 EIP。
    • 适合:
      • NAT 网关和上游设备在同一个二层网络。
      • 规模相对较小,对 ARP 扩散不敏感的场景。
  • BGP 模式(可选,叠加在 ARP 之上)

    • VpcNatGateway 上开启 bgpSpeaker 后,会注入一个 BGP speaker sidecar。
    • 启用 BGP 后,不会关掉 ARP 模式,两者同时存在:
      • EIP 既会通过 BGP 对外发布,
      • 也会继续通过 ARP 响应。
    • 适合:
      • 有多台上游路由、需要做 ECMP / 高可用。
      • 不希望依赖 ARP Flood,更偏路由收敛的网络。
      • 网络规模较大时减少二层广播压力。

2. 文档中隐含/直接描述的典型场景

  • 场景 A:多个 VPC NAT 网关对外统一通过 BGP 发布 EIP

    • 部署多实例 VpcNatGateway,每个绑定不同 EIP。
    • 每个网关内部有 BGP sidecar,同上游路由建立邻居,发布 EIP 路由。
    • 上游路由如果开启 ECMP,可以在多网关间做负载均衡和高可用。
  • 场景 B:自定义 VPC + 指定 NAT GW 作为出入口

    • vpc.en.md 中,VPC 的静态路由通过 nextHopIP 指向某个 NAT GW 的 lanIp
    • 对外则由该 NAT GW 上的 BGP speaker 把 EIP 发布出去,实现:
      • 入方向:外部 → EIP → NAT GW → VPC 内部 Pod。
      • 出方向:VPC Pod → NAT GW → EIP → 外部。
    • 保证东西向/南北向路径相对对称。
  • 场景 C:区分 BGP 网关 vs 非 BGP 网关

    • vpc.mdnoDefaultEIP 字段说明:
      • 非 BGP 网关模式下,建议设置 noDefaultEIP: true 以节省 Underlay 地址。
      • 侧面说明:
        • BGP 网关模式:EIP 主要通过 BGP 路由发布,不依赖网关默认绑的 Underlay EIP。
        • 非 BGP 网关模式:更多依靠 Underlay 直连 + ARP 的方式。

配置流程:VPC NAT GW + BGP(串成完整操作步骤)

with-bgpvpc 文档串起来,一个完整链路大致如下:

步骤 1:为 NAT GW BGP sidecar 准备 NAD + Subnet

来自 with-bgp 的 EIP 小节。

  • 目标:让 NAT GW 的 BGP sidecar 能通过一个共享的 provider 网络访问 K8S API(用来自动发现 EIP、Subnets、NatGateway 等资源)。
  • 示例:
    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: api-ovn-nad
      namespace: default
    spec:
      config: '{
          "cniVersion": "0.3.0",
          "type": "kube-ovn",
          "server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
          "provider": "api-ovn-nad.default.ovn"
        }'
    ---
    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
      name: vpc-apiserver-subnet
    spec:
      protocol: IPv4
      cidrBlock: 100.100.100.0/24
      provider: api-ovn-nad.default.ovn
    

如果你之前已经为「自定义 VPC 的 CoreDNS」配置过类似 NAD,可以直接复用同一个 provider。

步骤 2:在 ovn-vpc-nat-config 中开启 BGP 支持

  • 关键字段:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ovn-vpc-nat-config
      namespace: kube-system
    data:
      apiNadProvider: api-ovn-nad.default.ovn              # 供 sidecar 访问 K8S API 的 NAD provider
      bgpSpeakerImage: docker.io/kubeovn/kube-ovn:v1.13.0  # BGP speaker 使用的镜像
      image: docker.io/kubeovn/vpc-nat-gateway:v1.13.0
    

步骤 3:给 NAT GW 控制器配置 RBAC 权限

  • 权限点:

    • list/watch
      • services
      • pods
      • iptables-eips
      • subnets
      • vpc-nat-gateways
  • 这些权限用于:

    • 让 NAT GW 控制器同步当前有哪些 EIP、它们挂在哪个网关上、有哪些 Subnet/VPC 等信息,然后据此维护 BGP 路由表。

步骤 4:创建带 BGP 配置的 VpcNatGateway

vpc 文档中有基础 NAT GW 的示例,在 with-bgp 中给出带 bgpSpeaker 的完整示例。

  • 示例:

    kind: VpcNatGateway
    apiVersion: kubeovn.io/v1
    metadata:
      name: vpc-natgw
    spec:
      vpc: vpc1
      subnet: net1
      lanIp: 10.0.1.10
      bgpSpeaker:
        enabled: true
        asn: 65500         # 本端 ASN
        remoteAsn: 65000   # 对端(上游路由)ASN
        neighbors:
          - 100.127.4.161  # IPv4 邻居
          - fd:01::1       # IPv6 邻居(可选)
        enableGracefulRestart: true
        routerId: 1.1.1.1
        holdTime: 1m
        password: "password123"
        extraArgs:
          - -v5
      selector:
        - "kubernetes.io/os: linux"
      externalSubnets:
        - ovn-vpc-external-network   # 对外说 BGP 的网络(EIP 所在外部网)
    
  • 配合 VPC 文档的点:

    • lanIp 会被用作 VPC 内路由的下一跳(nextHopIP)。
    • externalSubnets 决定 NAT GW 与上游设备建立 BGP 邻居所用的网络。

步骤 5:创建 EIP 并通过注解开启 BGP 发布

  • vpc.md 的说明创建 IptablesEIP(随机 EIP / 固定 EIP / 指定 externalSubnet)。
  • 在 EIP 上打注解:
    kubectl annotate eip sample ovn.kubernetes.io/bgp=true
    

之后流程是:

  • NAT GW 的 BGP sidecar 通过 K8S API 发现这个 EIP。
  • 把该 EIP 作为前缀,对上游路由通过 BGP 进行发布。
  • 外部路由器学到 EIP → NAT GW 节点 的路由,即可正常收发流量。

BGP 策略与高级选项(对 NAT GW 的意义)

发布策略(Policies)

文档:“发布策略 / Announcement policies”

  • Cluster 策略(默认)
    • 每个 speaker 都对外发布该路由。
    • 外部流量可以从任意 speaker 节点进入,后续在集群内再转发到实际的 Pod。
  • Local 策略
    • 只有真正承载该 Pod 的节点上的 speaker 才会发布对应 IP。
    • 路径更短,但要求几乎所有节点都部署 speaker。

文档中策略主要针对 Pod/Subnet/Service,NAT GW 自带的 BGP sidecar 更像一个「固定网关节点的 speaker」,策略控制相对简单,多数情况下按网关的邻居配置即可。

BGP 高级选项

文档:“BGP 高级选项 / BGP Advanced Options”

  • 常见参数:
    • announce-cluster-ip
    • auth-password
    • holdtime
    • graceful-restart 及相关时间参数
    • passivemode
    • ebgp-multihop

主要作用是:

  • 控制 BGP 会话建立、保持、重启的行为。
  • 提升 NAT GW 与上游路由之间 BGP 邻居的稳定性和安全性。

如何快速上手 VPC NAT GW + BGP

如果你要直接落地一个 BGP 模式的 VPC NAT 网关方案,建议阅读顺序:

  1. 整体认识与配置流程
    • 看中文版 advance/with-bgp.md 的:
      • 安装 kube-ovn-speaker
      • 发布 Pod/Subnet / ClusterIP
      • 发布 EIP + BGP 配置
  2. VPC + NAT 网关基础能力
    • vpc/vpc.md 中:
      • 创建 VpcVpcNatGateway
      • 创建 IptablesEIP、DNAT/SNAT/FIP 规则
      • 自定义路由(staticRoutes / policyRoutes)
  3. 按上面的 5 个步骤 把两份文档串起来配置。

如果你有一个更具体的拓扑(比如双上联路由、跨机房、是否需要 ECMP 等),可以描述一下,我可以帮你在现有文档基础上,给出一份更贴近你环境的参数和 YAML 模版。