为什么不能在我的 Amazon EKS 容器组中使用服务账户的 IAM 角色?
我尝试为服务账户使用 AWS Identity and Access Management(IAM)角色。我的 Amazon Elastic Kubernetes Service(Amazon EKS)容器组(pod)因授权错误而无法代入分配的 IAM 角色。或者,我的容器组(pod)尝试使用分配给 Amazon EKS 节点的默认 IAM 角色,而不是分配给我的容器组(pod)的 IAM 角色。
解决方法
注意: 如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅 Troubleshoot AWS CLI errors。此外,确保您使用的是最新版本的 AWS CLI。
确认您的 Amazon EKS 集群有 IAM OIDC 身份提供商
如果您还没有 IAM OIDC 提供商,请为您的集群创建 IAM OIDC 提供商。您的集群必须有 OIDC 身份提供商才能为您的服务账户使用 IAM 角色。
然后,验证 OIDC 身份提供商的配置是否正确:
- 打开 IAM 控制台。在导航窗格中,选择身份提供商。
- 在提供商列中,识别并记下 OIDC 提供商 URL。
- 在一个单独的选项卡或窗口中,打开 Amazon EKS 控制台。然后,从导航窗格中选择集群。
- 选择您的集群,然后选择配置选项卡。
- 在详细信息部分中,准确记下 OpenID Connect 提供商 URL 的值。
- 验证来自 Amazon EKS 控制台的 OIDC 提供商 URL(步骤 5)是否与 IAM 控制台中的 OIDC 提供商 URL 相匹配(步骤 2)。
如果您的 Amazon EKS 集群的 OIDC 提供商 URL 与 IAM 控制台中的任何 OIDC 提供商 URL 都不匹配,则您必须创建一个新的 IAM OIDC 提供商。
验证您的 IAM 角色策略和信任策略配置
您的 IAM 角色可能不具备所需的全部权限。如果您使用 AWS 管理控制台或 AWS CLI 创建 IAM 角色,则您的 IAM 角色的信任关系策略也可能存在语法错误。
要验证您的 IAM 角色策略并检查信任策略中是否存在语法错误,请执行以下操作:
- 打开 IAM 控制台。
- 在导航窗格中,选择角色,然后选择您的角色。
- 在您的角色页面上选择权限选项卡,然后验证是否已将所有所需的权限分配给了该角色。
- 选择信任关系选项卡,然后选择编辑信任关系。
- 在您的信任关系的策略文档中,验证您的策略格式是否与以下 JSON 策略的格式相匹配:
在您的 JSON 策略中,查看 Federated 属性行和 StringEquals 属性行的格式。在 Federated 行中,确认您的 AWS 区域代码(your-region-code)、账户 ID(your-account-id)和唯一 OIDC 标识符(EXAMPLE_OIDC_IDENTIFIER)格式正确。在 StringEquals 行中,确认您的区域代码(your-region-code)、OIDC 唯一标识符(EXAMPLE_OIDC_IDENTIFIER)、Kubernetes 命名空间(your-namespace)和 Kubernetes 服务账户名称(your-namespace)格式正确。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account", "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com" } } } ] }
- 如果您编辑了策略文档以更正格式错误,请选择更新信任策略。
确认您的服务账户存在并且 IAM 角色的 ARN 注释格式正确
-
确认您的 Kubernetes 服务账户存在:
$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
**注意:**将 YOUR_ACCOUNT_NAME 替换为您的账户名。请将 YOUR_NAMESPACE 替换为您的命名空间。
如果前面的命令未返回服务账号名称,则创建一个服务账号。有关更多信息,请参阅 Kubernetes 网站上的 Use more than one ServiceAccount。 -
确认您的服务账号名称正确无误。另外,请确认其 role-arn 注释的格式正确。例如:
apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role name: my-example-serviceaccount namespace: my-test-namespace
使用测试容器组(pod)验证服务账号是否正常运行
运行测试容器组(pod)以验证服务账号是否正常运行。然后,检查容器组(pod)是否可以正确挂载环境变量并可以代入指定的 IAM 角色。
-
创建一个名为 awscli-pod.yaml 的本地 YAML 文件。例如:
apiVersion: v1 kind: Pod metadata: name: awscli labels: app: awscli spec: serviceAccountName: YOUR_SERVICE_ACCOUNT containers: - image: amazon/aws-cli command: - "sleep" - "604800" imagePullPolicy: IfNotPresent name: awscli restartPolicy: Always
**注意:**请将 YOUR_SERVICE_ACCOUNT 替换为您的 Kubernetes 服务账户名。
-
在您的命名空间中创建测试容器组(pod)(来自 YAML 文件):
$ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE
**注意:**请将 YOUR_NAMESPACE 替换为您的命名空间。
-
确认 awscli 容器组(pod)具有正确的环境变量:
$ kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS
输出类似于以下内容:
AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
-
确认测试容器组(pod)具有正确的 IAM 角色:
$ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity
输出类似于以下内容:
{ "UserId": "REDACTEDY471234567890:botocore-session-1632772568", "Account": "012345678912", "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568" }
记下 Arn 值,包括此输出中的 IAM 角色名称。
-
验证 IAM 角色后,删除 awscli 容器组(pod):
$ kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE
如果 awscli 容器组(pod)显示正确的 IAM 角色,则服务账户的 IAM 角色功能可以正常工作。
前面的步骤确认 IAM 令牌已正确挂载到容器组(pod)上。如果您的应用程序仍然无法正确使用令牌文件,则应用程序或 SDK 可能存在问题。此问题可能与应用程序如何提取 AWS 凭证有关,也可能与 SDK 版本不受支持有关。有关更多信息,请参阅 Using the Default Credential Provider Chain、Boto3 网站上的 Credentials 和将 IRSA 与 AWS SDK 结合使用。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 4 个月前
- AWS 官方已更新 3 年前