實作支援 BGP 的平面模式網路模型

本文說明如何實作支援邊界閘道通訊協定 (BGP) 的扁平模式網路模型。實作支援 BGP 的網路模型時,BGP 會動態確保不同第 2 層網域中的 Pod 可以彼此通訊。使用 BGP 的扁平模式網路有時也稱為動態扁平 IP。

如要進一步瞭解平面模式網路模型,請參閱「平面模式與島嶼模式網路模型」。

如何實作使用 BGP 的扁平模式網路

建立新叢集時,系統會啟用 BGP 的扁平模式網路。您無法為現有叢集啟用這項功能。啟用這項功能後,您可以變更部分設定。

如要在支援 BGP 的扁平模式網路模型上實作叢集,請按照下列步驟操作:

  1. 編輯叢集設定檔:

    • spec.clusterNetwork.advancedNetworking 欄位設為 true
    • 如要為 IPv4 啟用扁平模式網路,請將 spec.clusterNetwork.flatIPv4 欄位設為 true

      如需替代方案,請參閱「雙重堆疊叢集 (IPv4 Island、IPv6 Dynamic Flat IP)」,這會為叢集設定僅限 IPv6 的 Flat 模式網路。

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: bm
      namespace: cluster-bm
    spec:
      type: user
      ...
      clusterNetwork:
        advancedNetworking: true
        flatIPv4: true
      ...
    

    如果 spec.clusterNetwork.flatIPv4 設為 true,系統會忽略 spec.clusterNetwork.pods.cidrBlocks 欄位,且可以省略該欄位。不過,您需要在叢集設定檔中新增 ClusterCIDRConfigs 資訊清單 (每個節點、每個節點集區和/或每個叢集)。

  2. NetworkGatewayGroup 資訊清單附加至叢集設定檔:

    指定用於 BGP 對等互連的浮動 IP。確認資源名稱為 default,且命名空間為叢集命名空間。

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

    NetworkGatewayGroup 自訂資源會管理一或多個浮動 IP 位址的清單。BGP 對等互連工作階段是從您在 NetworkGatewayGroup 自訂資源中指定的浮動 IP 位址啟動。

  3. FlatIPMode 資訊清單附加至叢集設定檔:

    FlatIPMode 資源的名稱必須為 default,且命名空間為叢集命名空間。peerSelectorflatip-peer: "true" 與 BGP 對等互連物件 bgppeer1bgppeer2 中的標籤相符 (定義於下一個步驟),因此這兩個對等互連會用於扁平模式網路。

    下列 FlatIPMode 資訊清單適用於 IPv4 單一堆疊,以及使用 BGP 的扁平模式網路。如需其他設定,請參閱「設定範例」。

    ---
    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: FlatIPMode
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      enableBGPIPv4: true
      enableBGPIPv6: false
      peerSelector:
        flatip-peer: "true"
    
  4. 將一或多個 BGPPeer 資訊清單附加至叢集設定檔:

    您可以選擇資源的名稱,但所有 BGPPeer 資源都必須位於叢集命名空間中。

    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: bgppeer1
      namespace: cluster-bm
      labels:
        flatip-peer: "true"
    spec:
      localASN: 65001
      peerASN: 65000
      peerIP: 10.0.1.254
      sessions: 2
    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: bgppeer2
      namespace: cluster-bm
      labels:
        flatip-peer: "true"
    spec:
      localASN: 65001
      peerASN: 65000
      peerIP: 10.0.2.254
      sessions: 2
    
  5. ClusterCIDRConfig 資訊清單附加至叢集設定檔:

    CusterCIDRConfig 資源也必須位於叢集命名空間中。

    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
    

    ClusterCIDRConfig 是自訂資源,用於指定要動態分配給節點的 Pod CIDR 範圍。CNI 會使用節點上分配的 Pod CIDR 範圍,將 IP 位址分配給在節點上執行的個別 Pod。ClusterCIDRConfig 也用於雙堆疊網路。如要進一步瞭解 ClusterCIDRConfig 自訂資源,包括使用範例,請參閱「瞭解 ClusterCIDRConfig 自訂資源」。

  6. 建立叢集:

    bmctl create cluster
    

    如要進一步瞭解如何建立叢集,請參閱「叢集建立方式總覽」一文。

    如果您的環境支援多通訊協定 BGP (MP-BGP),即可透過這些 IPv4 工作階段通告 IPv4 和 IPv6 路徑。如需不同設定的範例 (包括使用 MP-BGP 的範例),請參閱「設定範例」。

修改以 BGP 為基礎的扁平模式網路設定

建立叢集並設定使用 BGP 的扁平模式網路模型後,您可以更新部分設定。後續更新 BGP 相關資源 (NetworkGatewayGroupFlatIPModeBGPPeer) 時,請使用管理員叢集 Kubeconfig 檔案。管理員叢集隨後會將變更內容與使用者叢集進行比對。如果您直接在使用者叢集上編輯這些資源,管理員叢集會在後續的協調作業中覆寫您的變更。

設定範例

以下各節將提供叢集設定範例,說明如何搭配 BGP 使用不同變體的扁平模式網路模型。設定檔範例不完整。已省略與 BGP 搭配使用的扁平模式網路無關的大部分叢集設定。

單一堆疊 IPv4 叢集

下列叢集設定檔範例顯示如何設定單一堆疊 IPv4 叢集,並使用 BGP 搭配扁平模式網路:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: true
    services:
      cidrBlocks:
      - 10.96.0.0/12
  ...
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig          
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "222.2.0.0/16"
    perNodeMaskSize: 24
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: true
  enableBGPIPv6: false
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

雙重堆疊叢集 (IPv4 Island、IPv6 Dynamic Flat IP)

下列叢集設定檔範例顯示的設定,適用於設定雙堆疊 (IPv4/IPv6) 叢集,並搭配 BGP 採用扁平模式網路,但僅適用於 IPv6:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: false
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12
      # Additional IPv6 CIDR block determines if the cluster is dual-stack
      - 2620:0:1000:2630:5:2::/112
  ... 
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig          
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "192.168.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2222:3::/112"
    perNodeMaskSize: 120
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: false
  enableBGPIPv6: true
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

雙重堆疊叢集 (IPv4 動態 Flat IP、IPv6 動態 Flat IP)

下列叢集設定檔範例顯示如何設定雙堆疊叢集,並使用 BGP 搭配扁平模式網路:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: true
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12
      # Additional IPv6 CIDR block determines if the cluster is dual-stack
      - 2620:0:1000:2630:5:2::/112
  ... 
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig          
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "222.2.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2222:3::/112"
    perNodeMaskSize: 120
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: true
  enableBGPIPv6: true
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

疑難排解

如要協助您排解與 BGP 搭配使用的扁平模式網路相關問題,本節提供檢查設定的說明:

  1. 確認管理叢集上的叢集命名空間中是否已建立 FlatIPModes 物件:

    kubectl get flatipmodes -A --kubeconfig ADMIN_KUBECONFIG
    

    回應內容應如下所示:

    NAMESPACE                 NAME      AGE
    cluster-bm                default   2d17h
    
  2. 確認使用者叢集是否已建立 flatipmodes.networking.gke.io 物件:

    flatipmodes.networking.gke.io 物件的範圍為叢集。

    kubectl get flatipmodes.networking.gke.io --kubeconfig USER_KUBECONFIG
    

    回應內容應如下所示:

    NAME      AGE
    default   2d17h
    
  3. 取得 BGPSessions 資源,查看目前的工作階段:

    kubectl get bgpsessions -A --kubeconfig USER_KUBECONFIG
    

    回應內容應如下所示:

    NAMESPACE     NAME                LOCAL ASN   PEER ASN   LOCAL IP       PEER IP        STATE            LAST REPORT
    kube-system   10.0.1.254-node-01  65500       65000      10.0.1.100     10.0.1.254     Established      2s
    kube-system   10.0.1.254-node-02  65500       65000      10.0.3.100     10.0.1.254     NotEstablished   2s
    kube-system   10.0.3.254-node-01  65500       65000      10.0.1.100     10.0.3.254     NotEstablished   2s
    kube-system   10.0.3.254-node-02  65500       65000      10.0.3.100     10.0.3.254     Established      2s
    
  4. 取得 BGPAdvertisedRoute 資源,查看目前通告的路徑:

    kubectl get bgpadvertisedroutes -A --kubeconfig USER_KUBECONFIG
    

    回覆內容應如下所示:

    NAMESPACE     NAME                     PREFIX         METRIC
    kube-system   route-via-222-22-208-240   222.2.0.0/24   
    kube-system   route-via-222-22-209-240   222.2.1.0/24   
    

    路線名稱會指出下一個躍點。舉例來說,前述範例回應中的 route-via-222-22-208-240 表示所宣傳前置字元 222.2.0.0/24 的下一個躍點是 222.22.208.240