Skip to content

BGP 网络

Huanyu He edited this page Jul 7, 2023 · 12 revisions

通过创建如下 Network 对象可以生成一个 BGP 容器网络

apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
  name: network1
spec:
  nodeSelector:
    network: network1
  type: Underlay                # type 需要为 Underlay
  mode: BGP                     # mode 需要为 BGP
  netID: 100                    # Required.
                                # For Underlay BGP network, netID refers to the AS number used by hybridnet
                                # nodes which belongs to this network.
  config:
    bgpPeers:                         # Required. Only one BGP peer is supported now.
      - asn: 200                      # Required. The AS number for remote BGP peer.
        address: 192.168.56.254       # Required. The IP address for remote BGP peer. Usually is an address of a TOR switch.
        gracefulRestartSeconds: 600   # Optional. Default 300.
        password: "12345"             # Optional.

对于 BGP 的 Network 来说,我们通常认为一个 ToR 交换机下的所有节点为一个网络域,拓扑如下图

bgp-topologic

在一个 BGP 网络域中,所有节点上的 hybridnet BGP server(hybridnet daemon Pod 中的一个进程)使用跟 Network 的 spec.netID 字段相同值的 AS 号与 spec.config.bgpPeers[0].address 地址对应的 BGP server 建立 BGP 连接(EBGP 和 IBGP 都可以),并且宣告路由规则。spec.netID 应该与 spec.config.bgpPeers[0].asn 值不同,并且远端 BGP server 的地址应该是节点的默认网关地址。这个模型比较类似于 calico 的 downward default model

因为节点的默认路由即为 ToR 交换机的地址,节点上的 hybridnet BGP server 不会学习来自远端 BGP server 的路由宣告,只会单方面向远端宣告两种路由信息:

  1. 对于每个本节点存在的 Pod 地址,hybridnet BGP server 会宣告一条路由信息,路由信息中的下一跳地址为本节点地址,目标网段为 /32(或者 /128,如果是 ipv6)类型的网段,并且路由信息携带 NO_EXPORT 的社区属性
  2. 对于每个本网络域内的 Subnet 网段,hybridnet BGP server 会宣告一条路由信息,路由信息中的下一跳地址为本节点地址,目标网段为网段的 CIDR

通过这样的行为,ToR 交换机与 Spine 交换机上关于容器网络的路由条目数量关系可以简单描述为

  1. ToR 交换机上关于容器网络的路由条目数量 = ToR 交换机下所有 Pod 数目的总和 + ToR 交换机范围内所有 Subnet 的数目
  2. Spine 交换机上关于容器网络的路由条目数量 = Spine 交换机范围内所有 Subnet 的数目

相较于 calico 的 downward default model 模式,hybridnet 不需要依赖对每个节点的“容器网络地址段预分配逻辑”就能达到严格的“路由信息聚合”效果,能够充分保障 Spine 交换机的稳定性,避免大规模场景下因为容器网络路由条目过多影响核心网络稳定性的风险,同时,也提供了最大程度灵活的 IP 分配功能,在 BGP 模式下兼容了”网络域内固定 IP”的能力

当然,在不同 ToR 交换机下的节点也可以使用相同的 AS 号,目前来讲应该是更通用的拓扑,如图

bgp-topologic-sample

跟其他外部 BGP server 建立 BGP 连接

hybridnet 版本需要 >= v0.8.0

这里基于本文一开始的 Network 对象举例。如果需要节点上的 hybridnet-daemon pod 除了跟 ToR(192.168.56.254)建立 EBGP 连接,同时还与另一个 RR(1.1.1.1) 建立 IBGP 连接的话,可以将配置修改如下:

apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
  name: network1
spec:
  nodeSelector:
    network: network1
  type: Underlay                # type 需要为 Underlay
  mode: BGP                     # mode 需要为 BGP
  netID: 100                    # Required.
                                # For Underlay BGP network, netID refers to the AS number used by hybridnet
                                # nodes which belongs to this network.
  config:
    bgpPeers:                         # Required. Only one BGP peer is supported now.
      - asn: 200                      # Required. The AS number for remote BGP peer.
        address: 192.168.56.254       # Required. The IP address for remote BGP peer. Usually is an address of a TOR switch.
        gracefulRestartSeconds: 600   # Optional. Default 300.
        password: "12345"             # Optional.
      - asn: 100                     
        address: 1.1.1.1           
        gracefulRestartSeconds: 600 
        password: "12345"            
        doesNotRouteTraffic: true     # Optional. Whether the peer route traffic.
        allowNotEstablished: true     # Optional. This affects whether pod can be created if this peer is down.

这里添加了一个 1.1.1.1 的 BGP peer,并且将 doesNotRouteTraffic 设置为了 true,表示不使用该 peer 的 address 作为容器网络的下一跳地址。同时将 allowNotEstablished 设置为了 true,表示该 peer 如果没有正常工作不会影响 BGP Pod 创建。

bgp network 最多只能有一个 doesNotRouteTraffic 字段为空(或者 false)的 bgpPeer,节点上的 Pod 会使用该 bgpPeer 的地址作为流量出节点的下一跳地址;如果一个都不存在,容器会使用节点的默认网关作为出节点的下一跳地址

除了跟外部 RR 建立 IBGP 连接,也可以跟其他外部 BGP server 建立 EBGP 连接,这个完全只取决于所添加 bgpPeer 的 asn 字段,要注意的只是 EBGP 连接通常存在跨交换机跳数限制。