Google Cloud で Workload Identity を使用する
Workload Identity を使用すると、クラスタ内のアプリケーションごとにきめ細かい ID と認可を割り当てることができます。Workload Identity は、GKE on Azure 内で実行されているアプリケーションで Google Cloud サービスにアクセスする場合に推奨される方法です。詳細については、Workload Identity をご覧ください。
このトピックでは、Workload Identity を使用してワークロードから Google Cloud サービスに接続する方法について説明します。
Google Cloud サービス アカウントを構成する
このセクションでは、Google Cloud サービスにアクセスするための制限付きの権限を持つ Google Cloud サービス アカウント(GSA)を作成します。
Workload Identity プールとプロバイダを取得する
Workload Identity を構成するには、クラスタの ID プロバイダ URI と Workload Identity プールの値が必要です。
クラスタの Workload Identity プールを確認します。
すべての GKE クラスタでは、Workload Identity プール
PROJECT_ID.svc.id.goog
に ID プロバイダが作成されます。クラスタの ID プール名を取得するには、Google Cloud CLI を使用します。gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'
次のように置き換えます。
CLUSTER_NAME
: 使用するクラスタの名前。GOOGLE_CLOUD_LOCATION
: クラスタを管理する Google Cloud ロケーションの名前。
出力には、クラスタの ID プールの名前があります。この値を保存してください。後で必要になります。
クラスタの ID プロバイダを確認します。
クラスタの ID プロバイダ名を確認するには、Google Cloud CLI を使用します。
gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'
次のように置き換えます。
CLUSTER_NAME
GOOGLE_CLOUD_LOCATION
出力には、クラスタの ID プロバイダの名前があります。この値を保存してください。後で必要になります。
Google Cloud サービス アカウントを作成する
Google Cloud サービス アカウント(GSA)を作成して権限を付与し、GSA に IAM ポリシー バインディングを追加するには、次の操作を行います。
Google Cloud CLI を使用して GSA を作成します。
gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
次のように置き換えます。
GSA_NAME
: アプリケーションの GSA の名前。PROJECT_ID
: GSA の Google Cloud プロジェクト。
GSA でサービスにアクセスできるように IAM バインディングを追加します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role IAM_ROLE
次のように置き換えます。
GSA_NAME
: アプリケーションの GSA の名前PROJECT_ID
: GSA のプロジェクト IDIAM_ROLE
: GSA に付与する IAM ロール
この例では、ロール
roles/compute.viewer
を使用します。これにより、コンピューティング サービスへの読み取り専用アクセスが可能になります。gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewer
GSA が権限を借用できるように、Kubernetes サービス アカウント(KSA)の権限を付与します。これを行うには、
roles/iam.workloadIdentityUser
ロールを持つ IAM ポリシー バインディングを追加します。gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \ --role roles/iam.workloadIdentityUser
次のように置き換えます。
GSA_NAME
PROJECT_ID
NAMESPACE
: アプリケーションの Kubernetes Namespace。KSA_NAME
: アプリケーションに使用する KSA
サンプル アプリケーションをデプロイする
このセクションでは、Compute Engine API にアクセスするサンプル アプリケーションをデプロイします。このサンプルを使用するには、サービス アカウントに roles/compute.viewer
IAM ロールを付与する必要があります。サンプル アプリケーションにデプロイするには:
次のマニフェストを
workload-identity-sample.yaml
という名前のファイルにコピーします。apiVersion: v1 kind: Namespace metadata: name: NAMESPACE --- apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE automountServiceAccountToken: false --- apiVersion: v1 kind: ConfigMap metadata: name: cloud-sdk-config namespace: NAMESPACE data: config: | { "type": "external_account", "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } } --- apiVersion: v1 kind: Pod metadata: name: cloud-sdk-example namespace: NAMESPACE spec: serviceAccount: KSA_NAME containers: - name: cloud-sdk image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest command: - /bin/bash - -c - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done' env: - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json - name: CLOUDSDK_CORE_PROJECT value: PROJECT_ID volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: audience: PROJECT_ID.svc.id.goog expirationSeconds: 86400 path: token - configMap: name: cloud-sdk-config optional: false items: - key: config path: google-application-credentials.json
次のように置き換えます。
PROJECT_ID
NAMESPACE
KSA_NAME
GSA_NAME
IDENTITY_PROVIDER
: クラスタの ID プロバイダの名前。
マニフェストをクラスタに適用します。
kubectl apply -f workload-identity-sample.yaml
Pod のログで、サンプル アプリケーションが動作していることを確認します。
kubectl logs -f cloud-sdk-example -n NAMESPACE
次のように置き換えます。
NAMESPACE
Pod が Google Cloud Compute API へのアクセスに成功すると、出力は次のようになります。
NAME REGION STATUS NEXT_MAINTENANCE TURNDOWN_DATE us-central1-c us-central1 UP us-central1-a us-central1 UP us-central1-f us-central1 UP us-central1-b us-central1 UP
クリーンアップ
サンプル アプリケーションを削除します。
kubectl delete -f manifest.yaml
Google Cloud サービス アカウントから IAM ポリシー バインディングを削除します。
gcloud iam service-accounts remove-iam-policy-binding \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \ roles/iam.workloadIdentityUser
次のように置き換えます。
GSA_NAME
PROJECT_ID
NAMESPACE
KSA_NAME
プロジェクトから IAM ポリシー バインディングを削除します。
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewer
次のように置き換えます。
GSA_NAME
PROJECT_ID
Google Cloud サービス アカウントを削除します。
gcloud iam service-accounts delete \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
次のように置き換えます。
GSA_NAME
PROJECT_ID