指派 IAM 角色至 Kubernetes 服務帳戶 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

指派 IAM 角色至 Kubernetes 服務帳戶

本主題介紹如何設定藉助 EKS Pod 身分識別擔任 AWS Identity and Access Management (IAM) 角色的 Kubernetes 服務帳戶。任何設定為使用該服務帳戶的 AWS 服務都可以存取該角色有權存取的任何服務。

若要建立 EKS Pod 身分識別關聯,只需一個步驟;您可以透過 AWS 管理主控台、AWS CLI、AWS SDK、AWS CloudFormation 和其他工具在 EKS 中建立關聯。在任何 Kubernetes 物件中,叢集內部的關聯沒有任何資料或中繼資料,也不會將任何註解新增至服務帳戶。

先決條件

  • 現有的叢集。如果您沒有,則可以按照其中一個 開始使用 Amazon EKS 指南來建立。

  • 建立關聯的 IAM 主體必須具有 iam:PassRole

  • 已在裝置或 AWS CloudShell 上安裝和設定 AWS CLI 的最新版本。您可以使用 aws --version | cut -d / -f2 | cut -d ' ' -f1 來檢查您的目前版本。如 yumapt-get 或適用於 macOS 的 Homebrew 等套件管理工具通常比最新版本的 AWS CLI 落後數個版本之多。若要安裝最新版本,請參閱《AWS 命令列介面使用者指南》中的安裝使用 aws configure 的快速組態設定。AWS CloudShell 中安裝的 AWS CLI 版本也可能比最新版本落後數個版本。若要更新,請參閱《AWS CloudShell 使用者指南》中的安裝 AWS CLI 至您的主目錄

  • 已在裝置或 AWS CloudShell 上安裝 kubectl 命令列工具。版本可以與您的叢集 Kubernetes 版本相同,或是為最多比該版本更舊一版或更新一版的次要版本。例如,如果您的叢集版本為 1.29,則可以搭配使用 kubectl 1.281.291.30 版。若要安裝或升級 kubectl,請參閱 設定 kubectl 和 eksctl

  • 包含叢集組態的現有 kubectl config 檔案。若要建立 kubectl config 檔案,請參閱透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集

建立 Pod 身分識別關聯 (AWS 主控台)

  1. 開啟 Amazon EKS 主控台

  2. 在左側導覽窗格中,選取叢集,然後選取您要為其設定 EKS Pod 身分識別代理程式附加元件之叢集的名稱。

  3. 選擇存取索引標籤。

  4. Pod 身分識別關聯中,選擇建立

  5. 對於 IAM 角色,選取具有您希望工作負載擁有許可的 IAM 角色。

    注意

    此清單僅包含具有下列信任政策的角色,允許 EKS Pod 身分識別使用這些角色。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }

    sts:AssumeRole:EKS Pod 身分識別會先使用 AssumeRole 來擔任 IAM 角色,然後將臨時憑證傳至您的 Pod。

    sts:TagSession:EKS Pod 身分識別會使用 TagSession,以便在向 AWS STS 發出的請求中包括工作階段標籤

    您可以在信任政策的條件索引鍵中使用這些標籤,用來限制哪些服務帳戶、命名空間和叢集可以使用此角色。

    如需 Amazon EKS 條件金鑰的清單,請參閱服務授權參考中的 Amazon Elastic Kubernetes Service 定義的條件。若要了解您可以搭配哪些動作和資源使用條件索引鍵,請參閱 Amazon Elastic Kubernetes Service 定義的動作

  6. 針對 Kubernetes 命名空間,選取包含服務帳戶和工作負載的 Kubernetes 命名空間。或者,您可以使用名稱 (不存在於叢集中) 指定命名空間。

  7. 針對 Kubernetes 服務帳戶,選取要使用的 Kubernetes 服務帳戶。Kubernetes 工作負載的清單檔案必須指定此服務帳戶。或者,您可以使用名稱 (不存在於叢集中) 指定服務帳戶。

  8. (選用) 對於標籤,請選擇新增標籤,以在鍵值對中新增中繼資料。這些標籤會套用至關聯,可用於 IAM 政策。

    您可以多次重複此步驟以新增多個標籤。

  9. 選擇建立

建立 Pod 身分識別關聯 (AWS CLI)

  1. 如果您要將現有 IAM 政策與 IAM 角色建立關聯,請跳到下一步驟。

    建立 IAM 政策。您可以建立自己的政策,或複製已授予您所需的某些許可的 AWS 受管政策,並根據您的特定要求加以自訂。如需詳細資訊,請參閱「IAM 使用者指南」中的建立 IAM 政策

    1. 根據您要讓 Pod 存取的 AWS 服務,建立內含相關許可的檔案。如需所有 AWS 服務的完整動作清單,請參閱服務授權參考

      您可以執行以下命令來建立允許唯讀存取 Amazon S3 儲存貯體的範例政策檔案。您可以選擇性地將組態資訊或引導指令碼存放在此儲存貯體中,而 Pod 中的容器可從儲存貯體讀取檔案,並載入至您的應用程式。如果您要建立此範例政策,請將以下內容複製到您的裝置。將 my-pod-secrets-bucket 取代為您的儲存貯體名稱並執行命令。

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. 建立 IAM 政策。

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. 建立 IAM 角色並與 Kubernetes 服務帳戶建立關聯。

    1. 如果您有要擔任 IAM 角色的現有 Kubernetes 服務帳戶,則可略過此步驟。

      建立 Kubernetes 服務帳戶。將以下內容複製到您的裝置。視需要將 my-service-account 取代為您要使用的名稱,將 default 取代為其他命名空間。如果您變更 default,命名空間必須已經存在。

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml

      執行下列命令。

      kubectl apply -f my-service-account.yaml
    2. 執行下列命令以建立 IAM 角色的信任政策檔案。

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] } EOF
    3. 建立角色。將 my-role 取代為您的 IAM 角色名稱,並將 my-role-description 取代為您角色的描述。

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    4. 將 IAM 政策連接至您的角色。將 my-role 取代為您的 IAM 角色名稱,將 my-policy 取代為您建立的現有政策名稱。

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::111122223333:policy/my-policy
      注意

      與服務帳戶的 IAM 角色不同,EKS Pod 身分識別不會在服務帳戶上使用註釋。

    5. 執行下列命令以建立關聯。視需要使用叢集名稱取代 my-cluster,使用您要使用的名稱取代 my-service-account,使用其他命名空間取代 default

      aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws:iam::111122223333:role/my-role --namespace default --service-account my-service-account

      範例輸出如下。

      { "association": { "clusterName": "my-cluster", "namespace": "default", "serviceAccount": "my-service-account", "roleArn": "arn:aws:iam::111122223333:role/my-role", "associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1", "associationId": "a-abcdefghijklmnop1", "tags": {}, "createdAt": 1700862734.922, "modifiedAt": 1700862734.922 } }
      注意

      您可以使用名稱 (不存在於叢集中) 指定命名空間和服務帳戶。您必須建立命名空間、服務帳戶以及使用服務帳戶進行 EKS Pod 身分識別關聯才能運作的工作負載。

確認組態

  1. 確認 IAM 角色的信任政策設定正確。

    aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

    範例輸出如下。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Allow EKS Auth service to assume this role for Pod Identities", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
  2. 確認您在上一步連接至角色的政策已連接至該角色。

    aws iam list-attached-role-policies --role-name my-role --query 'AttachedPolicies[].PolicyArn' --output text

    範例輸出如下。

    arn:aws:iam::111122223333:policy/my-policy
  3. 設定變數以存放您要使用之政策的 Amazon Resource Name (ARN)。將 my-policy 取代為您要確認許可的政策名稱。

    export policy_arn=arn:aws:iam::111122223333:policy/my-policy
  4. 檢視預設政策版本。

    aws iam get-policy --policy-arn $policy_arn

    範例輸出如下。

    { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
  5. 檢視政策內容,以確定政策包含您的 Pod 需要的所有許可。視需要將以下命令中的 1 取代為上一個輸出中傳回的版本。

    aws iam get-policy-version --policy-arn $policy_arn --version-id v1

    範例輸出如下。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

    如果您在上一步建立了範例政策,則輸出結果相同。如果您建立了不同的政策,則 example 內容有所不同。

後續步驟

設定 Pod 透過服務帳戶來存取 AWS 服務