在 Amazon EKS 中创建集群后,我如何向其他用户和角色提供访问权限?
上次更新时间:2020 年 9 月 28 日
简短描述
当 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 集群。
注意: 如果您使用 eksctl,请考虑使用 Weaveworks 网站上管理 IAM 用户和角色中的解决方法。
解决方法
完成以下步骤之前,请首先确定具有配置 Amazon EKS 集群的主访问权限的 IAM 用户或 IAM 角色(集群创建者)。此外还需确定集群创建者在集群创建后将予以授权的 IAM 用户。如需确定集群创建者,在 AWS CloudTrail 中搜索 CreateCluster API 调用,然后检查 API 调用的 userIdentity 部分 。
注意:在以下步骤中,集群的创建者为 cluster_creator,并且当前无权访问但需要访问该集群的用户为 designated_user。
如果 cluster_creator 是 IAM 用户,则将 designated_user 添加到 ConfigMap
注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
1. 使用 SSH 连接到 kubectl 实例。
2. 在 AWS CLI 中,运行以下命令:
aws sts get-caller-identity
此输出显示 designated_user 的 IAM 用户详细信息。
3. 如需列出默认命名空间的集群中运行的 Pod,请运行以下 kubectl 命令:
kubectl get pods
输出会显示以下内容:“错误:您必须登录服务器(未授权)。” 此错误表示 designated_user 未获得访问 Amazon EKS 集群的授权。
4. 如需配置 cluster_creator 的 AWS 访问密钥 ID 和 AWS 秘密访问密钥,请运行以下命令:
aws configure
5. 如需验证 cluster_creator 是否有集群的访问权限,请运行以下命令:
kubectl get pods
您不应收到未经授权的错误消息。输出应列出在默认命名空间中运行的所有 Pod。如果输出显示未找到资源,则无 Pod 正在运行。
6. 要向 designated_user 授予对集群的访问权限,请将 mapUsers 部分添加到您的 aws-auth.yaml 文件。请参阅以下来自 管理集群的用户或 IAM 角色的示例 aws-auth.yaml 文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
7. 将 文件 designated_user 添加到第 6 步中 aws-auth.yaml 文件的 mapUsers 部分,然后保存该文件。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
mapUsers: |
- userarn: arn:aws:iam::11122223333:user/designated_user
username: designated_user
groups:
- system:masters
注意:上例中的用户名是 Kubernetes 用于映射到 userarn 中传递的 IAM 实体的名称。
8. 如需将新的 ConfigMap 应用到集群的 RBAC 配置,请运行以下命令:
kubectl apply -f aws-auth.yaml
9. 如需再次更改 AWS CLI 配置以使用 designated_user的凭证,请运行以下命令:
aws configure
10. 如需验证 designated_user 是否有集群的访问权限,请运行以下命令:
kubectl get pods
您不应收到未经授权的错误消息。输出应列出在默认命名空间中运行的所有 Pod。如果输出显示未找到资源,则无 Pod 正在运行。
如果 cluster_creator 是一个 IAM 角色,则将 designated_user 添加到 ConfigMap
在前面的步骤中,您使用了 cluster_creator 的凭证向 designated_user 提供访问权限。但是,如果集群是由某个 IAM 角色而不是 IAM 用户创建的,则将不会有您可以使用的凭证。在这种情况下,您必须代入创建该集群的 IAM 角色,从而向 designated_user 提供访问权限。如果集群创建者不是 IAM 角色,则您不需要完成以下步骤。
要在集群上代入 IAM 角色并编辑 aws-auth ConfigMap,从而为 designated_user 提供访问权限,请完成以下步骤:
1. 如需显示 designated_user 的 IAM 用户的详细信息,请运行以下命令:
aws sts get-caller-identity
2. 如需确认 designated_user 是否有集群的访问权限,请运行以下命令:
kubectl get pods
输出会显示以下错误:“错误:您必须登录服务器(未授权)。” 此错误表示指定用户未获得访问 Amazon EKS 集群的授权。
3. 如需允许 designated_user 承担 cluster_creator 的角色,请运行以下命令:
aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test
该输出显示 designated_user 的临时 IAM 凭证,该用户正在使用 cluster_creator 的担任角色 。
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 文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
7. 在您的 aws-auth.yaml 文件中,添加 mapUsers。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
mapUsers: |
- userarn: arn:aws:iam::11122223333:user/designated_user
username: designated_user
groups:
- system:masters
注意:上例中的用户名是 Kubernetes 用于映射到 userarn 中传递的 IAM 实体的名称。
8. 将 designated_user 添加到 aws-auth.yaml 文件,然后保存您的更改。
9. 如需将新配置应用到 Amazon EKS 集群的 RBAC 配置,请运行以下命令:
kubectl apply -f aws-auth-cm.yml
10. 如需取消设置以下环境变量,请运行以下命令:
unset AWS_ACCESS_KEY_ID
unset AWS_SESSION_TOKEN
unset AWS_SECRET_ACCESS_KEY
11. 如需显示 designated_user 的 IAM 用户的详细信息,请运行以下命令:
aws sts get-caller-identity
12. 如需确认 designated_user 是否有集群的访问权限,请运行以下命令:
kubectl get pods
您不应收到未经授权的错误消息。输出应列出在默认命名空间中运行的所有 Pod。如果输出显示未找到资源,则无 Pod 正在运行。