如何解决 Amazon EKS 中的“Your current user or role does not have access to Kubernetes objects on this EKS cluster”错误?

3 分钟阅读
0

我在 Amazon Elastic Kubernetes Service(Amazon EKS)中收到下列错误: “Your current user or role does not have access to Kubernetes objects on this EKS cluster.”

简短描述

当您将 AWS 管理控制台与 AWS Identity and Access Management(IAM)身份(用户或角色)一起使用时,可能会收到此错误。该错误表明 IAM 用户或角色缺乏访问 Kubernetes API 所需的 RBAC 权限。要在 AWS 管理控制台上查看 Kubernetes 资源,您的 AWS IAM 身份必须映射到 Amazon EKS 集群中的 aws-auth ConfigMap。有关详细信息,请参阅 Kubernetes 网站上的使用 RBAC 授权

在创建 Amazon EKS 集群时,您的 IAM 身份将在集群的 RBAC 配置中自动被授予 system:masters 权限。这使您可以通过 Amazon EKS 控制台查看 Kubernetes 资源。它还让您能在 Kubernetes 中编辑 aws-auth ConfigMap,并授予其他 AWS 用户或角色与集群交互的能力。AWS 管理控制台使用 IAM 进行授权,而 EKS 集群使用 Kubernetes RBAC 系统。由于集群的 aws-auth ConfigMap 将 IAM 身份与集群 RBAC 身份相关联,因此 aws-auth ConfigMap 将 IAM 身份与 Kubernetes 身份相关联。

解决方法

先决条件

根据您的情况,收集以下信息。

非管理员用户或角色

如果您不是集群管理员 IAM 用户或角色,并且需要在 Amazon EKS 控制台上查看信息,请完成以下步骤:

  1. 获得 AWS 管理控制台用户的 IAM 身份 ARN。AWS IAM 身份验证器不允许在 ConfigMap 中使用的角色 ARN 中使用路径。如果是 IAM 角色,则使用下列 ARN 格式:
    arn:aws:iam::111122223333:role/example
    **注意:**不要使用以下格式,因为它包含不必要的信息:
    arn:aws:iam::111122223333:role/my-team/developers/example
  2. 向集群管理员提供 ARN,然后请求管理员将您添加到 aws-auth ConfigMap。
    **注意:**有关如何访问 ARN 的步骤,请参阅 Identify the IAM identity ARN of the AWS Management Console user 部分。

集群创建者或者集群管理员用户或角色

如果您是集群创建者或集群管理员,请使用 kubectl 工具或 eksctl 工具来管理 aws-auth ConfigMap。

**注意:**默认情况下,system:masters 组绑定到名为 cluster-adminclusterrole。此 clusterrole 在其 PolicyRule 中使用通配符(“*”)表示资源和谓词。这意味着分配到 system:masters 组的任何用户都可以完全访问集群中的所有 Kubernetes 资源。

有关集群创建者和集群管理员如何确定其管理员状态的步骤,请参阅确定集群创建者部分。

确定 AWS 管理控制台用户的 IAM 身份 ARN

确定用于访问控制台的 IAM 用户或角色。这个 IAM 身份可能不同于您在 AWS 命令行接口(AWS CLI)中使用的身份。确认 IAM 用户或角色有权在 AWS 管理控制台中查看所有集群的节点和工作负载。然后,使用下列选项之一访问 ARN。

**注意:**如果在运行 AWS CLI 命令时收到错误,请参阅 Troubleshoot AWS CLI errors。此外,确保您使用的是最新版本的 AWS CLI

AWS CLI

如果具有 IAM 用户或角色的 AWS CLI 访问权限,则运行下面的命令:

aws sts get-caller-identity --query Arn

CloudShell

如果没有 AWS CLI 访问权限,请从 AWS CloudShell 运行下面的命令:

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 天的历史记录。

将新的 IAM 用户或角色添加到 Kubernetes RBAC

要将新的 IAM 用户或角色添加到 Kubernetes RBAC,请先将 AWS CLI 配置为使用集群创建者 IAM。要验证是否使用 IAM 身份正确配置了 AWS CLI,请运行以下命令:

$ aws sts get-caller-identity

输出会返回 IAM 用户或角色的 ARN。例如:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

然后,使用 kubectl 或 eksctl 修改 aws-auth ConfigMap。

kubectl

  1. 要使用 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 服务器端点。

  2. 要以集群创建者或管理员身份在文本编辑器中编辑 aws-auth ConfigMap,请运行下面的命令:

    $ kubectl edit configmap aws-auth -n kube-system
  3. 添加 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,因为 system:masters 拥有超级用户访问权限,可以在任何资源上执行任何操作。此外,最佳实践是最大限度减少授予的权限。创建一个只能访问特定命名空间的角色。查看所需的权限查看特定命名空间中的 Kubernetes 资源部分。

eksctl

要使用 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. 在导航窗格上,选择集群
  3. 选择您的集群。
  4. 查看概述工作负载选项卡中是否存在错误。

如果针对特定命名空间进行了配置,则会在 Amazon EKS 控制台中看到下面的错误消息:

"Error loading Deploymentsdeployments.apps is forbidden: User "xxxxxx" cannot list resource "deployments" in API group "apps" at the cluster scope or in the namespace "xxxxxxx"

特定命名空间不会出现该错误。要对错误消息进行故障排除,请参阅 Can't see Nodes on the Compute tab or anything on the Resources tab and you receive an error in the AWS Management Console

AWS 官方
AWS 官方已更新 10 个月前
2评论

添加文章中需要补充的部分

AWS IAM Authenticator does not permit a path in the role ARN used in the ConfigMap. Therefore, before you specify rolearn, remove the path. For example, change arn:aws:iam::111122223333:role/team/developers/eks-admin to arn:aws:iam::111122223333:role/eks-admin.

iam 中看到的ARN需要移除前面的路径才可以生效

已回复 1 年前

感谢您的评论。我们将会根据需要审核和更新知识中心文章。

profile pictureAWS
专家
已回复 1 年前