如何解决 Amazon EKS 中的“您的当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象”错误?

上次更新日期:2021 年 7 月 28 日

我在 Amazon Elastic Kubernetes Service (Amazon EKS) 中收到以下错误:“您的当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象。”

简短描述

当您将 AWS 管理控制台与 AWS Identity and Access Management (IAM) 用户或角色配合使用时,就会收到此错误。使用不属于 Amazon EKS 集群的aws-auth ConfigMap 的 IAM 用户或角色时,特别会发生该错误。

创建 Amazon EKS 集群时,IAM 用户或角色会自动在集群的 RBAC 配置中被授予 system:masters 权限。例如,IAM 用户或角色可以是创建集群的联合身份用户。如果您使用不属于 aws-auth ConfigMap 的 IAM 用户或角色访问 Amazon EKS 控制台,则无法看到 Kubernetes 工作负载。您也不会看到集群的概览详细信息。

要向其他 AWS 用户或角色授予与集群交互的能力,您必须在 Kubernetes 中编辑 aws-auth ConfigMap。

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版的 AWS CLI

为 IAM 用户或角色配置权限

1.    要查找具有主要集群配置权限的集群创建者或管理员角色,请在 AWS CloudTrail 中搜索 CreateCluster API 调用。然后,检查此 API 调用的 UserIdentity 部分。

注意:CloudTrail 仅提供 90 天的历史记录。

2.    识别需要权限的 IAM 用户或角色。

3.    确认已识别的 IAM 用户或角色有在 AWS 管理控制台中查看所有集群的节点和工作负载。

使用 aws-auth ConfigMap 将 IAM 用户或角色映射到 RBAC 角色和组

重要提示:在您连接 Amazon EKS API 服务器之前,安装配置最新版本的 AWS CLI。

1.    获取 AWS CLI 用户或角色的配置:

$ aws sts get-caller-identity

输出将返回 IAM 用户或角色的 Amazon 资源名称 (ARN)。例如:

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

2.    确认 ARN 与具有主要集群配置访问权限的集群创建者或管理员相匹配。如果 ARN 与集群创建者或管理员不匹配,请联系集群创建者或管理员以更新 aws-auth ConfigMap。

3.    要在文本编辑器中编辑 aws-auth ConfigMap,集群创建者或管理员必须允许以下命令:

$ kubectl edit configmap aws-auth -n kube-system

4.    要添加 IAM 用户或角色,请完成以下步骤之一。

添加 IAM 用户到 mapUsers。例如:

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:bootstrapperssystem:nodes。有关更多信息,请参阅 Kubernetes 网站上的默认角色和角色绑定

5.    在 Amazon EKS 控制台中检查错误。例如:

Error loading Namespaces
namespaces is forbidden: User "testuser" cannot list resource "namespaces" in API group "" at the cluster scope

如果看到上述错误,请跳至创建集群角色和集群角色绑定,或者创建角色和角色绑定部分。

创建集群角色和集群角色绑定,或者创建角色和角色绑定

在 ConfigMap 中,IAM 账户或角色所映射的 Kubernetes 用户或组必须是角色绑定中的主体。此用户或组也可以是集群角色绑定中的主体。也就是说,是绑定到有权查看 Kubernetes 资源的 Kubernetes 角色或集群角色的角色绑定或集群角色绑定。如果用户或组没有必要的权限,您可能会收到“未授权:验证您有权访问 Kubernetes 集群”错误。要创建角色和绑定,请参阅 Kubernetes 网站上的使用 RBAC 授权

请记住以下内容:要查看所有命名空间中的 Kubernetes 资源,必须创建集群角色和集群角色绑定。要查看特定命名空间中的 Kubernetes 资源,必须为该命名空间创建角色和角色绑定。

要创建集群角色和集群角色绑定:

1.    下载清单文件:

https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml

注意:已下载文件中的组名称是 eks-console-dashboard-full-access-group。您的 IAM 用户或角色必须在 aws-auth ConfigMap 中映射到该组。有关更多信息,请参阅管理集群的用户或 IAM 角色的“查看所有命名空间中的 Kubernetes 资源”部分。

2.    (可选) 在将从步骤 1 下载的清单文件应用到集群之前,请更改组的名称。然后,将您的 IAM 用户或角色映射到 ConfigMap 中的该组。例如:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks-console-dashboard-full-access-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - namespaces
  - pods
  verbs:
  - get
  - list
- apiGroups:
  - apps
  resources:
  - deployments
  - daemonsets
  - statefulsets
  - replicasets
  verbs:
  - get
  - list
- apiGroups:
  - batch
  resources:
  - jobs
  verbs:
  - get
  - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks-console-dashboard-full-access-binding
subjects:
- kind: Group
  name: eks-console-dashboard-full-access-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: eks-console-dashboard-full-access-clusterrole
  apiGroup: rbac.authorization.k8s.io

3.    部署清单文件:

$ kubectl apply -f eks-console-full-access.yaml

4.    验证 clusterroleclusterrolebinding 对象的创建:

$ kubectl describe clusterrole.rbac.authorization.k8s.io/eks-console-dashboard-full-access-clusterrole
$ kubectl describe clusterrolebinding.rbac.authorization.k8s.io/eks-console-dashboard-full-access-binding

5.    使用面向您的 IAM 实体的新组 eks-console-dashboard-full-access-group 更新您的 aws-auth ConfigMap:

$ kubectl edit configmap aws-auth -n kube-system

6.    添加 IAM 用户到 mapUsers。例如:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
    - system:bootstrappers
    - system:nodes
    - eks-console-dashboard-full-access-group

7.    添加 IAM 角色到 mapRoles。例如:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole    
    groups:
    - system:bootstrappers
    - system:nodes
    - eks-console-dashboard-full-access-group

在特定命名空间中查看 Kubernetes 资源

1.    下载清单文件:

https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-restricted-access.yaml

注意:文件中的组名称是 eks-console-dashboard-restricted-access-group。您的 IAM 用户或角色必须在 aws-auth ConfigMap 中映射到该组。有关更多信息,请参阅管理集群的用户或 IAM 角色的“查看特定命名空间中的 Kubernetes 资源”部分。

2.    (可选) 在将组应用于集群之前请更改组的名称。然后,将您的 IAM 用户或角色映射到 ConfigMap 中的该组。例如:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks-console-dashboard-restricted-access-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - namespaces
  verbs:
  - get
  - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks-console-dashboard-restricted-access-clusterrole-binding
subjects:
- kind: Group
  name: eks-console-dashboard-restricted-access-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: eks-console-dashboard-restricted-access-clusterrole
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: eks-console-dashboard-restricted-access-role
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
- apiGroups:
  - apps
  resources:
  - deployments
  - daemonsets
  - statefulsets
  - replicasets
  verbs:
  - get
  - list
- apiGroups:
  - batch
  resources:
  - jobs
  verbs:
  - get
  - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: eks-console-dashboard-restricted-access-role-binding
  namespace: default
subjects:
- kind: Group
  name: eks-console-dashboard-restricted-access-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: eks-console-dashboard-restricted-access-role
  apiGroup: rbac.authorization.k8s.io

注意:上述文件中的命名空间为 default。要指定其他命名空间,请在将文件应用到集群之前对其进行编辑。

3.    部署清单:

$ kubectl apply -f eks-console-restricted-access.yaml

4.    验证 clusterroleclusterrolebinding 对象的创建:

$ kubectl describe clusterrole.rbac.authorization.k8s.io/eks-console-dashboard-restricted-access-clusterrole
$ kubectl describe clusterrolebinding.rbac.authorization.k8s.io/eks-console-dashboard-full-access-binding
$ kubectl describe role.rbac.authorization.k8s.io/eks-console-dashboard-restricted-access-role
$ kubectl describe rolebinding.rbac.authorization.k8s.io/eks-console-dashboard-restricted-access-role-binding

5.    使用面向您的 IAM 实体的新组 eks-console-dashboard-restricted-access-group 更新您的 aws-auth ConfigMap:

$ kubectl edit configmap aws-auth -n kube-system

6.    添加 IAM 用户到 mapUsers。例如:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
    - system:bootstrappers
    - system:nodes
    - eks-console-dashboard-restricted-access-group

7.    添加 IAM 角色到 mapRoles。例如:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole    
    groups:
    - system:bootstrappers
    - system:nodes
    - eks-console-dashboard-restricted-access-group

验证对 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 管理控制台中看不到工作负载或节点并收到错误


这篇文章对您有帮助吗?


您是否需要账单或技术支持?