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

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

指派 IAM 角色至 Kubernetes 服務帳戶

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

必要條件

步驟 1:建立 IAM 政策

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

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

  2. 建立包含您想要 之 AWS 服務許可的檔案 Pods 以存取。如需所有 AWS 服務的所有動作清單,請參閱服務授權參考

    您可以執行以下命令來建立允許唯讀存取 Amazon S3 儲存貯體的範例政策檔案。您可以選擇性地將組態資訊或引導指令碼存放在此儲存貯體,以及 中的容器 Pod 可以從儲存貯體讀取檔案,並將其載入您的應用程式。如果您要建立此範例政策,請將以下內容複製到您的裝置。Replace (取代) 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)

裝置 or AWS CloudShell 上安裝的eksctl命令列工具版本 0.194.0或更新版本。如需有關安裝或更新 eksctl 的指示,請參閱 eksctl 文件中的安裝一節。

Replace (取代) my-service-account 名稱為 的 Kubernetes eksctl 您要建立並與 IAM 角色建立關聯的 服務帳戶。Replace (取代) default 使用eksctl您要在其中建立服務帳戶的命名空間。Replace (取代) my-cluster 您的叢集名稱。Replace (取代) my-role 包含您要與服務帳戶建立關聯之角色的名稱。如果它尚未存在,請為您eksctl建立它。Replace (取代) 111122223333 使用您的帳戶 ID 和 my-policy 現有政策的名稱。

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)

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

  1. 建立 Kubernetes 服務帳戶。將以下內容複製到您的裝置。Replace (取代) 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 使用下列命令將身分提供者提供給環境變數。Replace (取代) 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. 設定命名空間和服務帳戶名稱的變數。Replace (取代) my-service-account 使用 Kubernetes 您要擔任該角色的服務帳戶。Replace (取代) default 服務帳戶的命名空間。

    export namespace=default export service_account=my-service-account
  5. 執行下列命令,為 IAM 角色建立信任政策檔案。如果您想要允許命名空間中的所有服務帳戶使用該角色,請將以下內容複製到您的裝置。Replace (取代) 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. 建立角色。Replace (取代) 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 政策連接至您的角色。Replace (取代) 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) 為服務帳戶加上註釋。Replace (取代) my-role 您現有 IAM 角色的名稱。假設您允許來自與叢集所在的 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 Security Token Service 端點。 AWS 建議使用 regional 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)。Replace (取代) 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 [...]

後續步驟