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

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

GKE Workload Identity を有効にする

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

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

gcloud

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

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

以下を置き換えます。

  • CLUSTER_NAME: GKE クラスタの name

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

GKE_PROJECT_ID.svc.id.goog

結果がない場合は、Workload Identity は有効になりません。Workload Identity を有効にするには、Workload Identity の有効化の手順に従います。

コンソール

GKE クラスタで Workload Identity が有効になっているかどうかを確認するには:

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

    Google Kubernetes Engine に移動

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

  3. クラスタの詳細ページの [セキュリティ] セクションで、[ワークロード ID] が [有効] になっていることを確認します。

Workload Identity が無効になっていて、この機能を有効にする場合:

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

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

独自のプロジェクトで 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 アドオンがインストールされていることを確認します。Config Connector のバージョンが 1.47.0 以降である必要があります。

  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 を構成します。

次のステップ

手順に沿ってクラスタを登録します。