Workload Identity 可為叢集中的每個應用程式指派不重複的精細身分與授權。建議您使用 Workload Identity,讓在 AWS 上 GKE 中執行的應用程式存取Google Cloud 服務。詳情請參閱「Workload Identity」。
本主題說明如何使用 Workload Identity,從工作負載連線至Google Cloud 服務。
設定 IAM 權限
在本節中,您會授予 Kubernetes ServiceAccount 存取Google Cloud 服務的權限,方法是為其指派 IAM 角色。
取得 workload identity pool 和提供者
如要設定 workload identity,您必須擁有叢集的識別資訊提供者 URI 和工作負載身分集區的值。
判斷叢集的工作負載身分集區:
所有 GKE 叢集都會在 workload identity pool
PROJECT_ID.svc.id.goog中建立身分提供者。如要取得叢集的 ID 集區名稱,請使用 Google Cloud CLI:gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'更改下列內容:
CLUSTER_NAME替換為叢集名稱。GOOGLE_CLOUD_LOCATION,其中 Google Cloud是管理叢集的位置名稱
輸出內容會包含叢集身分識別集區的名稱。請儲存這個值,稍後需使用這項資訊。
判斷叢集的識別資訊提供者。
如要找出叢集的 IDP 名稱,請使用 Google Cloud CLI:
gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'更改下列內容:
CLUSTER_NAMEGOOGLE_CLOUD_LOCATION
輸出內容會包含叢集身分識別提供者的名稱。請儲存這個值,稍後需使用這項資訊。
將 IAM 角色授予 Kubernetes ServiceAccount
將專案的 IAM 角色授予 Kubernetes 服務帳戶:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
--role=IAM_ROLE \
--condition=None
更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 IDPROJECT_NUMBER:您的 Google Cloud 專案編號NAMESPACE:應用程式的 Kubernetes 命名空間KUBERNETES_SERVICEACCOUNT:應用程式要使用的 Kubernetes ServiceAccountIAM_ROLE:要授予 Kubernetes ServiceAccount 的 IAM 角色
在本範例中,我們將使用 roles/compute.viewer 角色,這個角色可提供運算服務的唯讀存取權:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
--role=roles/compute.viewer \
--condition=None
部署範例應用程式
在本節中,您將部署可存取 Compute Engine API 的範例應用程式。如要使用這個範例,Kubernetes ServiceAccount 必須具備 roles/compute.viewer IAM 角色。如要部署範例應用程式,請按照下列步驟操作:
複製以下資訊清單,並儲存至名為
workload-identity-sample.yaml的檔案:apiVersion: v1 kind: Namespace metadata: name: NAMESPACE --- apiVersion: v1 kind: ServiceAccount metadata: name: KUBERNETES_SERVICEACCOUNT 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", "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: KUBERNETES_SERVICEACCOUNT 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_IDNAMESPACEKUBERNETES_SERVICEACCOUNTIDENTITY_PROVIDER,並將其換成叢集的識別資訊提供者名稱。
將資訊清單套用至叢集
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從專案中移除 IAM 政策繫結
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role=roles/compute.viewer \ --condition=None更改下列內容:
PROJECT_IDPROJECT_NUMBERNAMESPACEKUBERNETES_SERVICEACCOUNT