Google Cloud 上の GKE クラスタの前提条件

Google Cloud 上の GKE クラスタを登録する場合は、選択した登録オプションに応じて事前に以下の 1 つ以上の操作を行う必要があります。このガイドでは、クラスタ登録の一般的な前提条件をすでに完了していることを前提としています。

Workload Identity Federation for GKE を有効にする

フリート Workload Identity 連携を有効にした GKE クラスタを登録することをおすすめします。これにより、クラスタ上のアプリケーションが Google Cloud APIs とサービスに対して一貫した認証を行うことができます。フリート Workload Identity 連携を有効にする利点については、フリート Workload Identity 連携を使用するをご覧ください。

この機能を使用するには、登録前にクラスタで GKE 用 Workload Identity 連携が有効になっていることを確認する必要があります。GKE 用 Workload Identity 連携をクラスタで有効にせずにフリート Workload Identity 連携を使用して GKE クラスタを登録することは、ワークロードがクラスタ内で ID をアサーションする方法に一貫性がなくなるため、サポートされる構成ではありません。Autopilot クラスタでは、GKE 用 Workload Identity 連携がデフォルトで有効になっています。

gcloud

クラスタで Workload Identity Federation for GKE が有効になっているかどうかを確認するには、次のコマンドを実行してクラスタの Workload Identity プールを一覧取得します。gcloud のデフォルト ゾーンまたはデフォルト リージョンをまだ指定していない場合は、このコマンドの実行時に --region フラグまたは --zone フラグを指定する必要があります。

gcloud container clusters describe CLUSTER_NAME --format="value(workloadIdentityConfig.workloadPool)"

次のように置き換えます。

  • CLUSTER_NAME: GKE クラスタの name

次のような結果が表示された場合は、GKE 用 Workload Identity 連携がクラスタですでに有効になっています。

GKE_PROJECT_ID.svc.id.goog

結果が表示されない場合は、GKE 用 Workload Identity 連携が有効になっていません。GKE 用 Workload Identity 連携を有効にする手順に沿って操作してください。

コンソール

クラスタで GKE 用 Workload Identity 連携が有効になっているかどうかを確認する手順は次のとおりです。

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、クラスタの名前をクリックします。

  3. クラスタの詳細ページの [セキュリティ] セクションで、[Workload Identity] が [有効] と表示されていることを確認します。

Workload Identity が [無効] になっている場合に、この機能を有効にする手順は次のとおりです。

  1. クラスタの詳細ページで、 [Workload Identity の編集] をクリックします。
  2. [Workload Identity の編集] ダイアログで、[Workload Identity を有効にする] チェックボックスをオンにします。
  3. [保存] をクリックします。

クラスタを別のプロジェクトに登録する権限を付与する

GKE クラスタを同じプロジェクトのフリートに登録する場合、アクセス権限の付与で説明されている以外の特別な権限は必要ありません。ただし、同じプロジェクト(GKE_PROJECT)から別のプロジェクト(FLEET_HOST_PROJECT)のフリートに GKE クラスタを登録する場合は、FLEET_HOST_PROJECT サービス エージェント アカウント gcp-sa-gkehub に、GKE_PROJECT プロジェクトの gkehub.serviceAgent ロールが必要です。このロールによって、そのプロジェクトのクラスタ リソースを管理する権限がサービス アカウントに付与されます。

フリートホスト プロジェクトの gcp-sa-gkehub サービス アカウントにクラスタのプロジェクトで必要なロールがあるかどうかは、次のように、gcloud CLI または Google Cloud コンソールを使用して確認できます。

gcloud

次のコマンドを実行します。

gcloud projects get-iam-policy GKE_PROJECT_ID | grep gcp-sa-gkehub

ここで、GKE_PROJECT_ID はクラスタのプロジェクトの ID です。

フリートホスト プロジェクト gcp-sa-gkehub にクラスタのプロジェクトで必要なロールがある場合、出力に service-[FLEET_HOST-PROJECT-NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com の形式で表示されます。次に例を示します。

- members:
  - serviceAccount:service-1234567890@gcp-sa-gkehub.iam.gserviceaccount.com
  role: roles/gkehub.serviceAgent

コンソール

  1. クラスタのプロジェクトを選択した状態で、Google Cloud コンソールの [IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  2. [Google 提供のロール付与を含める] チェックボックスをオンにして、サービス エージェントを含む完全な許可ポリシーを表示します。

フリートホスト プロジェクトの gcp-sa-gkehub サービス アカウントにクラスタのプロジェクトで必要なロールがある場合、このリストに service-[FLEET_HOST-PROJECT-NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com の形式で表示されます。

プロジェクトの IAM 許可ポリシーにサービス エージェントが表示されない場合は、次の手順で必要な権限を更新します。

gcloud

  1. gcp-sa-gkehubgkehub.serviceAgent ロールを付与するには、まずこのサービス アカウントがフリートホスト プロジェクトに存在することを確認します。以前にこのフリート プロジェクトにクラスタを登録したことがある場合、このサービス アカウントはすでに存在します。これは、フリートホスト プロジェクトの IAM 許可ポリシーで確認できます。

    gcloud projects get-iam-policy FLEET_HOST_PROJECT_ID | grep gcp-sa-gkehub
    
  2. gcp-sa-gkehub サービス アカウントを作成する必要がある場合は、次のコマンドを実行します。

    gcloud beta services identity create --service=gkehub.googleapis.com --project=FLEET_HOST_PROJECT_ID
    

    このコマンドを実行すると、次の内容が出力されます。

    Service identity created: service-[FLEET_HOST_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
    
  3. 次のコマンドを実行して、両方のプロジェクトの roles/gkehub.serviceAgent ロールとクラスタのプロジェクトの roles/gkehub.crossProjectServiceAgent をサービス アカウントに付与します。

    GKE_PROJECT_ID=GKE_PROJECT_ID
    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    FLEET_HOST_PROJECT_NUMBER=$(gcloud projects describe "${FLEET_HOST_PROJECT_ID}" --format "value(projectNumber)")
    gcloud projects add-iam-policy-binding "${FLEET_HOST_PROJECT_ID}" \
      --member "serviceAccount:service-${FLEET_HOST_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
      --role roles/gkehub.serviceAgent
    gcloud projects add-iam-policy-binding "${GKE_PROJECT_ID}" \
      --member "serviceAccount:service-${FLEET_HOST_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
      --role roles/gkehub.serviceAgent
    gcloud projects add-iam-policy-binding "${GKE_PROJECT_ID}" \
      --member "serviceAccount:service-${FLEET_HOST_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
      --role roles/gkehub.crossProjectServiceAgent
    

    ここで

    • GKE_PROJECT_ID は、GKE クラスタの Google Cloud プロジェクト ID です。
    • FLEET_HOST_PROJECT_ID は、クラスタを登録する Google Cloud プロジェクト ID です。この値の確認方法をご覧ください。
  4. ロール バインディングが付与されていることを確認するには、次のコマンドを再度実行します。

    gcloud projects get-iam-policy GKE_PROJECT_ID
    

    サービス アカウント名と gkehub.serviceAgent および gkehub.crossProjectServiceAgent ロールが表示されている場合、ロール バインディングが付与されています。次に例を示します。

    - members:
      - serviceAccount:service-[FLEET_HOST_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
      role: roles/gkehub.serviceAgent
    - members:
      - serviceAccount:service-[FLEET_HOST_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
      role: roles/gkehub.crossProjectServiceAgent
    

Terraform 用のサービス アカウントを構成する

Terraform を使用して Google Kubernetes Engine クラスタを登録する場合は、Terraform が Fleet API にアクセスしてメンバーシップを作成するために使用できるサービス アカウントを作成する必要があります。

gcloud

  1. 次のコマンドでサービス アカウントを作成します。

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME --project=FLEET_HOST_PROJECT_ID
    
  2. Terraform を Fleet API で使用できるようにするために、サービス アカウントに gkehub.admin IAM ロールをバインドします。

    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \
       --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/gkehub.admin"
    

    Terraform で新しいクラスタを作成して登録する場合は、Terraform がこのサービス アカウントを使用して GKE API にアクセスしてクラスタを作成できるよう、サービス アカウントに roles/container.admin ロールをバインドする必要があります。

    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \
       --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/container.admin"
    

    次のように置き換えます。

    • FLEET_HOST_PROJECT_ID は、クラスタを登録する Google Cloud プロジェクト ID です。この値の確認方法をご覧ください
    • SERVICE_ACCOUNT_NAME は、[サービス アカウント] に付ける表示名です。
  3. gcloud を使用して Google Cloud サービス アカウントを作成するの説明に沿って、サービス アカウントの秘密鍵 JSON ファイルをダウンロードします。このファイルは、Terraform を使用してクラスタを作成および登録するために必要です。

Config Connector 用のサービス アカウントを構成する

Config Connector を使用して GKE クラスタを登録する場合は、以下を行います。

gcloud

  1. Config Connector アドオンがインストールされていることを確認します。バージョンが 1.47.0 以降の Config Connector が必要です。

  2. Config Connector の手順に沿って、サービス アカウントを作成します。

  3. Config Connector がこのサービス アカウントを使用して Fleet API にアクセスできるように、gkehub.admin IAM ロールをサービス アカウントにバインドします。

    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \
       --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/gkehub.admin"
    

    Config Connector で新しいクラスタを作成して登録する場合は、roles/container.admin ロールをサービス アカウントにバインドすることで、Config Connector コントローラがこのサービス アカウントを使用して GKE API にアクセスし、クラスタを作成できるようにする必要もあります。

    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    gcloud projects add-iam-policy-binding ${FLEET_HOST_PROJECT_ID} \
       --member="serviceAccount:SERVICE_ACCOUNT_NAME@${FLEET_HOST_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/container.admin"
    

    次のように置き換えます。

    • FLEET_HOST_PROJECT_ID は、クラスタを登録する Google Cloud プロジェクト ID です。この値の確認方法をご覧ください
    • SERVICE_ACCOUNT_NAME は、[サービス アカウント] に付ける表示名です。
  4. このサービス アカウントを使用し、Config Connector の手順に沿って Config Connector を構成します。

次のステップ

手順に沿ってクラスタを登録する