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

4 分钟阅读
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(来自 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 的步骤,请参阅 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 资源。

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

确定 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 将新的 IAM 用户或角色添加到 Kubernetes RBAC

在选择使用 kubectl 或 eksctl 工具来编辑 aws-auth ConfigMap 之前,请确保完成步骤 1。然后,遵循步骤 2-4 使用 kubectl 进行编辑。如需使用 eksctl 进行编辑,请继续执行步骤 5。

1.    在确定集群创建者或管理员后,将 AWS CLI 配置为使用集群创建者 IAM。有关更多信息,请参阅 Configuration basics

要验证是否使用 IAM 实体正确配置了 AWS CLI,请运行以下命令:

$ aws sts get-caller-identity

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

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

**注意:**如果在运行 CLI 命令时收到错误,确保使用的是最新版本的 Amazon 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。此外,请参阅所需的权限,并查看 View Kubernetes resources in a specific namespace 部分,以查看 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"

特定命名空间不会出现该错误。

要对错误消息进行故障排除,请参阅 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 官方已更新 1 年前
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需要移除前面的路径才可以生效

Linhai
已回复 10 个月前

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

profile pictureAWS
审核人员
已回复 10 个月前