使用 BGP 設定套裝組合的負載平衡器

搭配邊界閘道通訊協定 (BGP) 的套裝組合負載平衡器,可讓您透過外部 BGP (eBGP),為 Google Distributed Cloud 叢集的控制層和 ServiceType LoadBalancer Service advertise 虛擬 IP 位址 (VIP)。叢集網路會做為自治系統,與外部網路對等互連。如果網路使用等價多路徑 (ECMP) 轉送和 BGP ADD-PATH,這項功能會提供 N 向主動/主動負載平衡,加快容錯移轉速度,並提高頻寬使用效率。這項服務可與支援 eBGP 的第三方機架頂端 (ToR) 交換器和路由器搭配使用。執行軟體定義網路 (SDN) 堆疊的資料中心,也可以將第 3 層邊界一路推送到叢集。

這項功能適用於所有叢集類型,但管理員叢集僅支援控制層負載平衡。如要在 GKE On-Prem API 中設定這項功能,請對使用者叢集使用 BareMetalLoadBalancerConfig,或在 1.34 以上版本中,對管理員叢集使用 BareMetalAdminLoadBalancerConfig。

搭配 BGP 的隨附負載平衡功能運作方式

以下各節將簡要說明搭配 BGP 的套裝負載平衡器如何運作。

BGP 對接

具備 BGP 功能的套裝負載平衡器會啟動多個連至基礎架構的 BGP 連線。BGP 須符合下列技術相關規定:

  • 控制層 VIP 和服務 VIP 的對接工作階段是分開的。
  • 控制層對接工作階段是從控制層節點的 IP 位址啟動。
  • 服務對接工作階段會從您在 NetworkGatewayGroup 自訂資源中指定的浮動 IP 位址啟動。
  • GDC 控制器的網路閘道會管理浮動 IP 位址。
  • 採用 BGP 的套裝負載平衡功能僅支援 eBGP 對接。
  • 預設支援多躍點對等互連。
  • 不支援 BGP 工作階段的 MD5 密碼。
  • 不支援 IPv6 型對等互連工作階段。
  • advertise 至任何對等點的路由,預期會重新發布至整個網路,並可從叢集中的任何其他位置連線。
  • 建議在對等互連工作階段中,以接收模式使用 BGP ADD-PATH 功能。
  • 從每個對等互連點通告多個路徑,會產生主動/主動負載平衡。
  • 請為網路啟用等價多路徑轉送 (ECMP),以便使用多個路徑,將流量分散到一組負載平衡器節點。
  • 在外部對等互連 (例如機架頂端交換器) 上,以被動模式設定 BGP 工作階段。叢集節點和浮動 IP 位址會做為運作中的對等互連,並啟動 BGP 對等互連工作階段。

控制層負載平衡

叢集中的每個控制層節點都會與基礎架構中的一或多個對等互連建立 BGP 工作階段。每個控制層節點都必須至少有一個對等互連。在叢集設定檔中,您可以設定哪些控制層節點要連線至哪些外部對等互連。

下圖顯示控制層對接範例。叢集在一個子網路中有兩個控制層節點,在另一個子網路中有一個控制層節點。每個子網路中都有一個外部對等互連 (TOR),Google Distributed Cloud 控制層節點會與其 TOR 對等互連。

使用 BGP 對等互連進行服務負載平衡

服務負載平衡

除了從每個控制層節點啟動的對等互連工作階段 (用於控制層對等互連),系統也會為 LoadBalancer 服務啟動額外的對等互連工作階段。這些對等互連工作階段並非直接從叢集節點 IP 位址啟動,而是使用浮動 IP 位址。

支援採用 externalTrafficPolicy=Local 網路政策的服務。不過,externalTrafficPolicy=Local 設定取決於工作負載,每當支援 Service 的 Pod 從節點新增或完全移除時,就會導致路徑更新。這項路由更新行為可能會導致等價多路徑 (ECMP) 路由變更流量,進而造成流量下降。

浮動 IP 位址

如要使用 Service 負載平衡功能,您必須在叢集節點子網路中預留浮動 IP 位址,用於 BGP 對等互連。叢集至少需要一個浮動 IP 位址,但建議您至少保留兩個位址,確保 BGP 工作階段具備高可用性。浮動 IP 位址是在 NetworkGatewayGroup 自訂資源 (CR) 中指定,可包含在叢集設定檔中。

浮動 IP 位址可讓您不必擔心將 BGP 揚聲器 IP 位址對應至節點。GDC 網路閘道控制器會將 NetworkGatewayGroup 指派給節點,並管理浮動 IP 位址。如果節點故障,GDC 網路閘道控制器會重新指派浮動 IP 位址,確保外部對等互連端有確定的 IP 位址可進行對等互連。

外部對等互連

如要進行資料層負載平衡,您可以使用在叢集設定檔的 loadBalancer.controlPlaneBGP 區段中,為控制層對等互連指定的相同外部對等互連。或者,您也可以指定不同的 BGP 對等互連。

如要為資料層對等互連指定不同的 BGP 對等互連,請將 BGPLoadBalancer 和 BGPPeer 資源規格附加至叢集設定檔。如未指定這些自訂資源,系統會自動將控制層對等互連用於資料層。

您可以在 BGPPeer 自訂資源中,指定用於對等互連工作階段的外部對等互連,並使用浮動 IP 位址,然後將該資源新增至叢集設定檔。BGPPeer 資源包含標籤,可供對應的 BGPLoadBalancer 自訂資源識別。您可以在 BGPLoadBalancer 自訂資源的 peerSelector 欄位中指定相符的標籤,選取要使用的 BGPPeer。

GDC 網路閘道控制器會嘗試從一組保留的浮動 IP 位址,與每個外部對等互連建立工作階段 (可設定工作階段數量)。建議您至少指定兩個外部對等互連,確保 BGP 工作階段的高可用性。每個指定用於服務負載平衡的外部對等互連,都必須設為與 NetworkGatewayGroup 自訂資源中指定的每個浮動 IP 位址對等互連。

負載平衡器節點

叢集中的部分節點會用於負載平衡,也就是說,這些節點會宣告可接受傳入的負載平衡流量。這組節點預設為控制層節點集區,但您可以在叢集設定檔的 loadBalancer 區段中指定其他節點集區。如果指定節點集區,系統會將該集區用於負載平衡器節點,而非控制層節點集區。

浮動 IP 位址 (做為 BGP 揚聲器) 不一定會在負載平衡器節點上執行。浮動 IP 位址會指派給相同子網路中的節點,並從該節點啟動對等互連,無論該節點是否為負載平衡器節點。不過,透過 BGP 公告的下一個躍點一律是負載平衡器節點。

對等互連拓撲範例

下圖顯示使用 BGP 對接的 Service 負載平衡範例。有兩個浮動 IP 位址指派給各自子網路中的節點。定義了兩個外部對等互連。每個浮動 IP 都會與兩個外部對等互連。

使用 BGP 對等互連進行服務負載平衡

設定 BGP 負載平衡器

以下各節說明如何設定叢集和外部網路,以便搭配 BGP 使用套裝組合負載平衡器。

規劃與外部基礎架構的整合

如要搭配使用 BGP 和套裝負載平衡器,您必須設定外部基礎架構:

  • 外部基礎架構必須設為與叢集中的每個控制層節點對等互連,才能設定控制層通訊。這些對接工作階段用於 advertise Kubernetes 控制層 VIP。

  • 外部基礎架構必須設為與一組保留的浮動 IP 位址對等互連,以便進行資料層通訊。浮動 IP 位址用於 Service VIP 的 BGP 對等互連。建議您使用兩個浮動 IP 位址和兩個對等互連,確保 BGP 工作階段的高可用性。如要瞭解如何保留浮動 IP,請參閱設定叢集,使用 BGP 進行隨附負載平衡。

設定基礎架構後,請將 BGP 對接資訊新增至叢集設定檔。您建立的叢集可以與外部基礎架構啟動對等互連工作階段。

設定叢集,使用 BGP 隨附的負載平衡功能

建立叢集時,您可以在叢集設定檔中啟用及設定隨附的負載平衡功能 (搭配 BGP)。在叢集設定檔中,啟用進階網路功能並更新 loadBalancer 區段。您也會附加下列三項自訂資源的規格:

  • NetworkGatewayGroup:指定用於服務 BGP 對接工作階段的浮動 IP 位址。

  • BGPLoadBalancer:使用標籤選取器指定哪些對等互連用於 BGP 負載平衡。

  • BGPPeer:指定個別對等互連,包括用於選取 BGP 對等互連工作階段的標籤。

下列操作說明說明如何設定叢集和三個自訂資源,以設定 BGP 搭配套裝組合負載平衡。

  1. 在叢集設定檔的 clusterNetwork 區段中,新增 advancedNetworking 欄位並設為 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,並新增 type 欄位,值為 bgp。

    這些欄位值可啟用以 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.ports、loadBalancer.vips 和 loadBalancer.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 交換器) 進行對等互連的節點。每行一個閘道,可輸入多個項目來選取多個 NetworkGatewayGroup。

    您可以建立額外的 BGPPeer 自訂資源,指定多個外部對等互連。建議您指定至少兩個外部對等互連 (兩個自訂資源),確保 BGP 工作階段具備高可用性。如未指定 BGPPeer 自訂資源,系統會自動使用控制層對等互連,進行資料層負載平衡。

  9. 執行 bmctl cluster create 建立叢集時,系統會執行預檢。除了其他檢查外,預檢也會驗證控制層的 BGP 對接設定,並在建立叢集前,直接向管理員工作站回報任何問題。

    成功後,新增的 BGP 負載平衡資源 (NetworkGatewayGroup、BGPLoadBalancer 和 BGPPeer) 會進入使用者叢集命名空間中的管理員叢集。後續更新這些資源時,請使用管理員叢集 kubeconfig 檔案。管理員叢集接著會協調使用者叢集的變更。如果您直接在使用者叢集上編輯這些資源,管理員叢集會在後續協調作業中覆寫您的變更。

建議您按照 RFC 7911 的規定,在對等互連工作階段中使用 BGP ADD-PATH 功能。根據預設,BGP 通訊協定只允許為單一前置碼向對等互連端 advertise 單一下一個躍點。BGP ADD-PATH 可為相同前置字元 advertise 多個下一個躍點。ADD-PATH 與 BGP 綁定式負載平衡搭配使用時,叢集可將多個叢集節點,公告為負載平衡器服務 (前置字元) 的前端節點 (下一個躍點)。在網路中啟用 ECMP,以便將流量分散到多個路徑。將多個叢集節點做為下一個躍點,即可分散流量,進而提升資料層容量,達到負載平衡。

如果外部對等互連裝置 (例如機架頂端 (ToR) 交換器或路由器) 支援 BGP ADD-PATH,只要開啟接收擴充功能即可。即使沒有 ADD-PATH 功能,與 BGP 搭配使用的組合式負載平衡仍可運作,但每個對接工作階段只能 advertise 一個負載平衡節點,因此負載平衡器資料層容量會受到限制。如果沒有 ADD-PATH,Google Distributed Cloud 會從負載平衡器節點集區中挑選要 advertise 的節點,並嘗試將不同 VIP 的下一個躍點分散到不同節點。

限制 BGP 對接至負載平衡器節點

Google Distributed Cloud 會在與浮動 IP 位址相同的子網路中,自動指派浮動 IP 位址給任何節點。即使 BGP 工作階段未落在負載平衡器節點上,也會從這些 IP 位址啟動。這是刻意設計的行為,因為我們已將控制層 (BGP) 與資料層 (LB 節點集區) 分離。

如要限制可用於 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 位址分配給雙重堆疊 Service,至少須有一個位址集區同時具有 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 工作階段,但可以使用多通訊協定 BGP,透過 IPv4 工作階段 advertise IPv6 路由。

設定範例

下列各節說明如何為不同選項或行為設定 BGP 負載平衡。

將所有節點設為使用相同的對等互連

如下圖所示,這項設定會產生一組所有節點都能連上的外部對等互連 (10.8.0.10 和 10.8.0.11)。指派給資料層節點的控制層節點 (10.0.1.10、10.0.1.11 和 10.0.2.10) 和浮動 IP 位址 (10.0.1.100 和 10.0.2.100) 都會連至對等互連。

相同的外部對等互連端點,可透過為loadBalancer服務對等互連保留的任一浮動 IP 位址 (10.0.1.100 或 10.0.2.100) 連線。浮動 IP 位址可以指派給位於相同子網路中的節點。

所有節點使用相同對等互連的 BGP 負載平衡

如下列叢集設定範例所示,您要為控制層節點 bgpPeers 設定對等互連,但不指定 controlPlaneNodes。如果未指定對等點的節點,所有控制層節點都會連線至所有對等點。

您可以在 NetworkGatewayGroup 自訂資源中,指定要用於服務負載平衡對接工作階段的浮動 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.10 和 10.0.1.11) 與一個外部對接 (10.0.1.254) 對接。第三個控制層節點 (10.0.2.10) 與另一個外部對接 (10.0.2.254) 對接。如果您不希望所有節點都連線至所有對接,這項設定就非常實用。舉例來說,您可能希望控制層節點只與對應的機架頂端 (ToR) 交換器對等互連。

為服務負載平衡對接工作階段預留的浮動 IP 位址 (10.0.1.100 或 10.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.10 和 10.0.1.11),與一個外部對等互連 (10.0.1.254) 對等互連,而第三個控制層節點 (10.0.2.11) 則與另一個外部對等互連 (10.0.2.254) 對等互連。

第三個外部對等互連 (10.0.3.254) 可透過為服務負載平衡對等互連工作階段保留的任一浮動 IP 位址 (10.0.3.100 或 10.0.3.101) 連線。浮動 IP 位址可以指派給位於相同子網路的節點。

BGP 負載平衡,控制層和資料層分別設定

如下列叢集設定範例所示,您可以在 bgpPeers 區段中,為對等互連的 controlPlaneNodes 欄位指定 IP 位址,藉此限制哪些控制層節點可以連線至特定對等互連。

您可以在 NetworkGatewayGroup 自訂資源中,指定要用於服務負載平衡對接工作階段的浮動 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 檔案。管理員叢集接著會協調使用者叢集的變更。如果您直接在使用者叢集編輯這些資源,管理員叢集會在後續協調作業中覆寫您的變更。

控制層

控制層 BGP 對等互連資訊可在 Cluster 資源中更新。您可以在控制層負載平衡部分,新增或移除指定的對等互連。

下列各節概述更新控制層 BGP 對接資訊的最佳做法。

更新前請先檢查對等互連狀態

為盡可能降低對等互連設定錯誤的風險,請先確認控制層 BGP 對等互連工作階段處於預期狀態,再進行變更。舉例來說,如果您預期所有 BGP 對等互連工作階段都已啟動,請確認所有 bgp-advertiser Pod 都回報 ready,表示工作階段已啟動。如果目前狀態與預期不符,請先修正問題,再更新對等互連設定。

如要瞭解如何擷取控制層 BGP 工作階段詳細資料,請參閱「控制層 BGP 工作階段」。

以可控的方式更新對等互連

如果可以,請一次更新一個對等互連,以便找出可能的問題:

  1. 新增或更新單一對等互連。
  2. 等待設定全面生效。
  3. 確認叢集可以連線至新的或更新後的對等互連。
  4. 移除舊的或不需要的對等互連。

服務

如要更新位址集區和負載平衡器節點設定,請編輯 Cluster 資源中的 nodePoolSpec。

如要在叢集建立後修改 BGP 對接設定,請編輯 NetworkGatewayGroup 和 BGPLoadBalancer 自訂資源。對這些自訂資源中的對接資訊進行任何修改,都會反映在目標叢集的負載平衡解決方案設定中。

請只在管理員叢集的叢集命名空間中,更新來源資源。對目標 (使用者) 叢集中的資源所做的任何修改都會遭到覆寫。

疑難排解

下列各節說明如何存取 BGP 搭配套裝負載平衡的疑難排解資訊。

控制層 BGP 工作階段

建立叢集時,系統會透過預檢驗證控制層 BGP 對接設定。預檢會嘗試執行下列操作:

  • 與各個對等互連建立 BGP 連線。
  • advertise 控制層 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

回應應與以下範例類似,顯示正在 advertising 的路由:

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 查看各路由 advertise 的下一個躍點詳細資料。

復原自行管理叢集的控制層虛擬 IP 存取權

如要重新取得管理員、混合或獨立叢集的控制層 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 連線。
  • advertise 控制層 VIP。
  • 確認從所有其他叢集節點傳送至 VIP 的流量,都會到達目前的負載平衡器節點。

系統會為每個控制層節點上的各個 BGP 對等互連執行這些工作。建立叢集時,必須通過這些檢查。不過,預檢不會建立長時間執行的連線,因此難以偵錯失敗。

下列各節說明如何設定 BGP 連線,以及從單一叢集機器向一個對等互連點 advertise 路由。如要測試多部機器和多個對等互連,請使用不同的機器和對等互連組合,再次重複操作說明。

請注意,BGP 連線是從控制層節點建立,因此請務必從其中一個預定控制層節點測試這項程序。

取得 BGP 測試程式二進位檔

請在管理員工作站上執行本節中的步驟。這些步驟會取得用於測試 BGP 連線的 bgpadvertiser 程式,並將其複製到要測試的控制層節點。

  1. 提取 ansible-runner Docker 映像檔。

    不使用 Registry Mirror

    如果您不使用登錄檔鏡像,請執行下列指令,提取 ansible-runner Docker 映像檔:

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

    使用 Registry Mirror

    如果您使用 Registry 鏡像,請執行下列指令來提取 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 二進位檔。

    不使用 Registry Mirror

    如要擷取 bgpadvertiser 二進位檔,請執行下列指令:

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

    使用 Registry Mirror

    如要擷取 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 Daemon,並在下列指令中替換控制層 VIP:

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

    將 CONTROL_PLANE_VIP 替換為要用於控制層 VIP 的 IP 位址。這個指令會使 BGP 廣告主向對等互連廣告這個位址。

  3. 查看程式輸出內容。

    此時,bgpadvertiser 守護程序會啟動、嘗試連線至對等互連,並 advertise 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 連線。您可以向網路管理員確認,他們是否看到連線已建立,以及是否看到 advertise 給他們的路由。

流量測試

如要測試網路能否將流量轉送至 VIP,您必須將 VIP 新增至執行 bgpadvertiser 的控制層節點。在其他終端機中執行下列指令,讓 bgpadvertiser 保持執行狀態:

  1. 將 VIP 新增至控制層節點:

    ip addr add CONTROL_PLANE_VIP/32 dev INTF_NAME
    

    更改下列內容:

    • CONTROL_PLANE_VIP:bgpadvertiser 的 VIP --advertise-ip 引數。
    • INTF_NAME:節點上的 Kubernetes 介面。也就是說,該介面的 IP 位址是您在 Google Distributed Cloud 設定中為 loadBalancer.bgpPeers.controlPlaneNodes 輸入的位址。
  2. 從其他節點對 VIP 執行 ping 指令:

    ping CONTROL_PLANE_VIP
    

    如果連線偵測 (ping) 失敗,網路裝置上的 BGP 設定可能有問題。請與網路管理員合作,確認設定並解決問題。

清除所用資源

手動確認 BGP 正常運作後,請務必按照下列步驟重設節點。如果未正確重設節點,手動設定可能會干擾預檢或後續的叢集建立作業。

  1. 如果您為了流量測試而新增 VIP,請從控制層節點中移除 VIP:

    ip addr del CONTROL_PLANE_VIP/32 dev INTF_NAME
    
  2. 在控制層節點上,按下 bgpadvertiser 終端機中的 Ctrl+C,停止 bgpadvertiser。

  3. 確認沒有任何 bgpadvertiser 程序正在執行:

    ps -ef | grep bgpadvertiser
    
  4. 如果看到程序正在執行,請使用 kill 指令停止程序。

Cloud API/Terraform 的 BGP 選取器限制

使用 GKE On-Prem API (Terraform、 Google Cloud 控制台或gcloud CLI) 管理 Google Distributed Cloud 叢集時,無法在叢集設定中指定 BGP 選取器。如果叢集使用 BGP 負載平衡和輸出 NAT,BGP 對接可能會失敗。

解決方法

如要手動覆寫,您必須在管理員叢集中,將負載平衡器設定設為「unmanaged」。這項設定可防止 GKE On-Prem API 自動協調負載平衡器的變更。

  1. 強制執行 IP 反親和性:將 BGP NetworkGatewayGroup 拆分為獨立的 NetworkGatewayGroup 資源 (每個浮動 IP 一個),並在每個 NetworkGatewayGroup 中使用 nodeSelector,將浮動 IP 固定至特定實體節點。這可避免多個 BGP IP 落在同一個節點上。
  2. 取消管理負載平衡器:在管理員叢集中,從使用者叢集命名空間的 BGPLoadBalancer 資源中移除 baremetal.cluster.gke.io/managed: "true" 註解。這樣 GDC 控制器就不會還原您手動變更的內容。
  3. 修補 BGPPeer 資源:手動修補管理員叢集中的 BGPPeer 資源,新增參照正確 NetworkGatewayGroup 資源和浮動 IP 的 selectors 區塊。這些變更會同步至使用者叢集,並穩定 BGP 工作階段。