如何在 Amazon EKS 中创建集群之后向其他 IAM 用户和角色提供访问权限?

上次更新时间:2022 年 3 月 4 日

当我尝试通过 kubectl 命令访问 Amazon Elastic Kubernetes Service(Amazon EKS)集群时,收到以下授权错误:“error: You must be logged in to the server (Unauthorized)” [错误:您必须登录服务器(未授权)]。

简短描述

当 Amazon EKS 集群的基于角色的访问控制(RBAC)配置未授权您的 AWS Identity and Access Management(IAM)实体时,则会出现授权错误。当创建 Amazon EKS 集群的 IAM 用户或角色与 aws-iam-authenticator 使用的用户或角色不同时,也会发生此错误。

最初,只有 Amazon EKS 集群的创建者拥有配置该集群的 system:masters 权限。如需将 system:masters 权限扩展到其他用户和角色,您必须将 aws-auth ConfigMap 添加到 Amazon EKS 集群的配置中。ConfigMap 允许其他 IAM 实体(例如用户和角色)访问 Amazon EKS 集群。

向 IAM 角色授予访问权限,您必须代入集群创建者的凭证。然后在 aws-auth ConfigMapmapRoles 部分添加该 IAM 角色。

重要提示:

  • 更新 aws-auth ConfigMap 时应注意避免语法错误(例如拼写错误)。这些错误可能会影响在 Amazon EKS 集群的 ConfigMap 中更新的所有 IAM 用户和角色的权限。
  • 最佳实践是避免将 cluster_creator 添加到 ConfigMap 中。不恰当地修改 ConfigMap 会导致所有 IAM 用户和角色(包括 cluster_creator)永久失去 Amazon EKS 集群的访问权限。
  • 您无需向 aws-auth ConfigMap 添加 cluster_creator 即可获得 Amazon EKS 集群的管理员访问权限。默认情况下,cluster_creator 对其创建的 Amazon EKS 集群具有管理员访问权限。

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

解决方法

注意:在以下步骤中,集群创建者是 cluster_creator。当前没有集群访问权限但需要此权限的用户是 signated_user

确定集群创建者的 IAM 用户或角色

1.    确定拥有配置 Amazon EKS 集群的主访问权限的集群创建者的 IAM 用户或角色。

2.    确定集群创建者在集群创建后将给予授权的 IAM 用户。如需确定集群的创建者,请在 AWS CloudTrail 中搜索 CreateCluster API 调用,然后检查 API 调用的 userIdentity 部分。

如果 cluster_creator 是 IAM 用户,则将 designated_user 添加到 ConfigMap

1.    在本地主机上安装 kubectl。如果您拥有已经安装了 kubectl 软件包的专用 Amazon Elastic Compute Cloud(Amazon EC2)实例,则还可使用 SSH 连接到该实例。

2.    在安装了 kubectl 的同一台主机上,使用 designated_user 凭证配置 AWS CLI:

aws configure

3.    在 AWS CLI 中,运行以下命令:

aws sts get-caller-identity

输出应会返回 designated_user 的 IAM 用户详细信息。

例如:

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

4.    列出在默认命名空间集群中运行的一组容器(Pod):

kubectl get pods --namespace default

输出会显示以下内容:“error: You must be logged in to the server (Unauthorized)” [错误:您必须登录服务器(未授权)]。 此错误表示 designated_user 未获得访问 Amazon EKS 集群的授权。

5.    配置 cluster_creator 的 AWS 访问密钥 ID 和 AWS 秘密访问密钥。

如果集群是使用 AWS 管理控制台创建的,则识别出创建集群的 IAM 角色或用户。在安装了 kubectl 的主机中,在 AWS CLI 中配置 cluster_creator IAM 用户或角色:

aws configure

如果集群是使用 eksctl 创建的,则使用原定设置或指定的 AWS CLI 配置文件凭证配置 AWS CLI,以运行 kubectl 命令。

6.    验证 cluster_creator 是否有集群的访问权限:

kubectl get pods

如果所有设置都正确,则不会收到未授权错误消息。输出应会列出在默认命名空间中运行的所有 Pod。如果输出显示未找到资源,则默认命名空间中并无 Pod 正在运行。

7.    要向 designated_user 授予对集群的访问权限,请将 mapUsers 部分添加到您的 aws-auth.yaml 文件。请参阅让 IAM 用户和角色有权访问您的集群中的示例 aws-auth.yaml 文件。

8.    将 designated_user 添加到第 7 步中 aws-auth.yaml 文件的 mapUsers 部分,然后保存该文件。

9.    将新的 ConfigMap 应用到集群的 RBAC 配置:

kubectl apply -f aws-auth.yaml

10.    再次更改 AWS CLI 配置以使用 designated_user 的凭证:

aws configure

11.    验证 designated_user 是否有集群的访问权限:

kubectl get pods

如果所有设置都正确,您将不会收到未授权错误消息。输出会列出在默认命名空间中运行的所有 Pod。如果输出显示未找到资源,则默认命名空间中并无 Pod 正在运行。

如果 cluster_creator 是一个 IAM 角色,则将 designated_user 添加到 ConfigMap

在前面的步骤中,您使用了 cluster_creator 凭证向 designated_user 提供访问权限。但如果集群是由某个 IAM 角色而不是 IAM 用户创建的,则没有您可以使用的凭证。在这种情况下,您必须代入创建该集群的 IAM 角色,从而向 designated_user 提供访问权限。如果集群创建者不是 IAM 角色,则您不需要完成以下步骤。

注意:在以下步骤中,assume_role_user 是代入 cluster_creator 角色的用户。当前没有集群访问权限但需要此权限的用户是 signated_user

要在集群上代入 IAM 角色并编辑 aws-auth ConfigMap,从而为 designated_user 提供访问权限,请完成以下步骤:

1.    显示 assume_role_user 的 IAM 用户详细信息:

aws sts get-caller-identity

2.    确认 assume_role_user 有权访问集群:

kubectl get pods

输出会显示以下错误:“error: You must be logged in to the server (Unauthorized)” [错误:您必须登录服务器(未授权)]。 此错误表示 assume_role_user 未获得访问 Amazon EKS 集群的授权。

3.    允许 assume_role_user 代入 cluster_creator 的角色:

aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test

输出会显示了 assume_role_user 的临时 IAM 凭证。

4.    使用临时 IAM 凭证设置 AWS_ACCESS_KEY_IDAWS_SESSION_TOKENAWS_SECRET_ACCESS_KEY 环境变量。

例如:

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SESSION_TOKEN=EXAMPLETOKEN
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

AWS CLI 现在会排列环境变量中设定的凭证,并使用这些凭证来调用 AWS 服务。

5.    验证 AWS CLI 是否正在使用 cluster_creator 代入的角色:

aws sts get-caller-identity

6.    要向 designated_user 授予对集群的访问权限,请将 mapUsers 部分添加到您的 aws-auth.yaml 文件。请参阅让 IAM 用户和角色有权访问您的集群中的示例 aws-auth.yaml 文件。

7.    将 文件 designated_user 添加到第 6 步中 aws-auth.yaml 文件的 mapUsers 部分,然后保存该文件。

8.    将新配置应用到 Amazon EKS 集群的 RBAC 配置:

kubectl apply -f aws-auth.yaml

9.    添加以下环境变量。

unset AWS_ACCESS_KEY_ID
unset AWS_SESSION_TOKEN
unset AWS_SECRET_ACCESS_KEY

10.    显示 designated_user 的 IAM 用户详细信息:

aws sts get-caller-identity

11.    确认 designated_user 是否有集群的访问权限:

kubectl get pods

如果所有设置都正确,则不会收到未授权错误消息。输出会列出在默认命名空间中运行的所有 Pod。如果输出显示未找到资源,则默认命名空间中并无 Pod 正在运行。

注意:如果您使用 eksctl,则考虑使用 Weaveworks 网站上管理 IAM 用户和角色中的解决方法。


这篇文章对您有帮助吗?


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