搭配 AWS 使用 Workload Identity

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 供應商,可以略過本節。

如要建立供應商,請按照下列步驟操作:

  1. 判斷叢集的 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。請儲存這個值,以供後續步驟使用。

  2. 接著,請使用下列指令建立 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 角色並附加政策,請按照下列步驟操作:

  1. 從核發機構 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。請儲存這個值。稍後需使用這項資訊。

  2. 執行下列指令,判斷供應商的 Amazon 資源名稱 (ARN):

    aws iam list-open-id-connect-providers --output=text \
        --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
    

    ISSUER_HOST 替換為叢集簽發者 URI 的主機名稱。

  3. 接著,請建立信任政策,為 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 提供者的 ARN
    • ISSUER_HOST:叢集簽發者 URI 的主機名稱。
    • NAMESPACE:應用程式執行的 Kubernetes 命名空間
    • KSA_NAME:應用程式使用的 Kubernetes 服務帳戶 (KSA)
  4. 建立 AWS IAM 角色:

    aws iam create-role --role-name=AWS_ROLE_NAME \
        --assume-role-policy-document file://trust-policy.json
    

    AWS_ROLE_NAME 替換為應用程式的 AWS IAM 角色名稱。

  5. 將 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
    

部署範例應用程式

如要測試工作負載身分,請按照下列步驟部署範例應用程式:

  1. 判斷角色的 ARN:

    aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
    

    取代 AWS_ROLE_NAME

  2. 為 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 角色 ARN
    • AWS_REGION:叢集的 AWS 區域
  3. 套用資訊清單:

    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           ||
|+---------------------+-----------------------+|

清除所用資源

如要移除這個範例應用程式,請按照下列步驟操作:

  1. 從叢集刪除範例應用程式的資訊清單:

    kubectl delete -f workload-identity-test.yaml
    
  2. 從角色中分離 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 角色名稱。

  3. 刪除 AWS IAM 角色:

    aws iam delete-role --role-name AWS_ROLE_NAME
    

    AWS_ROLE_NAME 替換為應用程式的 AWS IAM 角色名稱。

  4. 刪除 AWS IAM OIDC 提供者:

    aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
    

    PROVIDER_ARN 替換為叢集的 IAM OIDC 提供者 ARN。

後續步驟