上次更新日期:2021 年 4 月 6 日
我在 Amazon Elastic Kubernetes Service (Amazon EKS) 中收到以下错误:“您的当前用户或角色无权访问此 EKS 集群上的 Kubernetes 对象。”
简短描述当您将 AWS 管理控制台 与 AWS Identity and Access Management (IAM) 角色或用户配合使用,并且此角色或用户不在 Amazon EKS 集群的 aws-auth ConfigMap 中时,就会收到此错误。
创建 Amazon EKS 集群时,IAM 用户或角色(例如创建该集群的联合身份用户)会自动在集群的 RBAC 配置中被授予 system:masters 权限。如果您访问 Amazon EKS 控制台,但 IAM 用户或角色不属于 aws-auth ConfigMap,则无法看到 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 角色,请完成以下步骤之一。
添加 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:bootstrappers 和 system: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.(可选)在将组应用到集群之前,先更改组的名称,然后在 ConfigMap 中将您的 IAM 用户或角色映射到该组。例如:
---
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.验证 clusterrole 和 clusterrolebinding 对象的创建:
$ 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.(可选)在将组应用到集群之前,先更改组的名称,然后在 ConfigMap 中将您的 IAM 用户或角色映射到该组。例如:
---
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.验证 clusterrole 和 clusterrolebinding 对象的创建:
$ 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"
特定命名空间不会出现此错误。