Workload Identity 可為叢集中的每個應用程式指派不重複的精細身分與授權。建議您使用 Workload Identity,讓在 AWS 上的 GKE 中執行的應用程式存取 AWS 和 Google Cloud 服務。詳情請參閱「Workload Identity」。
本主題說明如何建立 OIDC 提供者、佈建服務帳戶,以及使用 workload identity 測試範例工作負載。本頁面適用於身分和帳戶管理員、作業人員和開發人員,他們想要建立及管理與使用者權限相關的政策。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud
為叢集建立 AWS IAM OIDC 提供者
如要在叢集使用 Workload Identity,請先建立參照叢集的 AWS IAM OIDC 提供者。如果叢集已有 IAM OIDC 供應商,可以略過本節。
如要建立供應商,請按照下列步驟操作:
判斷叢集的 OIDC 核發者 URI:
gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.issuerUri)'
更改下列內容:
CLUSTER_NAME
:叢集名稱GOOGLE_CLOUD_LOCATION
:節點集區的管理位置名稱,如Google Cloud 管理區域中所定義 Google Cloud
輸出結果包含叢集的 OIDC 核發者 URI。請儲存這個值,以供後續步驟使用。
接著,請使用下列指令建立 AWS IAM OIDC 提供者,並參照您的叢集:
aws iam create-open-id-connect-provider \ --url ISSUER_URI \ --client-id-list sts.amazonaws.com \ --thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6
將
ISSUER_URI
替換為上一步的簽發機構 URI。提供發行者 URI 的服務指紋一律為
08745487e891c19e3078c1f2a07e452950ef36f6
。 Google Cloud
設定附加 IAM 政策的 AWS IAM 角色
如要設定 AWS IAM 角色並附加政策,請按照下列步驟操作:
從核發機構 URI 中移除
https://
前置字元,即可判斷核發機構主機。舉例來說,如果 URI 為https://oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster
,主機就是oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster
。請儲存這個值。稍後需使用這項資訊。執行下列指令,判斷供應商的 Amazon 資源名稱 (ARN):
aws iam list-open-id-connect-providers --output=text \ --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
將
ISSUER_HOST
替換為叢集簽發者 URI 的主機名稱。接著,請建立信任政策,為 Kubernetes 服務帳戶提供 OIDC 憑證。建立名為
trust-policy.json
的檔案,並在當中加入下列內容:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "PROVIDER_ARN" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "ISSUER_HOST:sub": "system:serviceaccount:NAMESPACE:KSA_NAME" } } } ] }
更改下列內容:
PROVIDER_ARN
:叢集 IAM OIDC 提供者的 ARNISSUER_HOST
:叢集簽發者 URI 的主機名稱。NAMESPACE
:應用程式執行的 Kubernetes 命名空間KSA_NAME
:應用程式使用的 Kubernetes 服務帳戶 (KSA)
建立 AWS IAM 角色:
aws iam create-role --role-name=AWS_ROLE_NAME \ --assume-role-policy-document file://trust-policy.json
將
AWS_ROLE_NAME
替換為應用程式的 AWS IAM 角色名稱。將 AWS IAM 政策附加至角色:
aws iam attach-role-policy --role-name=AWS_ROLE_NAME \ --policy-arn=AWS_POLICY_ARN
取代下列項目:
-
AWS_ROLE_NAME
:應用程式的 AWS IAM 角色名稱
舉例來說,如要建立名為
ec2-readonly
的角色,並使用arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
政策,請執行下列指令:aws iam attach-role-policy --role-name=ec2-readonly \ --policy-arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
-
部署範例應用程式
如要測試工作負載身分,請按照下列步驟部署範例應用程式:
判斷角色的 ARN:
aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
取代
AWS_ROLE_NAME
。為 Kubernetes 命名空間、KSA 和 Pod 建立資訊清單。 將下列資訊清單複製到名為
workload-identity-test.yaml
的檔案:apiVersion: v1 kind: Namespace metadata: name: NAMESPACE --- apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE automountServiceAccountToken: false --- apiVersion: v1 kind: Pod metadata: name: aws-cli-example namespace: NAMESPACE spec: serviceAccount: KSA_NAME containers: - name: aws-cli image: amazon/aws-cli:latest command: - /bin/bash - -c - "set -eu -o pipefail; while true; do aws ec2 describe-availability-zones; sleep 5; done" env: - name: AWS_ROLE_ARN value: AWS_ROLE_ARN - name: AWS_WEB_IDENTITY_TOKEN_FILE value: /var/run/secrets/aws-iam-token/serviceaccount/token - name: AWS_REGION value: AWS_REGION volumeMounts: - mountPath: /var/run/secrets/aws-iam-token/serviceaccount name: aws-iam-token readOnly: true volumes: - name: aws-iam-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: sts.amazonaws.com expirationSeconds: 86400 path: token
更改下列內容:
NAMESPACE
KSA_NAME
AWS_ROLE_ARN
:應用程式的 AWS IAM 角色 ARNAWS_REGION
:叢集的 AWS 區域
套用資訊清單:
kubectl apply -f workload-identity-test.yaml
請稍候幾分鐘,等待 Pod 啟動,然後繼續進行下一個部分。
確認範例應用程式是否正常運作
如要確認範例應用程式可以存取 EC2 API,請查看 Pod 的記錄:
kubectl logs -f aws-cli-example -n NAMESPACE
如果 Pod 可以存取 EC2 API,輸出內容會包含 EC2 可用區的相關資訊,類似於下列內容:
-------------------------------------------------
| DescribeAvailabilityZones |
+-----------------------------------------------+
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az1 ||
|| ZoneName | us-west-2a ||
|+---------------------+-----------------------+|
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az2 ||
|| ZoneName | us-west-2b ||
|+---------------------+-----------------------+|
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az3 ||
|| ZoneName | us-west-2c ||
|+---------------------+-----------------------+|
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az4 ||
|| ZoneName | us-west-2d ||
|+---------------------+-----------------------+|
清除所用資源
如要移除這個範例應用程式,請按照下列步驟操作:
從叢集刪除範例應用程式的資訊清單:
kubectl delete -f workload-identity-test.yaml
從角色中分離 AWS IAM 政策:
aws iam detach-role-policy --role-name AWS_ROLE_NAME \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
將
AWS_ROLE_NAME
替換為應用程式的 AWS IAM 角色名稱。刪除 AWS IAM 角色:
aws iam delete-role --role-name AWS_ROLE_NAME
將
AWS_ROLE_NAME
替換為應用程式的 AWS IAM 角色名稱。刪除 AWS IAM OIDC 提供者:
aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
將
PROVIDER_ARN
替換為叢集的 IAM OIDC 提供者 ARN。