我尝试访问我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群。但是,我收到了"Your current user or role does not have access to Kubernetes objects on this EKS cluster"错误消息。
简短描述
当 AWS Identity and Access Management (IAM) 身份没有 Kubernetes 的基于角色的访问控制 (RBAC) 权限时,您会收到访问错误。要访问 Kubernetes API,您必须拥有 RBAC 权限。有关 RBAC 的详细信息,请参阅 Kubernetes 网站上的使用 RBAC 授权。要在 AWS 管理控制台上查看 Kubernetes 资源,您的 IAM 身份必须映射到 Amazon EKS 集群中的 aws-auth ConfigMap。
**重要事项:**以下解决方法使用 aws-auth ConfigMap,以与访问 RBAC 权限的 Kubernetes 方法保持一致。最佳做法是将现有的 aws-auth ConfigMap 条目迁移到访问条目。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
如果您是集群的创建者或管理员用户,则可以使用 kubectl 或 eksctl 来更新 aws-auth ConfigMap。继续执行将 IAM 用户或角色添加到 RBAC 配置中操作。否则,您必须获取需要访问集群的 IAM 身份的 Amazon 资源名称 (ARN)。
获取需要访问集群的 IAM 身份的 ARN
确定需要访问集群的 IAM 用户或角色。
**注意:**该 IAM 身份可能不同于您在运行 AWS CLI 时使用的 IAM 身份。Kubernetes 的 AWS IAM Authenticator 不允许在 aws-auth ConfigMap 中使用的角色 ARN 中包含路径。有关详细信息,请参阅 GitHub 网站上的 aws-iam-authenticator。
如果您拥有 IAM 用户或角色的 AWS CLI 访问权限,请运行以下 get-caller-identity AWS CLI 命令:
aws sts get-caller-identity --query "Arn"
**注意:**如果您没有 AWS CLI 访问权限,请删除 Arn 中的引号,然后在 AWS CloudShell 中运行上述命令。
输出示例:
"arn:aws:iam::111122223333:role/testrole"
如果命令输出中显示 IAM 角色的 ARN,请确认其采用正确的 ARN 格式:arn:aws:iam::111122223333:role/example。
如果 ARN 中包含代入的角色,则您必须获取您要授予 RBAC 权限的 IAM 角色的 ARN。例如,代入角色 ARN arn:aws:sts::123456:assumed-role/MyRole/your_username 对应的角色 ARN 为 arn:aws:sts::123456:role/MyRole。
向集群管理员提供该 ARN,然后请求管理员将该角色的 ARN 添加到 aws-auth ConfigMap 中。有关将 ARN 添加到 aws-auth ConfigMap 的步骤,请继续查看“将 IAM 用户或角色添加到 RBAC 配置中”。
确认 IAM 用户或角色有权在 AWS 管理控制台中查看所有集群的节点和工作负载。
确定集群创建者
**重要事项:**只有与集群创建相关联的 IAM 实体才能访问集群资源。只有集群创建者才能编辑 aws-auth ConfigMap 并向其他 IAM 实体提供访问权限。
确定拥有配置集群主要权限的集群创建者或管理员角色。首先,查看 AWS CloudTrail 事件历史记录中的 CreateCluster 调用。然后,检查 userIdentity 字段。
如果集群创建者的名称在 CloudTrail 中显示为 Deleted(已删除),请使用相同的名称创建新的 IAM 用户或角色。新的 IAM 身份具有与原始集群创建者相同的 ARN,因此该新身份会继承对集群的相同管理员访问权限。
**注意:**对于超过 90 天的集群,CloudTrail 不会提供集群创建者的名称。
要使用 AWS CLI 获取集群创建者的 IAM 身份,请运行以下 get-caller-identity 命令:
aws sts get-caller-identity
输出示例:
{
"UserId": "AIDACKCEVSQ6C2EXAMPLE",
"Account": "111122223333",
"Arn": "arn:aws:iam:: 111122223333:user/testuser"
}
将 IAM 用户或角色添加到 RBAC 配置中
如果您安装了 eksctl,请运行以下 eksctl create iamidentitymapping 命令以更新 aws-auth ConfigMap:
eksctl create iamidentitymapping --cluster your_cluster_name --region=your_region --arn your_IAM_ARN --group system:masters --username admin
**注意:**请将 your_cluster_name 替换为您的集群名称,将 your_region 替换为您的 AWS 区域,将 your_IAM_ARN 替换为您的 IAM 角色或用户 ARN。
要使用 kubectl 更新 aws-auth ConfigMap,请完成以下步骤:
-
运行以下命令,在默认文本编辑器中打开 aws-auth ConfigMap:
kubectl edit configmap aws-auth -n kube-system
**注意:**控制台将显示当前的 ConfigMap。如果您无法连接到集群,请更新您的 kubeconfig 文件。创建集群的 IAM 身份始终可以访问集群。
-
运行以下 update-kubeconfig 命令配置 kubectl,以便您可以连接到集群:
aws eks update-kubeconfig --region region_code --name your_cluster_name
**注意:**请将 region_code 替换为您的区域,将 your_cluster_name 替换为您的集群名称。kubectl 命令必须连接至 Amazon EKS 服务器端点。如果 API 服务器端点是公共的,则您必须具有互联网访问权限才能连接到该端点。如果该端点是私有的,请从运行集群的虚拟私有云 (VPC) 连接到该服务器端点。
-
在打开的文本编辑器中,输入以下代码以添加 IAM 用户:
mapUsers: |
- userarn: arn:aws:iam::111122223333:user/testuser
username: testuser
groups:
- system:bootstrappers
- system:nodes
**注意:**请将 111122223333 替换为您的 AWS 账户 ID,将 testuser 替换为您的 IAM 用户。
或者,输入以下代码以添加 IAM 角色:
mapRoles: |
- rolearn: arn:aws:iam::111122223333:role/testrole
username: testrole
groups:
- system:bootstrappers
- system:nodes
**注意:**请将 111122223333 替换为您的账户 ID,将 testrole 替换为您的 IAM 角色。
如果您创建集群,则您的 IAM 身份会在集群的 RBAC 配置中自动获得 system:masters 权限。默认情况下,system:masters 组绑定到 cluster-admin 集群角色。
最好不要在生产环境中使用 system:masters 权限。system:masters 权限会向用户提供对集群中所有 Kubernetes 资源的完全访问权限。相反,最佳做法是创建一个只能访问特定命名空间,且仅拥有所需权限的角色。
验证对集群的访问权限
完成以下步骤:
- 打开 Amazon EKS 控制台。
- 在导航窗格中,选择 Clusters(集群)。
- 选择您的集群。
- 查看 Overview(概述)和 Workloads(工作负载)选项卡中是否存在错误。
如果您看到错误,请参阅 IAM 故障排除。例如,如果您为特定命名空间配置了 RBAC 访问权限,则可能会收到以下错误消息:
"Error loading Deployments : deployments.apps is forbidden: User "AIDACKCEVSQ6C2EXAMPLE" cannot list resource "deployments" in API group "apps" at the cluster scope or in the namespace "EXAMPLENAMESPACE"
要解决命名空间错误,您必须创建或更新 RBAC 角色或集群角色,并为其配置相应的角色或集群角色绑定。有关详细信息,请参阅 Kubernetes 网站上的 RoleBinding 和 ClusterRoleBinding。