如何在 Amazon EKS 中创建集群之后向其他 IAM 用户和角色提供访问权限?
当我尝试通过 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 ConfigMap 的 mapRoles 部分添加该 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_ID、AWS_SESSION_TOKEN 和 AWS_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 用户和角色中的解决方法。
相关信息
相关内容
- 已提问 24 天前lg...
- 已提问 2 个月前lg...
- 已提问 3 天前lg...
- 已提问 2 个月前lg...
- 已提问 3 个月前lg...
- AWS 官方已更新 3 个月前
- AWS 官方已更新 4 个月前
- AWS 官方已更新 2 年前