マルチクラスタ Ingress の設定

このページでは、異なるリージョンの複数の Google Kubernetes Engine(GKE)クラスタ間でトラフィックをルーティングするようにマルチクラスタ Ingress を構成する方法について説明します。

マルチクラスタ Ingress は、クラスタとリージョン間の共有負荷分散リソースのデプロイをサポートする、GKE クラスタ用のクラウドホスト型マルチクラスタ Ingress コントローラです。

マルチクラスタ Ingress の詳細については、マルチクラスタ Ingress をご覧ください。クラスタ間での Ingress のデプロイもご覧ください。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • 次のいずれかの方法で、プロジェクトにデフォルトの gcloud コマンドライン ツールを設定します。
    • プロジェクトのデフォルトの設定全般を確認する場合は、gcloud init を使用します。
    • gcloud config を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。

    gcloud init

    1. gcloud init を実行して、次の操作を行います。

      gcloud init

      リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

      gcloud init --console-only
    2. Google Cloud アカウントを使用できるように、gcloud の承認手順を行います。
    3. 新しい構成を作成するか、既存の構成を選択します。
    4. Google Cloud プロジェクトを選択します。
    5. デフォルトの Compute Engine ゾーンを選択します。
    6. デフォルトの Compute Engine リージョンを選択します。

    gcloud config

    1. デフォルトのプロジェクト ID を設定します。
      gcloud config set project PROJECT_ID
    2. デフォルトの Compute Engine リージョン(例: us-central1)を設定します。
      gcloud config set compute/region COMPUTE_REGION
    3. デフォルトの Compute Engine ゾーン(例: us-central1-c)を設定します。
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud を最新バージョンに更新します。
      gcloud components update

    デフォルトのロケーションを設定することで、gcloud ツールのエラー(「One of [--zone, --region] must be supplied: Please specify location」など)を防止できます。

マルチクラスタ Ingress を使用するための要件を満たしていることを確認してください。

デプロイ演習

この演習では、コンポーネントをデプロイし、マルチクラスタ Ingress の使用に必要なインフラストラクチャを準備します。この手順は、環境でマルチクラスタ Ingress を使用するために必要です。以下の手順を行うには高度な権限が必要で、GKE 管理者が行う必要があります。

この演習の手順の概要は次のとおりです。

  1. 必要な API を有効にします。
  2. GKE クラスタをデプロイしてワークロードをホストします。
  3. クラスタをフリートにグループ化します。
  4. マルチクラスタ Ingress の管理設定を構成します。

次の図は、演習を完了した際の環境の様子を示しています。

リージョン、フリート、プロジェクトの関係を示すクラスタ トポロジ。

この図では、ゾーン europe-west1us-central1 に、gke-usgke-eu という名前の 2 つの GKE クラスタがあります。クラスタは、マルチクラスタ Ingress コントローラで認識されるようにフリートにグループ化されます。

API を有効にする

マルチクラスタ Ingress で有効にする API は、使用するマルチクラスタ Ingress の料金によって異なります。

マルチクラスタ Ingress が、使用する Anthos の唯一の機能である場合は、スタンドアロン版の料金設定のほうが費用対効果が高くなります。プロジェクトの課金方法は、Anthos API(anthos.googleapis.com)が有効か無効かによって異なります。

  • Anthos API が有効になっている場合、クラスタ vCPU の数と Anthos の料金に従ってプロジェクトに課金されます。
  • Anthos API が無効になっている場合は、プロジェクト内のバックエンドのマルチクラスタ Ingress のポッドの数に基づいて課金されます。

プロジェクトで他の Anthos on Google Cloud のコンポーネントまたは機能を使用している場合は、Anthos ライセンスを使用する必要があります。

マルチクラスタ Ingress 課金モデルをスタンドアロンから Anthos に(またはその逆に)変更しても、マルチクラスタ Ingress のリソースやトラフィックには影響しないため、いつでも変更できます。課金モデルを変更するには、Anthos API を有効または無効にします。手順は次のとおりです。

Anthos の料金

Anthos の料金を有効にするには、次の手順を行います。

  1. プロジェクトで Anthos、マルチクラスタ Ingress、Connect、GKE API を有効にします。

    gcloud services enable \
        anthos.googleapis.com \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        container.googleapis.com \
        --project=PROJECT_ID
    

    プロジェクトで anthos.googleapis.com が有効になると、Connect に登録されたクラスタは Anthos の料金に従って課金されます。

スタンドアロン版の料金

スタンドアロン版の料金を有効にするには、次の手順を行います。

  1. プロジェクトで Anthos API が無効になっていることを確認します。

    gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com
    

    PROJECT_ID は、GKE クラスタが実行されているプロジェクト ID に置き換えます。

    出力が空のレスポンスの場合、Anthos API はプロジェクトで無効になり、マルチクラスタ Ingress リソースはスタンドアロン版の料金を使用して課金されます。

  2. プロジェクトで、マルチクラスタ Ingress、Connect、GKE API を有効にします。

    gcloud services enable \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        container.googleapis.com \
        --project=PROJECT_ID
    

クラスタをデプロイする

このセクションでは、gke-usgke-eu という名前の 2 つの GKE クラスタを europe-west1 ゾーンと us-central1 ゾーンに作成します。

Workload Identity を有効にしてクラスタを作成することをおすすめします。これにより、Google Cloud サービス アカウント キーのダウンロード、手動でのローテーション、管理を行うことなく、クラスタ内のワークロードが認証されます。Workload Identity を有効にせずにクラスタを作成する場合は、サービス アカウント キーを使用してクラスタをフリートに手動で登録する必要があります。

Workload Identity

  1. us-central1-b ゾーンに gke-us クラスタを作成します。

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. europe-west1-b ゾーンに gke-eu クラスタを作成します。

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

手動

  1. us-central1-b ゾーンに gke-us クラスタを作成します。

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. europe-west1-b ゾーンに gke-eu クラスタを作成します。

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    

クラスタ認証情報を構成する

このセクションでは、覚えやすい名前でクラスタ認証情報を構成します。これにより、複数のクラスタにリソースをデプロイするときに、クラスタの切り替えが容易になります。

  1. クラスタの認証情報を取得します。

    gcloud container clusters get-credentials gke-us \
        --zone=us-central1-b \
        --project=PROJECT_ID
    
    gcloud container clusters get-credentials gke-eu \
        --zone=europe-west1-b \
        --project=PROJECT_ID
    

    認証情報はローカルに保存され、kubectl クライアントを使用してクラスタ API サーバーにアクセスできるようになります。デフォルトでは、認証情報に自動生成された名前が使用されます。

  2. クラスタ コンテキストの名前を変更します。

    kubectl config rename-context gke_PROJECT_ID_us-central1-b_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1-b_gke-eu gke-eu
    

クラスタをフリートに登録する

Connect を使用してクラスタをフリートに登録する必要があります。クラスタは、Google Cloud サービス アカウントまたは Workload Identity を使用して手動で登録できます。

Workload Identity

  1. クラスタで Workload Identity が有効になっている場合は、次のコマンドを実行してクラスタを登録します。

    gcloud container hub memberships register gke-us \
        --gke-cluster us-central1-b/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. クラスタが Connect に正常に登録されたことを確認します。

    gcloud container hub memberships list --project=PROJECT_ID
    

    出力は次のようになります。

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

手動

クラスタで Workload Identity が有効になっていない場合は、次の手順でクラスタを登録します。

  1. クラスタ登録の前提条件をすべて満たしていることを確認します。

  2. サービス アカウントを作成し、サービス アカウントの秘密鍵 JSON ファイルをダウンロードします。

  3. ダウンロードした秘密鍵 JSON ファイルを使用して、クラスタをフリートに登録します。

    gcloud container hub memberships register gke-us \
         --gke-cluster us-central1-b/gke-us \
         --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
         --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
        --project=PROJECT_ID
    

    以下を置き換えます。

    • SERVICE_ACCOUNT_KEY_PATH: 登録の前提条件でダウンロードした、サービス アカウントの秘密鍵 JSON ファイルのローカル ファイルパスです。このサービス アカウント キーは、creds-gcp という名前のシークレットとして gke-connect 名前空間に保存されます。
  4. クラスタが Connect に正常に登録されたことを確認します。

    gcloud container hub memberships list --project=PROJECT_ID
    

    出力は次のようになります。

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

構成クラスタを指定する

構成クラスタは、メンバー クラスタ間で Ingress を制御する中心となる GKE クラスタです。GKE Ingress とは異なり、マルチクラスタ Ingress コントローラは単一のクラスタには存在しませんが、構成クラスタ内のリソースを監視する Google マネージド サービスです。この GKE クラスタは、MultiClusterIngressMultiClusterService などのリソースを保存するためのマルチクラスタ API サーバーとして使用されますが、一度に存在できる構成クラスタは 1 つだけです。

構成クラスタの詳細については、構成クラスタの設計をご覧ください。

構成クラスタが停止しているか、アクセスできない場合は、MultiClusterIngress オブジェクトと MultiClusterService オブジェクトはメンバー クラスタ間で更新できません。ロードバランサとトラフィックは、停止時でも構成クラスタとは独立して機能し続けます。

マルチクラスタ Ingress を有効にして構成クラスタを選択する手順は同じです。構成クラスタとして選択する GKE クラスタは、すでにフリートに登録されている必要があります。

  1. 構成クラスタとして指定するクラスタの URI を特定します。

    gcloud container hub memberships list
    

    出力は次のようになります。

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    
  2. マルチクラスタ Ingress を有効にして、構成クラスタとして gke-us を選択します。

    gcloud beta container hub ingress enable \
      --config-membership=gke-us
    

    コントローラのブートストラップ中は、このプロセスに数分かかることがあります。成功すると、出力は次のようになります。

    Waiting for Feature to be created...done.
    Waiting for controller to start...done.
    

    失敗した場合、コマンドは次のようにタイムアウトします。

    Waiting for controller to start...failed.
    ERROR: (gcloud.alpha.container.hub.ingress.enable) Controller did not start in 2 minutes. Please use the `describe` command to check Feature state for debugging information.
    

    前の手順でエラーが発生した場合は、機能の状態を確認します。問題点を正確に記述する必要があります。

    gcloud beta container hub ingress describe
    

    出力は次のようになります。

    createTime: '2021-02-04T14:10:25.102919191Z'
    membershipStates:
      projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
        state:
          code: ERROR
          description: '...is not a VPC-native GKE Cluster.'
          updateTime: '2021-08-10T13:58:50.298191306Z'
      projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
        state:
          code: OK
          updateTime: '2021-08-10T13:58:08.499505813Z'
    

    このようなエラー メッセージの詳細については、トラブルシューティングとオペレーションをご覧ください。

共有 VPC のデプロイ

マルチクラスタ Ingress は共有 VPC ネットワーク内のクラスタにデプロイできますが、参加しているバックエンド GKE クラスタがすべて同じプロジェクト内に存在する必要があります。同じ Cloud Load Balancing VIP を使用する異なるプロジェクトで GKE クラスタを使用することはサポートされていません。

非共有 VPC ネットワークでは、マルチクラスタ Ingress コントローラがファイアウォール ルールを管理し、Cloud Load Balancing からコンテナ ワークロードにヘルスチェックを許可できます。

共有 VPC ネットワークでは、マルチクラスタ Ingress はこれらのファイアウォール ルールを管理できません。これは、ファイアウォールはホスト プロジェクトによって管理されており、サービス プロジェクト管理者がアクセスできないためです。共有 VPC ネットワークの一元化されたセキュリティ モデルは、ネットワーク制御を意図的に集中化します。共有 VPC ネットワークでは、ホスト プロジェクト管理者が、マルチクラスタ Ingress の代わりに Cloud Load Balancing トラフィックに必要なファイアウォール ルールを手動で作成する必要があります。

次のコマンドは、クラスタが共有 VPC ネットワーク上にある場合に作成する必要のあるファイアウォール ルールを示しています。ソース範囲は、Cloud Load Balancing が Google Cloud のバックエンドにトラフィックを送信するために使用する範囲です。このルールは、マルチクラスタ Ingress の運用期間中に存続している必要があり、マルチクラスタ Ingress または GKE 負荷分散への Cloud Load Balancing が使用されなくなった場合にのみ削除できます。

共有 VPC ネットワーク上にクラスタがある場合は、次のファイアウォール ルールを作成します。

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --project HOST_PROJECT \
    --network SHARED_VPC \
    --direction INGRESS \
    --allow tcp:0-65535 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16

以下を置き換えます。

  • FIREWALL_RULE_NAME: 新しいファイアウォール ルールの名前。
  • HOST_PROJECT: 共有 VPC ホスト プロジェクトの ID。
  • SHARED_VPC: 共有 VPC ネットワークの名前。

既知の問題

config_membership フィールドの InvalidValueError

gcloud コマンドライン ツールでマルチクラスタ Ingress を操作できない問題が報告されています。この問題は、バージョン 346.0.0 で発生し、バージョン 348.0.0 で修正されました。gcloud ツールのバージョン 346.0.0 と 347.0.0 をマルチクラスタ Ingress で使用することはおすすめしません。

resource フィールドの値が無効

Google Cloud Armor は、次の GKE バージョンで実行されているマルチクラスタ Ingress 構成クラスタと通信できません。

  • 1.18.19-gke.1400 以降
  • 1.19.10-gke.700 以降
  • 1.20.6-gke.700 以降

Google Cloud Armor セキュリティ ポリシーを構成すると、次のメッセージが表示されます。

Invalid value for field 'resource': '{"securityPolicy": "global/securityPolicies/"}': The given policy does not exist

この問題を回避するには、構成クラスタをバージョン 1.21 以降にアップグレードするか、次のコマンドを使用して BackendConfig CustomResourceDefinition を更新します。

kubectl patch crd backendconfigs.cloud.google.com --type='json' -p='[{"op": "replace", "path": "/spec/versions/1/schema/openAPIV3Schema/properties/spec/properties/securityPolicy", "value":{"properties": {"name": {"type": "string"}}, "required": ["name" ],"type": "object"}}]'

次のステップ