BGP 相关文档总览
当前仓库里所有和 BGP 直接相关的使用文档主要是:
- 高级功能:BGP 支持(中文):
advance/with-bgp.md - 高级功能:BGP 支持(英文):
advance/with-bgp.en.md - VPC 总览(中文,提到 BGP 网关模式):
vpc/vpc.md - VPC 总览(英文,提到 BGP 网关模式):
vpc/vpc.en.md
其中,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 掩盖)。
- 对应 Subnet 的
-
开启发布的注解:
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.md的noDefaultEIP字段说明:- 非 BGP 网关模式下,建议设置
noDefaultEIP: true以节省 Underlay 地址。 - 侧面说明:
- BGP 网关模式:EIP 主要通过 BGP 路由发布,不依赖网关默认绑的 Underlay EIP。
- 非 BGP 网关模式:更多依靠 Underlay 直连 + ARP 的方式。
- 非 BGP 网关模式下,建议设置
- 在
配置流程:VPC NAT GW + BGP(串成完整操作步骤)
将 with-bgp 与 vpc 文档串起来,一个完整链路大致如下:
步骤 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:servicespodsiptables-eipssubnetsvpc-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-ipauth-passwordholdtimegraceful-restart及相关时间参数passivemodeebgp-multihop
主要作用是:
- 控制 BGP 会话建立、保持、重启的行为。
- 提升 NAT GW 与上游路由之间 BGP 邻居的稳定性和安全性。
如何快速上手 VPC NAT GW + BGP
如果你要直接落地一个 BGP 模式的 VPC NAT 网关方案,建议阅读顺序:
- 整体认识与配置流程
- 看中文版
advance/with-bgp.md的:- 安装
kube-ovn-speaker - 发布 Pod/Subnet / ClusterIP
- 发布 EIP + BGP 配置
- 安装
- 看中文版
- VPC + NAT 网关基础能力
- 看
vpc/vpc.md中:- 创建
Vpc、VpcNatGateway - 创建
IptablesEIP、DNAT/SNAT/FIP 规则 - 自定义路由(staticRoutes / policyRoutes)
- 创建
- 看
- 按上面的 5 个步骤 把两份文档串起来配置。
如果你有一个更具体的拓扑(比如双上联路由、跨机房、是否需要 ECMP 等),可以描述一下,我可以帮你在现有文档基础上,给出一份更贴近你环境的参数和 YAML 模版。