協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 IAM 角色指派給 Kubernetes 服務帳戶
本主題說明如何設定 Kubernetes 服務帳戶以擔任 AWS Identity and Access Management (IAM) 角色。然後,任何設定為使用服務帳戶的 Pod 都可以存取該角色有權存取的任何 AWS 服務。
先決條件
-
現有的叢集。如果您沒有,您可以遵循 中的其中一個指南來建立一個開始使用 Amazon EKS。
-
叢集的現有 IAM OpenID Connect (OIDC) 提供商。若要了解是否已經擁有,或是了解如何建立,請參閱為您的叢集建立 IAM OIDC 身分提供者。
-
裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本
1.27.1602.12.3或更新版本。若要檢查您目前的版本,請使用aws --version | cut -d / -f2 | cut -d ' ' -f1。適用於 macOS 的yum、apt-get或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本,請參閱《 AWS 命令列界面使用者指南》中的使用 aws 設定安裝 和快速組態。 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它,請參閱《CloudShell AWS 使用者指南》中的將 CLI 安裝到您的主目錄。 AWS CloudShell -
kubectl命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與叢集的 Kubernetes 版本相同,也可以比叢集的 Kubernetes 版本更早或更晚一個次要版本。例如,如果您的叢集版本為1.29,則可以搭配使用kubectl1.28、1.29或1.30版。若要安裝或升級kubectl,請參閱 設定 kubectl 和 eksctl。 -
包含叢集組態的現有
kubectlconfig檔案。若要建立kubectlconfig檔案,請參閱建立 kubeconfig 檔案,將 kubectl 連接至 EKS 叢集。
步驟 1:建立 IAM 政策
如果您要將現有 IAM 政策與 IAM 角色建立關聯,請跳到下一步驟。
-
建立 IAM 政策。您可以建立自己的政策,或複製已授予部分所需許可的 AWS 受管政策,並根據您的特定需求進行自訂。如需詳細資訊,請參閱「IAM 使用者指南」中的建立 IAM 政策。
-
建立檔案,其中包含您希望 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 -
建立 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 服務帳戶,則可以略過此步驟。
-
建立 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 -
使用下列命令將 AWS 您的帳戶 ID 設定為 環境變數。
account_id=$(aws sts get-caller-identity --query "Account" --output text) -
使用下列命令,將叢集的 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:\/\///") -
設定命名空間和服務帳戶名稱的變數。將
my-service-account取代為您想要擔任該角色的 Kubernetes 服務帳戶。將default取代為服務帳戶的命名空間。export namespace=default export service_account=my-service-account -
執行下列命令以建立 IAM 角色的信任政策檔案。如果您想要允許命名空間中的所有服務帳戶使用該角色,請將以下內容複製到您的裝置。將
StringEquals取代為StringLike,並將$service_account取代為*。您可以在StringEquals和StringLike條件中新增多個項目,以允許多個服務帳戶或命名空間擔任角色。若要允許來自與叢集所在 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 -
建立角色。將
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" -
將 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 -
使用您希望服務帳戶擔任之 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 -
(選用) 設定服務帳戶 AWS 的安全字符服務端點。 AWS 建議使用區域 AWS STS 端點而非全域端點。這樣可以減少延遲、提供內建備援,並增加工作階段字符的有效性。
步驟 3:確認組態
-
確認 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" } } } ] } -
確認您在上一步連接至角色的政策已連接至該角色。
aws iam list-attached-role-policies --role-name my-role --query "AttachedPolicies[].PolicyArn" --output text範例輸出如下。
arn:aws: iam::111122223333:policy/my-policy -
設定變數以存放您要使用之政策的 Amazon Resource Name (ARN)。將
my-policy取代為您要確認許可的政策名稱。export policy_arn=arn:aws: iam::111122223333:policy/my-policy -
檢視預設政策版本。
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", [...] } } -
檢視政策內容,以確保政策包含 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內容有所不同。 -
確認 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 [...]