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

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

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

指派IAM角色給Kubernetes服務帳戶

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

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

  • 叢集的現有 IAM OpenID Connect (OIDC) 提供者。若要了解是否已經擁有,或是了解如何建立,請參閱為您的叢集建立IAMOIDC提供者

  • 您裝置上安裝和設定的 AWS Command Line Interface (AWS CLI) 的版本1.27.160或更新版本、版本或更新版本或更新版本或更新版本 AWS CloudShell。2.12.3若要檢查您目前的版本,請使用 aws --version | cut -d / -f2 | cut -d ' ' -f1。如 yumapt-get 或適用於 macOS 的 Homebrew 等套件管理工具通常比最新版本的 AWS CLI落後數個版本之多。若要安裝最新版本,請參閱《AWS Command Line Interface 使用者指南》中的安裝、更新和解除安裝 AWS CLI以及使用 aws configure 的快速組態。安裝在中的 AWS CLI 版本也 AWS CloudShell 可能是最新版本之後的幾個版本。若要進行更新,請參閱《AWS CloudShell 使用者指南》中的〈安裝 AWS CLI 到主目錄

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

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

若要將IAM角色與Kubernetes服務帳戶建立關聯
  1. 如果您想要將現有IAM原則與您的IAM角色相關聯,請跳至下一個步驟

    建立IAM策略。您可以建立自己的原則,或複製已授與部分所需權限的 AWS 受管理原則,並根據您的特定需求自訂。如需詳細資訊,請參閱《使用指南》中的IAM〈建立IAM策略

    1. 建立包含您要存取之 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
    2. 建立IAM策略。

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. 建立IAM角色並將其與Kubernetes服務帳戶建立關聯。您可以使用 eksctl 或 AWS CLI。

    eksctl
    先決條件

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

    Replace (取代) my-service-account 使用您要eksctl建立並與IAM角色關聯的Kubernetes服務帳戶名稱。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
    1. 如果您有要擔任IAM角色的現有Kubernetes服務帳戶,則可以略過此步驟。

      建立 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 身分提供者設定為環境變數。使用您叢集的名稱取代 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 服務帳戶。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. 建立角色。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 資源名稱 (ARN) 為您的服務帳戶註釋。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
  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 資源名稱 (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
      [...]
  4. (選擇性) 設定服務帳戶的 AWS Security Token Service 端點。 AWS 建議使用區域 AWS STS 端點而非全域端點。這樣可以減少延遲、提供內建備援,並增加工作階段字符的有效性。

下一步驟

設定Pods為使用服Kubernetes務帳戶