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

協助改善此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 IAM 角色指派給 Kubernetes 服務帳戶

本主題說明如何設定 Kubernetes 服務帳戶以擔任 AWS Identity and Access Management (IAM) 角色。然後,任何設定為使用服務帳戶的 Pod 都可以存取該角色有權存取的任何 AWS 服務。

先決條件

步驟 1:建立 IAM 政策

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

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

  2. 建立檔案,其中包含您希望 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
  3. 建立 IAM 政策。

    aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json

步驟 2:建立和關聯 IAM 角色

建立 IAM 角色並將其與 Kubernetes 服務帳戶建立關聯。您可以使用 eksctl或 AWS CLI。

建立和關聯角色 (eksctl)

eksctl命令會在指定的命名空間中建立 Kubernetes 服務帳戶、建立具有指定名稱的 IAM 角色 (如果不存在)、將現有的 IAM 政策 ARN 連接到角色,並使用 IAM 角色 ARN 註釋服務帳戶。請務必將此命令中的範例預留位置值取代為您的特定值。如需有關安裝或更新 eksctl 的指示,請參閱 eksctl 文件中的安裝一節。

eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws: iam::111122223333:policy/my-policy --approve
重要

如果角色或服務帳戶已經存在,上一個命令可能會失敗。您可以為 eksctl 提供在這些情況下的不同選項。如需詳細資訊,請執行 eksctl create iamserviceaccount --help

建立角色並建立關聯 (AWS CLI)

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

  1. 建立 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
  2. 使用下列命令將 AWS 您的帳戶 ID 設定為 環境變數。

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  3. 使用下列命令,將叢集的 OIDC 身分提供者設定為 環境變數。使用您叢集的名稱取代 my-cluster

    oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  4. 設定命名空間和服務帳戶名稱的變數。將 my-service-account 取代為您想要擔任該角色的 Kubernetes 服務帳戶。將 default 取代為服務帳戶的命名空間。

    export namespace=default export service_account=my-service-account
  5. 執行下列命令以建立 IAM 角色的信任政策檔案。如果您想要允許命名空間中的所有服務帳戶使用該角色,請將以下內容複製到您的裝置。將 StringEquals 取代為 StringLike,並將 $service_account 取代為 *。您可以在 StringEqualsStringLike 條件中新增多個項目,以允許多個服務帳戶或命名空間擔任角色。若要允許來自與叢集所在 AWS 帳戶不同的 帳戶的角色擔任該角色,請參閱 使用 IRSA 驗證至另一個帳戶 以取得詳細資訊。

    cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
  6. 建立角色。將 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"
  7. 將 IAM 政策連接至您的角色。將 my-role 取代為您的 IAM 角色名稱,並將 my-policy 取代為您建立的現有政策名稱。

    aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws: iam::$account_id:policy/my-policy
  8. 使用您希望服務帳戶擔任之 IAM 角色的 Amazon Resource Name (ARN) 標註您的服務帳戶。使用現有 IAM 角色的名稱取代 my-role。假設您允許來自與叢集所在 AWS 帳戶不同的 帳戶的角色,以在上一個步驟中擔任該角色。然後,請務必從另一個 AWS 帳戶指定帳戶和角色。如需詳細資訊,請參閱使用 IRSA 驗證至另一個帳戶

    kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws: iam::$account_id:role/my-role
  9. (選用) 設定服務帳戶 AWS 的安全字符服務端點。 AWS 建議使用區域 AWS STS 端點而非全域端點。這樣可以減少延遲、提供內建備援,並增加工作階段字符的有效性。

步驟 3:確認組態

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

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

    範例輸出如下。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws: iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
  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 內容有所不同。

  6. 確認 Kubernetes 服務帳戶已標註 角色。

    kubectl describe serviceaccount my-service-account -n default

    範例輸出如下。

    Name: my-service-account Namespace: default Annotations: eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/my-role Image pull secrets: <none> Mountable secrets: my-service-account-token-qqjfl Tokens: my-service-account-token-qqjfl [...]

後續步驟