我在 Amazon Elastic Kubernetes Service(Amazon EKS)中收到以下错误:“Your current user or role does not have access to Kubernetes objects on this EKS cluster.(您的当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象。)”
简短描述
当您将 AWS 管理控制台与 AWS Identity and Access Management(IAM)用户或角色配合使用时,可能会收到此错误。该错误表示 IAM 用户或角色缺乏访问 Kubernetes API 所需的 RBAC(来自 Kubernetes 网站)权限。要在 AWS 管理控制台上查看 Kubernetes 资源,您的 AWS IAM 用户或角色必须映射到 Amazon EKS 集群中的 aws-auth ConfigMap。
创建 Amazon EKS 集群时,您的 IAM 用户或角色会自动在集群的 RBAC 配置中被授予 system:masters 权限。这使您可以通过 Amazon EKS 控制台查看 Kubernetes 资源。还使您可以在 Kubernetes 中编辑 aws-auth ConfigMap,并向其他 AWS 用户或角色授予与集群交互的能力。
正在使用两种不同的授权系统。AWS 管理控制台使用 IAM。EKS 集群使用 Kubernetes RBAC 系统(来自 Kubernetes 网站)。集群的 aws-auth ConfigMap 将 IAM 身份(用户或角色)与集群 RBAC 身份相关联。这意味着 aws-auth ConfigMap 将 IAM 身份与 Kubernetes 身份相关联。
解决方法
先决条件
开始之前,请收集以下信息。
非管理员用户或角色
如果您不是集群管理员 IAM 用户或角色,并且需要在 Amazon EKS 控制台上获得可见性,请完成以下步骤:
1. 获取 AWS 管理控制台用户的 IAM 身份 Amazon 资源名称(ARN)。
如果是 IAM 角色,则使用以下 ARN 格式:
arn:aws:iam::111122223333:role/example
**重要提示:**请勿使用以下格式:
arn:aws:iam::111122223333:role/my-team/developers/example
2. 向您的集群管理员提供 ARN,并请求管理员将您添加到 aws-auth ConfigMap。
注意:有关如何访问您的 ARN 的步骤,请参阅识别 AWS 管理控制台用户的 IAM 身份 ARN 部分。
集群创建者或集群管理员用户或角色
如果您是集群创建者或集群管理员,则使用 kubectl 工具或 eksctl 工具来管理 aws-auth ConfigMap。
**注意:**默认情况下,system: masters 组绑定到名为 cluster-admin 的 clusterrole。此 clusterrole 在其 PolicyRule 中使用通配符(“*”)表示资源和动词。这意味着分配给 system:masters 组的任何用户都具有对集群内所有 Kubernetes 资源的完全访问权限。
有关集群创建者和集群管理员如何识别其管理员状态的详细步骤,请参阅识别集群创建者部分。
识别 AWS 管理控制台用户的 IAM 身份 ARN
识别您用于访问控制台的 IAM 用户或角色。这可能与您在 AWS 命令行界面(AWS CLI)中使用的身份不同。确认已识别的 IAM 用户或角色有权在 AWS 管理控制台中查看所有集群的节点和工作负载。然后,获取 IAM 身份的 ARN。使用以下任意一个选项访问 ARN。
使用 AWS CLI
如果您拥有对 IAM 用户或角色的 AWS CLI 访问权限,请运行以下命令:
aws sts get-caller-identity --query Arn
启动 CloudShell
如果您没有 AWS CLI 访问权限,请运行以下命令:
aws sts get-caller-identity --query Arn
输出与以下类似:
"arn:aws:iam::111122223333:role/testrole"
-或者-
"arn:aws:iam::111122223333:user/testuser"
注意:
- 如果是 IAM 角色 ARN,请确保其格式与您从先决条件部分获得的 ARN 格式相似。
- 如果 ARN 包含 assumed-role,您必须获取该角色的 ARN。例如,arn:aws:sts::123456:assumed-role/MyRole/aadams 的代入角色 ARN 与 角色 ARN arn:aws:sts::123456:role/MyRole 相关联。您可以在 IAM 控制台中验证此值。
识别集群创建者
要查找具有主要集群配置权限的集群创建者或管理员角色,请在 AWS CloudTrail 中搜索 CreateCluster API 调用。然后,检查该 API 调用的 userIdentity 部分。
**提示:**如果您在 CloudTrail 中找到集群创建者名称但它已被删除,则使用相同名称重新创建一个新的 IAM 用户或角色。由于这个新的 IAM 实体与原始集群创建者具有相同的 ARN,因此它继承了集群的相同管理员访问权限。
**注意:**CloudTrail 仅提供 90 天的历史记录。
使用 kubectl 或 eksctl 向 Kubernetes RBAC 添加新的 IAM 用户或角色
在选择 kubectl 或 eksctl 工具编辑 aws-auth ConfigMap 之前,请务必完成步骤 1。然后,按照步骤 2-4 使用 kubectl 进行编辑。要使用 eksctl 进行编辑,请继续执行步骤 5。
1. 识别集群创建者或管理员后,将 AWS CLI 配置为使用集群创建者 IAM。有关更多信息,请参阅配置基础知识。
要验证 AWS CLI 是否已正确配置 IAM 实体,请运行以下命令:
$ aws sts get-caller-identity
输出将返回 IAM 用户或角色的 ARN。例如:
{
"UserId": "XXXXXXXXXXXXXXXXXXXXX",
"Account": "XXXXXXXXXXXX",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI。
2. 要使用 kubectl 修改 aws-auth ConfigMap,您必须有权访问集群。运行以下 kubectl 命令:
$ kubectl edit configmap aws-auth -n kube-system
控制台显示当前的 ConfigMap。
如果您无法连接到集群,请尝试更新您的 kubeconfig 文件。使用有权访问集群的 IAM 身份运行该文件。创建集群的身份始终具有集群访问权限。
aws eks update-kubeconfig --region region_code --name my_cluster
**注意:**将 region_code 替换为您的 EKS 集群 AWS 区域代码,将 my_cluster 替换为您的 EKS 集群名称。
kubectl 命令必须连接到 EKS 服务器端点。如果 API 服务器端点是公有的,则您必须具有互联网访问权限才能连接到该端点。如果 API 服务器端点是私有的,则您必须从运行 EKS 集群的 VPC 内连接到 EKS 服务器端点。
3. 要以集群创建者或管理员的身份在文本编辑器中编辑 aws-auth ConfigMap,请运行以下命令:
$ kubectl edit configmap aws-auth -n kube-system
4. 添加 IAM 用户或角色:
mapUsers: |
- userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
username: testuser
groups:
- system:bootstrappers
- system:nodes
-或者-
添加 IAM 角色到 mapRoles。例如:
mapRoles: |
- rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
username: testrole
groups:
- system:bootstrappers
- system:nodes
考虑以下信息:
- system:masters 允许超级用户访问,以在任何资源上执行任何操作。这不是生产环境的最佳实践。
- 最佳实践是尽量减少授予的权限。考虑创建一个只能访问特定命名空间的角色。有关信息,请参阅 Kubernetes 网站上的 Using RBAC Authorization(使用 RBAC 授权)。另请参阅所需权限,并查看在特定命名空间中查看 Kubernetes 资源部分,查看 Amazon EKS 控制台受限访问的示例。
5. eksctl 工具使您可以使用以下命令更新 aws-auth ConfigMap:
eksctl create iamidentitymapping --cluster your_cluster_Name --region=your_region --arn YOUR_IAM_ARN <arn:aws:iam::123456:role testing=""> --group system:masters --username admin</arn:aws:iam::123456:role>
**注意:**将 your_cluster_Name 替换为您的 EKS 集群名称,将 your_region 替换为您的 EKS 集群区域,将 YOUR_IAM_ARN 替换为您的 IAM 角色或使用 ARN。
验证对 Amazon EKS 集群的访问权限
1. 打开 Amazon EKS 控制台。
2. 在导航窗格的 Amazon EKS 部分中,选择集群。
3. 选择您的集群。
4. 检查概述和工作负载选项卡是否有错误。
如果已针对特定命名空间进行配置,则会在 Amazon EKS 控制台中看到以下错误消息:
Error loading Deployments
deployments.apps is forbidden: User "xxxxxx" cannot list resource "deployments" in API group "apps" at the cluster scope or in the namespace "xxxxxxx"
特定命名空间不会出现此错误。
要对错误消息进行问题排查,请参阅看不到“计算”选项卡上的“节点”或“资源”选项卡上的任何内容,您在 AWS 管理控制台中收到错误。