2.9.2.3. GCP Workload Identity で認証するカスタマーワークロードのデプロイ
アプリケーションで短期認証を使用するには、関連する Pod が OpenShift Container Platform サービスアカウントを使用するように設定する必要があります。OpenShift Container Platform サービスアカウントを使用すると、Pod を変更する Webhook がトリガーされ、Google Cloud サービスアカウントへの成り代わりが可能になります。
次の例は、OpenShift Container Platform サービスアカウントを使用する Pod をデプロイし、設定を確認する方法を示しています。
前提条件
- Google Cloud のクラスターで GCP Workload Identity を使用している。
- フェデレーションされた Google Cloud サービスアカウントを作成した。
- Google Cloud 用の OpenShift Container Platform サービスアカウントを作成した。
手順
GCP Workload Identity で認証する Pod を作成するには、次の例のようなデプロイメント YAML ファイルを作成します。
サンプルデプロイメント
apiVersion: apps/v1 kind: Deployment metadata: name: ubi9 spec: replicas: 1 selector: matchLabels: app: ubi9 template: metadata: labels: app: ubi9 spec: serviceAccountName: "<service_account_name>"1 containers: - name: ubi image: 'registry.access.redhat.com/ubi9/ubi-micro:latest' command: - /bin/sh - '-c' - | sleep infinity- 1
- OpenShift Container Platform サービスアカウントの名前を指定します。
次のコマンドを実行してデプロイメントファイルを適用します。
$ oc apply -f deployment.yaml
検証
Pod が短期認証を使用していることを確認するには、次のコマンドを実行します。
$ oc get pods -o json | jq -r '.items[0].spec.containers[0].env[] | select(.name=="GOOGLE_APPLICATION_CREDENTIALS")'出力例
{ "name": "GOOGLE_APPLICATION_CREDENTIALS", "value": "/var/run/secrets/workload-identity/federation.json" }GOOGLE_APPLICATION_CREDENTIALS環境変数が存在する場合、それは GCP Workload Identity で認証する Pod を示しています。追加設定の詳細を確認するには、Pod 仕様を調べます。次の Pod 仕様の例は、Webhook によって変更される環境変数とボリュームフィールドを示しています。
direct注入モードの Pod 仕様例:apiVersion: v1 kind: Pod metadata: name: app-x-pod namespace: service-a annotations: cloud.google.com/skip-containers: "init-first,sidecar" cloud.google.com/external-credentials-json: |-1 { "type": "external_account", "audience": "//iam.googleapis.com/projects/<project_number>/locations/global/workloadIdentityPools/on-prem-kubernetes/providers/<identity_provider>", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/app-x@project.iam.gserviceaccount.com:generateAccessToken", "credential_source": { "file": "/var/run/secrets/sts.googleapis.com/serviceaccount/token", "format": { "type": "text" } } } spec: serviceAccountName: app-x initContainers: - name: init-first image: container-image:version containers: - name: sidecar image: container-image:version - name: container-name image: container-image:version env:2 - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/gcloud/config/federation.json - name: CLOUDSDK_COMPUTE_REGION value: asia-northeast1 volumeMounts: - name: gcp-iam-token readOnly: true mountPath: /var/run/secrets/sts.googleapis.com/serviceaccount - mountPath: /var/run/secrets/gcloud/config name: external-credential-config readOnly: true volumes: - name: gcp-iam-token projected: sources: - serviceAccountToken: audience: sts.googleapis.com expirationSeconds: 86400 path: token - downwardAPI: defaultMode: 288 items: - fieldRef: apiVersion: v1 fieldPath: metadata.annotations['cloud.google.com/external-credentials-json'] path: federation.json name: external-credential-config