BGP をサポートするフラットモード ネットワーク モデルを実装する

このドキュメントでは、Border Gateway Protocol(BGP)をサポートするフラットモードのネットワーク モデルを実装する方法について説明します。BGP をサポートするネットワーク モデルを実装すると、異なるレイヤ 2 ドメインの Pod がBGP によって自動的に相互に通信できるようになります。BGP によるフラットモード ネットワーキングは、動的フラット IP と呼ばれることもあります。

フラットモード ネットワーク モデルの詳細については、フラットモードとアイランド モードのネットワーク モデルをご覧ください。

BGP を使用するフラットモード ネットワークを実装する方法

新しいクラスタを作成すると、BGP を使用したフラットモード ネットワーキングが有効になります。既存のクラスタでこの機能を有効にすることはできません。この機能を有効にすると、一部の構成設定に変更を加えることができます。

BGP をサポートするフラットモード ネットワーク モデルでクラスタを実装するには:

  1. クラスタ構成ファイルを編集します。

    • spec.clusterNetwork.advancedNetworking フィールドを true に設定します。
    • IPv4 のフラットモード ネットワーキングを有効にする場合は、spec.clusterNetwork.flatIPv4 フィールドを true に設定します。

      代替手法については、デュアルスタック クラスタ(IPv4 アイランド、IPv6 動的フラット IP)をご覧ください。IPv6 専用のフラットモード ネットワーキングによるクラスタ構成について示しています。

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

    spec.clusterNetwork.flatIPv4true に設定されている場合、フィールド 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 カスタム リソースは、1 つ以上のフローティング IP アドレスのリストを管理します。BGP ピアリング セッションは、NetworkGatewayGroup カスタム リソースで指定したフローティング IP アドレスから開始されます。

  3. FlatIPMode マニフェストをクラスタ構成ファイルに追加します。

    FlatIPMode リソースの名前は default であり、名前空間はクラスタの名前空間であることが必要です。peerSelector の値 flatip-peer: "true" は、BGP ピア オブジェクト bgppeer1bgppeer2(次のステップで定義)のラベルと一致するため、両方のピアがフラットモード ネットワーキングに使用されます。

    次の FlatIPMode マニフェストは、BGP を使用した IPv4 シングルスタック フラットモード ネットワーキング用です。代替構成については、構成例をご覧ください。

    ---
    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: FlatIPMode
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      enableBGPIPv4: true
      enableBGPIPv6: false
      peerSelector:
        flatip-peer: "true"
    
  4. 1 つ以上の 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 範囲を使用して、ノードで実行中の個々の Pod に IP アドレスを割り振ります。ClusterCIDRConfig は、デュアル スタック ネットワーキングにも使用されます。使用例を含む ClusterCIDRConfig カスタム リソースの詳細については、ClusterCIDRConfig カスタム リソースについてをご覧ください。

  6. クラスタを作成します。

    bmctl create cluster
    

    クラスタを作成する詳細については、クラスタの作成の概要をご覧ください。

    環境がマルチプロトコル BGP(MP-BGP)をサポートしている場合、IPv4 セッションで IPv4 ルートおよび IPv6 ルートをアドバタイズできます。MP-BGP を使用する例を含む、さまざまな構成の例については、構成例をご覧ください。

BGP ベースのフラットモード ネットワーキング構成を変更する

BGP を使用してフラットモード ネットワーク モデルを使用するように構成されたクラスタを作成したら、一部の構成設定を更新できます。BGP 関連リソース(NetworkGatewayGroupFlatIPModeBGPPeer)を後で更新する場合は、管理クラスタの kubeconfig ファイルを使用します。その後、管理クラスタによって、ユーザー クラスタに変更が反映されます。これらのリソースをユーザー クラスタで直接編集すると、管理クラスタが後続の調整での変更を上書きします。

構成例

以下の各セクションでは、BGP を使用したフラットモード ネットワーク モデルのさまざまなバリエーションのクラスタ構成例について説明します。サンプル構成ファイルは完全ではありません。BGP を使用したフラットモード ネットワーキングに関係のないほとんどのクラスタ設定は省略されています。

シングル スタック IPv4 クラスタ

次のクラスタ構成ファイルのサンプルは、BGP を使用したフラットモード ネットワーキングでシングルスタック IPv4 クラスタを構成するための設定を示しています。

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 アイランド、IPv6 動的フラット IP)

次のクラスタ構成ファイルのサンプルは、IPv6 専用の BGP でフラットモード ネットワーキングを使用してデュアルスタック(IPv4 / 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 動的フラット IP、IPv6 動的フラット 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 であることを示しています。