配置具有 BGP 的捆绑式负载均衡器

本文档介绍了如何通过适用于 Google Distributed Cloud 的边界网关协议 (BGP) 设置和使用捆绑式负载平衡器。此负载均衡模式支持通过外部边界网关协议 (eBGP) 为集群通告 ServiceType LoadBalancer 虚拟 IP 地址 (VIP)。在此场景中,您的集群网络是一个自治系统,该系统通过对等互连与另一个自治系统(一个外部网络)互连。

具有 BGP 功能的捆绑式负载均衡器适用于所有集群类型,但管理员集群仅支持此功能的控制平面负载均衡部分。

使用具有 BGP 功能的捆绑式负载均衡器可提供以下优势:

  • 使用 N 路主动/主动负载均衡功能,可实现更快的故障切换速度,并且可更高效地利用可用带宽。
  • 支持第 3 层协议,该协议可与兼容 eBGP 的第三方架顶式 (ToR) 交换机和路由器搭配操作。
  • 启用运行高级软件定义网络 (SDN) 栈的数据中心,可将第 3 层边界一直推送到集群。

具有 BGP 的捆绑式负载均衡的工作原理

以下部分简要介绍了具有 BGP 的捆绑式负载均衡器的工作原理。

BGP 对等互连

具有 BGP 功能的捆绑式负载均衡器会启动与您的基础架构的多个 BGP 连接。BGP 具有以下技术要求:

  • 控制平面 VIP 和服务 VIP 的对等互连会话是独立的。
  • 控制平面对等互连会话从控制平面节点的 IP 地址发起。
  • 服务对等互连会话从您在 NetworkGatewayGroup 自定义资源中指定的浮动 IP 地址发起。
  • GDC 控制器的网络网关管理浮动 IP 地址。
  • 基于 BGP 的捆绑式负载均衡仅支持 eBGP 对等互连。
  • 默认支持多跃点对等互连。
  • 不支持 BGP 会话上的 MD5 密码。
  • 不支持基于 IPv6 的对等互连会话。
  • 向任何对等体通告的路由应在整个网络中重新分布,并且可从集群中的其他任何位置进行访问。
  • 建议在接收模式下将 BGP ADD-PATH 功能用于对等互连会话。
  • 从每个对等体通告多个路径会产生主动/主动负载均衡。
  • 应为您的网络启用等价多路径路由 (ECMP),以便多个路径可用于在一组负载均衡器节点之间分布流量。

控制平面负载均衡

集群中的每个控制平面节点都会与基础架构中的一个或多个对等体建立 BGP 会话。我们要求每个控制平面节点至少有一个对等节体。在集群配置文件中,您可以配置哪些控制平面节点连接到哪些外部对等体。

下图展示了控制平面对等互连的示例。集群在一个子网中有两个控制平面节点,在另一个子网中有一个控制平面节点。每个子网中都有一个外部对等方 (TOR),Google Distributed Cloud 控制平面节点与其 TOR 对等。

使用 BGP 对等互连进行服务负载均衡

服务负载均衡

除了从控制平面对等互连的每个控制平面节点发起的对等互连会话以外,系统还会为 LoadBalancer 服务发起其他对等互连会话。这些对等互连会话不是直接从集群节点 IP 地址发起,而是改用浮动 IP 地址。

使用 externalTrafficPolicy=Local 网络政策的服务不受支持。但是,externalTrafficPolicy=Local 设置取决于工作负载,并且每当在节点中添加或移除支持服务的 Pod 时,路由都会更新。此路由更新行为可能会使等价多路径 (ECMP) 路由更改流量,因而导致流量下降。

浮动 IP 地址

服务负载均衡要求您在集群节点子网中预留浮动 IP 地址,以用于 BGP 对等互连。集群至少需要一个浮动 IP 地址,但我们建议您至少预留两个地址,以确保 BGP 会话的高可用性。浮动 IP 地址在 NetworkGatewayGroup 自定义资源 (CR) 中指定,可以包含在集群配置文件中。

浮动 IP 地址消除了将 BGP 发言者 IP 地址映射到节点的麻烦。GDC 控制器的网络网关负责将 NetworkGatewayGroup 分配给节点,还管理浮动 IP 地址。如果某个节点发生故障,GDC 控制器的网络网关会重新分配浮动 IP 地址,以确保外部对等体具有确定性 IP 地址可与之建立对等互连。

外部对等体

对于数据平面负载均衡,您可以使用在集群配置文件的 loadBalancer.controlPlaneBGP 部分中为控制平面对等互连指定的外部对等方。或者,您可以指定不同的 BGP 对等方。

如果要为数据平面对等互连指定不同的 BGP 对等方,请将 BGPLoadBalancerBGPPeer 资源规范附加到集群配置文件。如果您未指定这些自定义资源,则系统会自动为数据平面使用控制平面对等方。

您可以在添加到集群配置文件的 BGPPeer 自定义资源中指定具有浮动 IP 地址的对等互连会话所使用的外部对等方。BGPPeer 资源包含由相应的 BGPLoadBalancer 自定义资源标识的标签。您可以在 BGPLoadBalancer 自定义资源的 peerSelector 字段中指定匹配标签,以选择要使用的 BGPPeer

GDC 控制器的网络网关会尝试从一组预留的浮动 IP 地址与每个外部对等方建立会话(会话数可配置)。我们建议您指定至少两个外部对等体,以确保 BGP 会话的高可用性。为服务负载均衡指定的每个外部对等体必须配置为与 NetworkGatewayGroup 自定义资源中指定的每个浮动 IP 地址建立对等互连。

负载均衡器节点

集群中的部分节点用于负载均衡,这意味着它们是能够接受传入的负载均衡流量的通告节点。这组节点默认为控制平面节点池,但您可以在集群配置文件的 loadBalancer 部分中指定其他节点池。如果指定节点池,则它可用于负载均衡器节点,而不是控制平面节点池。

浮动 IP 地址(充当 BGP 发言者)不一定在负载均衡器节点上运行。浮动 IP 地址会分配给同一子网中的节点,并且对等互连会从此节点发起,无论此节点是否为负载均衡器节点都是如此。但是,通过 BGP 通告的下一个跃点始终是负载均衡器节点。

示例对等互连拓扑

下图展示了具有 BGP 对等互连的服务负载均衡示例。有两个浮动 IP 地址分配给其各自子网中的节点。定义了两个外部对等体。每个浮动 IP 都与两个外部对等体对等互连。

使用 BGP 对等互连进行服务负载均衡

设置 BGP 负载均衡器

以下部分介绍如何将集群和外部网络配置为使用具有 BGP 的捆绑式负载均衡器。

规划与外部基础架构的集成

为了将捆绑式负载均衡器与 BGP 结合使用,您必须设置外部基础架构:

  • 必须将外部基础架构配置为与集群中的每个控制平面节点对等互连,以设置控制平面通信。这些对等互连会话用于通告 Kubernetes 控制平面 VIP。

  • 外部基础架构必须配置为与一组预留的浮动 IP 地址对等互连,以进行数据平面通信。浮动 IP 地址用于服务 VIP 的 BGP 对等互连。我们建议您使用两个浮动 IP 地址和两个对等体,以确保 BGP 会话的高可用性。在将集群配置为使用 BGP 进行捆绑式负载均衡部分中描述了预留浮动 IP 的过程。

配置基础架构后,将 BGP 对等互连信息添加到集群配置文件中。您创建的集群可以发起与外部基础架构的对等互连会话。

将集群配置为使用 BGP 进行捆绑式负载均衡

创建集群时,您需要在集群配置文件中启用和配置使用 BGP 进行捆绑式负载均衡。 在集群配置文件中,您可以启用高级网络并更新 loadBalancer 部分。您还可以为以下三个自定义资源附加规范:

  • NetworkGatewayGroup:指定用于服务 BGP 对等互连会话的浮动 IP 地址。

  • BGPLoadBalancer:使用标签选择器指定将哪些对等方用于 BGP 负载均衡。

  • BGPPeer:指定 BGP 对等互连会话的各个对等方,包括用于选择用途的标签。

以下说明介绍了如何配置集群和三个自定义资源,以使用 BGP 设置捆绑式负载均衡。

  1. advancedNetworking 字段添加到 clusterNetwork 部分中的集群配置文件,并将其设置为 true

    此字段可启用高级网络功能,具体来说,就是网络网关组资源。

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: bm
      namespace: CLUSTER_NAMESPACE
    spec:
    ...
      clusterNetwork:
        advancedNetworking: true
    

    CLUSTER_NAMESPACE 替换为集群的命名空间。默认情况下,Google Distributed Cloud 的集群命名空间是以 cluster- 开头的集群名称。例如,如果您将集群命名为test,则命名空间为 cluster-test

  2. 在集群配置文件的 loadBalancer 部分中,将 mode 设置为 bundled,并添加值为 bgptype 字段。

    这些字段值会启用基于 BGP 的捆绑式负载均衡。

    ...
      loadBalancer:
        mode: bundled
    
        # type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
        type: bgp
        ...
    
  3. 如需指定控制平面的 BGP 对等互连信息,请将以下字段添加到 loadBalancer 部分中:

        ...
        # AS number for the cluster
        localASN: CLUSTER_ASN
    
        # List of BGP peers used for the control plane peering sessions.
        bgpPeers:
        - ip: PEER_IP
          asn: PEER_ASN
          # optional; if not specified, all CP nodes connect to all peers.
          controlPlaneNodes:   # optional
          - CP_NODE_IP
    ...
    

    请替换以下内容:

    • CLUSTER_ASN:要创建的集群的自治系统编号。
    • PEER_IP:外部对等设备的 IP 地址。
    • PEER_ASN:外部对等设备所属网络的自治系统编号。
    • CP_NODE_IP:(可选)连接到外部对等体的控制平面节点的 IP 地址。如果未指定任何控制平面节点,则所有控制平面节点都可以连接到外部对等体。如果指定一个或多个 IP 地址,则只有指定的节点会参与对等互连会话。

    您可以指定多个外部对等体,bgpPeers 采用映射列表。我们建议您为 BGP 会话至少指定两个外部对等体,以实现高可用性。如需查看包含多个对等体的示例,请参阅示例配置

  4. 设置 loadBalancer.portsloadBalancer.vipsloadBalancer.addressPools 字段(显示默认值)。

    ...
      loadBalancer:
      ...
        # Other existing load balancer options remain the same
        ports:
          controlPlaneLBPort: 443
        # When type=bgp, the VIPs are advertised over BGP
        vips:
          controlPlaneVIP: 10.0.0.8
          ingressVIP: 10.0.0.1
    
        addressPools:
        - name: pool1
          addresses:
          - 10.0.0.1-10.0.0.4
    ...
    
  5. 指定要用于对数据平面进行负载均衡的集群节点。

    这是可选步骤。如果您未对 nodePoolSpec 部分取消备注,则控制平面节点用于数据平面负载均衡。

    ...
      # Node pool used for load balancing data plane (nodes where incoming traffic
      # arrives. If not specified, this defaults to the control plane node pool.
      # nodePoolSpec:
      #   nodes:
      #   - address: <Machine 1 IP>
    ...
    
  6. 通过配置 NetworkGatewayGroup 自定义资源来预留浮动 IP 地址:

    浮动 IP 地址会在对等互连会话中用于数据平面负载均衡。

    ...
    ---
    apiVersion: networking.gke.io/v1
    kind: NetworkGatewayGroup
    metadata:
      name: default
      namespace: CLUSTER_NAMESPACE
    spec:
      floatingIPs:
      - FLOATING_IP
      nodeSelector:    # optional
      - NODE_SELECTOR
    ...
    

    请替换以下内容:

    • CLUSTER_NAMESPACE:集群的命名空间。默认情况下,Google Distributed Cloud 的集群命名空间是以 cluster- 开头的集群名称。例如,如果您将集群命名为test,则命名空间为 cluster-test
    • FLOATING_IP:集群的其中一个子网的 IP 地址。您必须指定至少一个 IP 地址,但我们建议您指定至少两个 IP 地址。
    • NODE_SELECTOR:(可选)标签选择器,标识用于实例化与外部对等体(例如架顶式 [ToR] 交换机)的对等互连会话的节点。如果不需要,请移除此字段。

    确保 NetworkGatewayGroup 自定义资源名为 default 并使用集群命名空间。如需查看 NetworkGatewayGroup 自定义资源规范可能类似于的内容示例,请参阅示例配置

  7. (可选)通过配置 BGPLoadBalancer 自定义资源,指定用于数据平面负载均衡的对等方:

    ...
    ---
    apiVersion: networking.gke.io/v1
    kind: BGPLoadBalancer
    metadata:
      name: default
      namespace: CLUSTER_NAMESPACE
    spec:
      peerSelector:
        PEER_LABEL: "true"
    ...
    

    请替换以下内容:

    • CLUSTER_NAMESPACE:集群的命名空间。默认情况下,Google Distributed Cloud 的集群命名空间是以 cluster- 开头的集群名称。例如,如果您将集群命名为test,则命名空间为 cluster-test
    • PEER_LABEL:用于标识用于负载均衡的对等方的标签。具有匹配标签的任何 BGPPeer 自定义资源都会指定每个对等方的详细信息。

    确保 BGPLoadBalancer 自定义资源名为 default 并使用集群命名空间。如果您未指定 BGPLoadBalancer 自定义资源,则系统会自动使用控制平面对等方进行数据平面负载均衡。如需了解完整示例,请参阅示例配置

  8. (可选)通过配置一个或多个 BGPPeer 自定义资源来指定数据平面的外部对等方:

    ...
    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: BGP_PEER_NAME
      namespace: CLUSTER_NAMESPACE
      labels:
        PEER_LABEL: "true"
    spec:
      localASN: CLUSTER_ASN
      peerASN: PEER_ASN
      peerIP: PEER_IP
      sessions: SESSION_QTY
      selectors:   # Optional
        gatewayRefs:
        - GATEWAY_REF
      ...
    

    请替换以下内容:

    • BGP_PEER_NAME:对等方的名称。
    • CLUSTER_NAMESPACE:集群的命名空间。默认情况下,Google Distributed Cloud 的集群命名空间是以 cluster- 开头的集群名称。例如,如果您将集群命名为test,则命名空间为 cluster-test
    • PEER_LABEL:用于标识用于负载均衡的对等方的标签。此标签应与 BGPLoadBalancer 自定义资源中指定的标签对应。
    • CLUSTER_ASN:要创建的集群的自治系统编号。
    • PEER_IP:外部对等设备的 IP 地址。我们建议您指定至少两个外部对等方,但必须至少指定一个。
    • PEER_ASN:外部对等设备所属网络的自治系统编号。
    • SESSION_QTY:要为此对等方建立的会话数。我们建议您至少建立两个会话,以确保在其中一个节点关闭时保持与对等方的连接。
    • GATEWAY_REF:(可选)要用于对等互连的 NetworkGatewayGroup 资源的名称。如果未设置,则可以使用任何或所有网关资源。将此设置与 NetworkGatewayGroups 资源中的 nodeSelector 字段结合使用,以选择用于与特定外部对等体(例如 ToR 交换机)对等互连的节点。如果需要,可以通过多个条目来选择多个 NetworkGatewayGroups,格式为每行一个网关。

    您可以通过创建其他 BGPPeer 自定义资源来指定多个外部对等方。我们建议您指定至少两个外部对等方(两个自定义资源),以实现 BGP 会话的高可用性。如果您未指定 BGPPeer 自定义资源,则系统会自动使用控制平面对等方进行数据平面负载均衡。

  9. 运行 bmctl cluster create 创建集群时,将运行预检检查。除了其他检查之外,预检检查还会验证控制平面的 BGP 对等互连配置,并在创建集群之前直接向管理员工作站报告任何问题。

    成功后,添加的 BGP 负载均衡资源(NetworkGatewayGroup、BGPLoadBalancer 和 BGPPeer)进入用户集群命名空间中的管理员集群。对这些资源进行后续更新时,请使用管理员集群 kubeconfig 文件。然后,管理员集群协调对用户集群的更改。如果您在用户集群上直接修改这些资源,则管理员集群会在后续协调中覆盖您的更改。

我们建议您对 RFC 7911 中指定的对等互连会话使用 BGP ADD-PATH 功能。默认情况下,BGP 协议只允许为单个前缀向对等体通告单个下一跃点。BGP ADD-PATH 允许为同一前缀通告多个下一跃点。将 ADD-PATH 与基于 BGP 的捆绑式负载均衡结合使用时,集群可以将多个集群节点作为负载均衡器服务(前缀)的前端节点(下一个跃点)通告。在网络中启用 ECMP,以便流量可以分配到多条路径。通过将多个集群节点通告为下一跃点来扇出流量,提高了负载均衡的数据平面容量的扩缩能力。

如果您的外部对等设备(例如架顶式 (ToR) 交换机或路由器)支持 BGP ADD-PATH,则仅启用接收扩展程序就已足够。使用 BGP 进行捆绑式负载均衡在没有 ADD-PATH 功能的情况下可正常运行,但针对每个对等互连会话通告单个负载均衡节点的限制会限制负载均衡器数据平面容量。如果没有 ADD-PATH,Google Distributed Cloud 会从负载均衡器节点池中选择要通告的节点,并尝试将不同 VIP 的下一个跃点分布到不同节点。

仅限负载均衡器节点使用 BGP 对等互连

Google Distributed Cloud 会在浮动 IP 地址所在子网的任何节点上自动分配浮动 IP 地址。即使这些 IP 地址未到达负载均衡器节点,BGP 会话也会从这些 IP 地址发起。此行为是设计使然,因为我们已将控制平面 (BGP) 与数据平面(负载均衡器节点池)分离。

如果要限制可用于 BGP 对等互连的一组节点,可以指定一个子网仅用于负载均衡器节点。也就是说,您可以将该子网中的所有节点都配置为位于负载均衡器节点池中。然后,在配置用于 BGP 对等互连的浮动 IP 地址时,请确保它们来自同一子网。Google Distributed Cloud 确保仅从负载均衡器节点进行浮动 IP 地址分配和 BGP 对等互连。

使用双栈网络设置 BGP 负载均衡

从 Google Distributed Cloud 1.14.0 版开始,基于 BGP 的捆绑式负载平衡器支持 IPv6。通过引入 IPv6 支持,您可以在配置使用双栈网络的集群上配置 IPv6 和双栈 LoadBalancer Service。本部分介绍使用 BGP 配置双栈捆绑式负载均衡所需的更改。

如需启用双栈 LoadBalancer Service,需要进行以下配置更改:

  • 底层集群必须配置为使用双栈网络:

    • spec.clusterNetwork.services.cidrBlocks 下的集群配置文件中同时指定 IPv4 和 IPv6 Service CIDR。

    • 定义适当的 ClusterCIDRConfig 资源,以便为 Pod 指定 IPv4 和 IPv6 CIDR 范围。

    如需详细了解如何为双栈网络配置集群,请参阅 IPv4/IPv6 双栈网络

  • spec.loadBalancer.addressPools 下的集群配置文件中指定 IPv6 地址池。为了让 MetalLB 将 IP 地址分配给双栈服务,必须至少有一个地址池同时具有 IPv4 和 IPv6 格式地址。

以下示例配置突出显示了具有 BGP 的双栈捆绑式负载均衡所需的更改:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
...
  clusterNetwork:
  services:
      cidrBlocks:
      # Dual-stack Service IP addresses must be provided
      - 10.96.0.0/16
      - fd00::/112
...
  loadBalancer:
    mode: bundled

    # type can be 'bgp' or 'layer2'. If no type is specified we default to layer2.
    type: bgp

    # AS number for the cluster
    localASN: 65001

    bgpPeers:
    - ip: 10.8.0.10
      asn: 65002
    - ip: 10.8.0.11
      asn: 65002

    addressPools:
    - name: pool1
      addresses:
      # Each address must be either in the CIDR form (1.2.3.0/24)
      # or range form (1.2.3.1-1.2.3.5).
      - "203.0.113.1-203.0.113.20"
      - "2001:db8::1-2001:db8::20"  # Note the additional IPv6 range

... # Other cluster config info omitted
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
  name: cluster-wide-1
  namespace: cluster-bm
spec:
  ipv4:
    cidr: "192.168.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2001:db8:1::/112"
    perNodeMaskSize: 120

具有 BGP 的双栈捆绑式负载均衡的限制

将集群配置为使用具有 BGP 的双栈捆绑式负载均衡时,请注意以下限制:

  • 不支持 IPv6 控制平面负载均衡。

  • 虽然不支持 IPv6 BGP 会话,但 IPv6 路由可以使用多协议 BGP 通过 IPv4 会话通告。

配置示例

以下部分演示了如何为不同选项或行为配置基于 BGP 的负载均衡。

配置所有节点使用相同的对等体

如下图所示,此配置会生成一组外部对等体(10.8.0.1010.8.0.11),可供所有节点访问。控制平面节点(10.0.1.1010.0.1.1110.0.2.10)和分配给数据平面节点的浮动 IP 地址(10.0.1.10010.0.2.100)都可以访问这些对等体。

loadBalancer Services 对等互连预留的浮动 IP 地址(10.0.1.10010.0.2.100)均可访问同一外部对等体。浮动 IP 地址可以分配给位于同一子网中的节点。

BGP 负载均衡,也就是所有节点都使用相同的对等体

如以下集群配置示例所示,您可以在不指定 controlPlaneNodes 的情况下为控制平面节点 bgpPeers 配置对等体。如果没有为对等体指定节点,则所有控制平面节点会连接到所有对等体。

您可以在 NetworkGatewayGroup 自定义资源中指定用于 Service 负载均衡对等互连会话的浮动 IP 地址。在此示例中,由于未指定 BGPLoadBalancer,因此控制平面对等方会自动用于数据平面 BGP 会话。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
...
  loadBalancer:
    mode: bundled

    # type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
    type: bgp

    # AS number for the cluster
    localASN: 65001

    bgpPeers:
    - ip: 10.8.0.10
      asn: 65002
    - ip: 10.8.0.11
      asn: 65002

... (other cluster config omitted)
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

将特定控制平面节点配置为与特定外部对等体对等互连

如下图所示,此配置生成两个控制平面节点(10.0.1.1010.0.1.11),这两个节点与一个外部对等体 (10.0.1.254) 对等互连。第三个控制平面节点 (10.0.2.10) 与另一个外部对等体 (10.0.2.254) 对等互连。如果您不希望所有节点连接到所有对等体,此配置非常有用。例如,您可能希望控制平面节点仅与其对应的架顶式 (ToR) 交换机对等互连。

为服务负载均衡对等互连会话预留的任一浮动 IP 地址(10.0.1.10010.0.2.100)均可访问相同的外部对等体。浮动 IP 地址可以分配给位于同一子网中的节点。

包含明确将控制平面节点映射到对等体的 BGP 负载均衡

如以下集群配置示例所示,您可以通过在 bgpPeers 部分的对等体的 controlPlaneNodes 字段中指定 IP 地址,限制哪些控制平面节点可以连接到给定对等体。

您可以在 NetworkGatewayGroup 自定义资源中指定用于 Service 负载均衡对等互连会话的浮动 IP 地址。在此示例中,由于未指定 BGPLoadBalancer,因此控制平面对等方会自动用于数据平面 BGP 会话。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
...
  loadBalancer:
    mode: bundled

    # type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
    type: bgp

    # AS number for the cluster
    localASN: 65001

    bgpPeers:
    - ip: 10.0.1.254
      asn: 65002
      controlPlaneNodes:
        - 10.0.1.10
        - 10.0.1.11
    - ip: 10.0.2.254
      asn: 65002
      controlPlaneNodes:
        - 10.0.2.10

... (other cluster config omitted)
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

单独配置控制平面和数据平面

如下图所示,此配置生成两个控制平面节点(10.0.1.1010.0.1.11),这两个节点与一个外部对等体 (10.0.1.254) 对等互连。第三个控制平面节点 (10.0.2.11) 与另一个外部对等体 (10.0.2.254) 对等互连。

为服务负载均衡对等互连会话预留的任一浮动 IP 地址(10.0.3.10010.0.3.101)均可访问第三个外部对等体 (10.0.3.254)。浮动 IP 地址可以分配给位于同一子网中的节点。

包含单独配置控制平面和数据平面的 BGP 负载均衡

如以下集群配置示例所示,您可以通过在 bgpPeers 部分的对等体的 controlPlaneNodes 字段中指定 IP 地址,限制哪些控制平面节点可以连接到给定对等体。

您可以在 NetworkGatewayGroup 自定义资源中指定用于 Service 负载均衡对等互连会话的浮动 IP 地址。

如需配置数据平面负载均衡,请执行以下操作:

  • BGPPeer 资源中指定数据平面的外部对等方,并添加用于对等方选择的标签,例如 cluster.baremetal.gke.io/default-peer: "true"

  • 指定 BGPLoadBalancer 资源中 peerSelector 字段的匹配标签。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
...
  loadBalancer:
    mode: bundled

    # type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
    type: bgp

    # AS number for the cluster
    localASN: 65001

    bgpPeers:
    - ip: 10.0.1.254
      asn: 65002
      controlPlaneNodes:
        - 10.0.1.10
        - 10.0.1.11
    - ip: 10.0.2.254
      asn: 65002
      controlPlaneNodes:
        - 10.0.2.11

... (other cluster config omitted)
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.3.100
  - 10.0.3.101
---
apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
  name: default
  namespace: cluster-bm
spec:
  peerSelector:
    cluster.baremetal.gke.io/default-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm
  labels:
    cluster.baremetal.gke.io/default-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

修改基于 BGP 的负载均衡配置

在创建集群并配置为使用 BGP 进行捆绑式负载均衡后,某些配置设置可以更新,但某些配置设置在创建集群后无法更新。

对 BGP 相关资源(NetworkGatewayGroup、BGPLoadBalancer 和 BGPPeer)进行后续更新时,请使用管理员集群 kubeconfig 文件。然后,管理员集群将协调对用户集群的更改。如果您在用户集群上直接修改这些资源,则管理员集群会在后续协调中覆盖您的更改。

控制平面

您可以在 Cluster 资源中更新控制平面 BGP 对等互连信息。您可以添加或移除控制平面负载均衡部分中指定的对等方。

以下各部分概述了更新控制平面 BGP 对等互连信息的最佳实践。

检查对等方状态,然后再更新

为了最大限度地减少对等方配置错误的风险,请在进行更改之前检查控制平面 BGP 对等互连会话是否处于预期状态。例如,如果您预计所有 BGP 对等互连会话当前都已启动,请验证所有 bgp-advertiser Pod 是否报告 ready,这表示会话已启动。如果当前状态与预期不符,请在更新对等方配置之前解决问题。

如需了解如何检索控制平面 BGP 会话详细信息,请参阅控制平面 BGP 会话

以可控方式更新对等方

如果可能,请一次更新一个对等方,以帮助隔离可能的问题:

  1. 添加或更新单个对等方。
  2. 等待配置协调。
  3. 验证集群是否能够连接到新的或更新后的对等方。
  4. 移除旧的或不需要的对等方。

Service

如需更新地址池和负载均衡器节点设置,请修改 Cluster 资源中的 nodePoolSpec

如需在创建集群后修改 BGP 对等互连配置,请修改 NetworkGatewayGroupBGPLoadBalancer 自定义资源。对这些自定义资源中的对等互连信息所做的任何修改都会反映在目标集群中的负载均衡解决方案配置中。

仅在管理员集群的集群命名空间中的源资源中进行更新。对目标(用户)集群中的资源进行的任何修改都会被覆盖。

问题排查

以下各部分介绍了如何访问使用 BGP 进行捆绑式负载均衡的问题排查信息。

控制平面 BGP 会话

控制平面 BGP 对等互连配置将在集群创建期间通过预检检查进行验证。预检检查会尝试执行以下操作:

  • 与每个对等体建立 BGP 连接。
  • 通告控制平面 VIP。
  • 验证是否可以使用 VIP 访问控制平面节点。

如果您的集群创建未通过预检检查,请查看预检检查日志是否有错误。带有时间戳的预检检查日志文件位于 baremetal/bmctl-workspace/CLUSTER_NAME/log 目录中。

在运行时,控制平面 BGP 发言者在每个控制平面节点上作为静态 pod 运行,并将事件信息写入日志。这些静态 pod 的名称中包含“bgpadvertiser”,因此使用以下 kubectl get pods 命令可查看 BGP 发言者 Pod 的状态:

kubectl -n kube-system get pods | grep bgpadvertiser

Pod 正常运行时,响应如下所示:

bgpadvertiser-node-01                            1/1     Running   1          167m
bgpadvertiser-node-02                            1/1     Running   1          165m
bgpadvertiser-node-03                            1/1     Running   1          163m

使用以下命令查看 bgpadvertiser-node-01 Pod 的日志:

kubectl -n kube-system logs bgpadvertiser-node-01

服务 BGP 会话

BGPSession 资源提供有关当前 BGP 会话的信息。如需获取会话信息,请先获取当前会话,然后检索其中一个会话的 BGPSession 资源。

使用以下 kubectl get 命令列出当前会话:

kubectl -n kube-system get bgpsessions

该命令会返回会话列表,如下例所示:

NAME                 LOCAL ASN   PEER ASN   LOCAL IP     PEER IP      STATE            LAST REPORT
10.0.1.254-node-01   65500       65000      10.0.1.178   10.0.1.254   Established      2s
10.0.1.254-node-02   65500       65000      10.0.3.212   10.0.1.254   Established      2s
10.0.3.254-node-01   65500       65000      10.0.1.178   10.0.3.254   Established      2s
10.0.3.254-node-02   65500       65000      10.0.3.212   10.0.3.254   Established      2s

使用以下 kubectl describe 命令获取 10.0.1.254-node-01 BGP 会话的 BGPSession 资源:

kubectl -n kube-system describe bgpsession 10.0.1.254-node-01

返回的 BGPSession 资源应如以下示例所示:

Name:         10.0.1.254-node-01
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1
Kind:         BGPSession
Metadata:
 (omitted)
Spec:
  Floating IP:  10.0.1.178
  Local ASN:    65500
  Local IP:     10.0.1.178
  Node Name:    node-01
  Peer ASN:     65000
  Peer IP:      10.0.1.254
Status:
  Advertised Routes:
    10.0.4.1/32
  Last Report Time:  2021-06-14T22:09:36Z
  State:             Established

使用 kubectl get 命令获取 BGPAdvertisedRoute 资源:

kubectl -n kube-system get bgpadvertisedroutes

响应应如以下示例所示,显示当前通告的路由:

NAME                                    PREFIX           METRIC
default-default-load-balancer-example   10.1.1.34/32
default-gke-system-istio-ingress        10.1.1.107/32

使用 kubectl describe 查看有关每个路由通告的下一个跃点的详细信息。

恢复对自行管理集群的控制平面 VIP 地址的访问权限

如需重新访问管理员集群、混合集群或独立集群上的控制平面 VIP 地址,您必须更新集群上的 BGP 配置。如以下命令示例所示,使用 SSH 连接到节点,然后使用 kubectl 打开集群资源进行修改。

ssh -i IDENTITY_FILE root@CLUSTER_NODE_IP

kubectl --kubeconfig /etc/kubernetes/admin.conf edit -n CLUSTER_NAMESPACE cluster CLUSTER_NAME

请替换以下内容:

  • IDENTITY_FILE:包含用于公钥身份验证的身份密钥的 SSH 身份文件的名称。
  • CLUSTER_NODE_IP:集群节点的 IP 地址。
  • CLUSTER_NAMESPACE:集群的命名空间。
  • CLUSTER_NAME:集群的名称。

修改集群对象中的 BGP 对等互连配置。保存新的集群配置后,监控 bgpadvertiser pod 的运行状况。如果配置有效,则 pod 连接到对等方后,会重启并正常运行。

手动 BGP 验证

本部分包含手动验证 BGP 配置的说明。该过程会建立一条长时间运行的 BGP 连接,以便您与网络团队进一步调试 BGP 配置。在创建集群之前,请使用此过程验证您的配置,或者在与 BGP 相关的预检检查失败时使用此过程。

预检检查会自动执行以下 BGP 验证任务:

  • 建立与对等体的 BGP 连接。
  • 通告控制平面 VIP。
  • 验证从所有其他集群节点发送到 VIP 地址的流量是否到达当前负载均衡器节点。

这些任务在每个控制平面节点上针对每个 BGP 对等体运行。在创建集群时,成功完成这些检查至关重要。但是,预检检查不会创建长时间运行的连接,因此排查故障很困难。

以下部分介绍了如何设置 BGP 连接并通告从单个集群机器到一个对等体的路由。如需测试多台机器和多个对等体,请使用其他机器和对等体组合再次按照这些说明执行操作。

请记住,BGP 连接是从控制平面节点建立的,因此请务必从一个计划的控制平面节点测试此过程。

获取 BGP 测试程序二进制文件

请在管理员工作站上执行本部分中的步骤。这些步骤会获取 bgpadvertiser 程序,用于测试 BGP 连接并将其复制到您要测试的控制平面节点。

  1. 拉取 ansible-runner Docker 映像。

    不使用注册表镜像

    如果不使用注册表镜像,请运行以下命令来拉取 ansible-runner Docker 映像:

    gcloud auth login
    gcloud auth configure-docker
    docker pull gcr.io/anthos-baremetal-release/ansible-runner:1.10.0-gke.13
    

    使用注册表镜像

    如果您使用注册表镜像,请运行以下命令来拉取 ansible-runner Docker 映像:

    docker login REGISTRY_HOST
    docker pull REGISTRY_HOST/anthos-baremetal-release/ansible-runner:1.10.0-gke.13
    

    REGISTRY_HOST 替换为您的注册表镜像服务器的名称。

  2. 提取 bgpadvertiser 二进制文件。

    不使用注册表镜像

    如需提取 bgpadvertiser 二进制文件,请运行以下命令:

    docker cp $(docker create gcr.io/anthos-baremetal-release/ansible-runner:1.10.0-gke.13):/bgpadvertiser .
    

    使用注册表镜像

    如需提取 bgpadvertiser 二进制文件,请运行以下命令:

    docker cp $(docker create REGISTRY_HOST/anthos-baremetal-release/ansible-runner:1.10.0-gke.13):/bgpadvertiser .
    
  3. 如需将 bgpadvertiser 二进制文件复制到您要测试的控制平面节点,请运行以下命令:

    scp bgpadvertiser USERNAME>@CP_NODE_IP:/tmp/
    

    请替换以下内容:

    • USERNAME:用于访问控制平面节点的用户名。

    • CP_NODE_IP:控制平面节点的 IP 地址。

设置 BGP 连接

在控制平面节点上执行本部分中的步骤。

  1. 在节点上创建一个配置文件 (/tmp/bgpadvertiser.conf),如下所示:

    localIP: NODE_IP
    localASN: CLUSTER_ASN
    peers:
    - peerIP: PEER_IP
      peerASN: PEER_ASN
    

    请替换以下内容:

    • NODE_IP:您正在使用的控制平面节点的 IP 地址。
    • CLUSTER_ASN:集群使用的自治系统编号。
    • PEER_IP:您要测试的某个外部对等体的 IP 地址。
    • PEER_ASN:外部对等设备所属网络的自治系统编号。
  2. 运行 bgpadvertiser 守护程序,注意替换以下命令中的控制平面 VIP 地址:

    /tmp/bgpadvertiser --config /tmp/bgpadvertiser.conf --advertise-ip CONTROL_PLANE_VIP
    

    CONTROL_PLANE_VIP 替换为您要用于控制平面 VIP 地址的 IP 地址。此命令会使 BGP 通告方向对等体通告此地址。

  3. 查看程序输出结果。

    此时,bgpadvertiser 守护程序启动,尝试连接到对等体并通告 VIP 地址。BGP 连接建立后,该程序会定期输出包含 BGP_FSM_ESTABLISHED 的消息(请参阅以下示例输出结果)。

    {"level":"info","ts":1646788815.5588224,"logger":"BGPSpeaker","msg":"GoBGP gRPC debug endpoint disabled","localIP":"21.0.101.64"}
    {"level":"info","ts":1646788815.5596201,"logger":"BGPSpeaker","msg":"Started.","localIP":"21.0.101.64"}
    I0309 01:20:15.559667 1320826 main.go:154] BGP advertiser started.
    I0309 01:20:15.561434 1320826 main.go:170] Health status HTTP server started at "127.0.0.1:8080".
    INFO[0000] Add a peer configuration for:21.0.101.80      Topic=Peer
    {"level":"info","ts":1646788815.5623345,"logger":"BGPSpeaker","msg":"Peer added.","localIP":"21.0.101.64","peer":"21.0.101.80/4273481989"}
    DEBU[0000] IdleHoldTimer expired                         Duration=0 Key=21.0.101.80 Topic=Peer
    I0309 01:20:15.563503 1320826 main.go:187] Peer applied: {4273481989 21.0.101.80}
    DEBU[0000] state changed                                 Key=21.0.101.80 Topic=Peer new=BGP_FSM_ACTIVE old=BGP_FSM_IDLE reason=idle-hold-timer-expired
    DEBU[0000] create Destination                            Nlri=10.0.0.1/32 Topic=Table
    {"level":"info","ts":1646788815.5670514,"logger":"BGPSpeaker","msg":"Route added.","localIP":"21.0.101.64","route":{"ID":0,"Metric":0,"NextHop":"21.0.101.64","Prefix":"10.0.0.1/32","VRF":""}}
    I0309 01:20:15.568029 1320826 main.go:199] Route added: {0 0 21.0.101.64 10.0.0.1/32 }
    I0309 01:20:15.568073 1320826 main.go:201] BGP advertiser serving...
    DEBU[0005] try to connect                                Key=21.0.101.80 Topic=Peer
    DEBU[0005] state changed                                 Key=21.0.101.80 Topic=Peer new=BGP_FSM_OPENSENT old=BGP_FSM_ACTIVE reason=new-connection
    DEBU[0005] state changed                                 Key=21.0.101.80 Topic=Peer new=BGP_FSM_OPENCONFIRM old=BGP_FSM_OPENSENT reason=open-msg-received
    INFO[0005] Peer Up                                       Key=21.0.101.80 State=BGP_FSM_OPENCONFIRM Topic=Peer
    DEBU[0005] state changed                                 Key=21.0.101.80 Topic=Peer new=BGP_FSM_ESTABLISHED old=BGP_FSM_OPENCONFIRM reason=open-msg-negotiated
    DEBU[0005] sent update                                   Key=21.0.101.80 State=BGP_FSM_ESTABLISHED Topic=Peer attributes="[{Origin: i} 4273481990 {Nexthop: 21.0.101.64}]" nlri="[10.0.0.1/32]" withdrawals="[]"
    DEBU[0006] received update                               Key=21.0.101.80 Topic=Peer attributes="[{Origin: i} 4273481989 4273481990 {Nexthop: 21.0.101.64}]" nlri="[10.0.0.1/32]" withdrawals="[]"
    DEBU[0006] create Destination                            Nlri=10.0.0.1/32 Topic=Table
    DEBU[0035] sent                                          Key=21.0.101.80 State=BGP_FSM_ESTABLISHED Topic=Peer data="&{{[] 19 4} 0x166e528}"
    DEBU[0065] sent                                          Key=21.0.101.80 State=BGP_FSM_ESTABLISHED Topic=Peer data="&{{[] 19 4} 0x166e528}"
    

如果您没有看到这些消息,请仔细检查配置文件中的 BGP 配置参数,并跟网络管理员确认一下。现在,您已经设置了 BGP 连接。您可以跟网络管理员确认他们是否看到自己的那一端已建立连接,以及是否看到通告给他们的路由。

流量测试

如需测试网络可以将流量转发到 VIP 地址,您必须将 VIP 地址添加到正在运行 bgpadvertiser 的控制平面节点。在其他终端中运行以下命令,以便让 bgpadvertiser 保持运行状态:

  1. 将 VIP 地址添加到您的控制平面节点:

    ip addr add CONTROL_PLANE_VIP/32 dev INTF_NAME
    

    请替换以下内容:

    • CONTROL_PLANE_VIPbgpadvertiser 的 VIP 地址 --advertise-ip 参数。
    • INTF_NAME:节点上的 Kubernetes 接口。也就是说,该接口具有您在 loadBalancer.bgpPeers.controlPlaneNodes 的 Google Distributed Cloud 配置中设置的 IP 地址。
  2. 从其他节点对 VIP 地址运行 ping 命令:

    ping CONTROL_PLANE_VIP
    

    如果 ping 命令不成功,则网络设备上的 BGP 配置可能存在问题。请与您的网络管理员合作验证配置并解决问题。

清理

在手动验证 BGP 正常运行后,请务必按照以下步骤重置节点。如果您没有正确重置节点,则手动设置可能会干扰预检检查或后续集群创建。

  1. 如果您为流量测试添加了 VIP 地址,请从控制平面节点中移除该地址:

    ip addr del CONTROL_PLANE_VIP/32 dev INTF_NAME
    
  2. 在控制平面节点上的 bgpadvertiser 终端中,按 Ctrl+C 以停止 bgpadvertiser。

  3. 验证没有 bgpadvertiser 进程正在运行:

    ps -ef | grep bgpadvertiser
    
  4. 如果您看到有进程正在运行,请使用 kill 命令停止这些进程。