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

上次更新时间:2019 年 12 月 9 日

当我尝试通过 kubectl 命令访问 Amazon Elastic Kubernetes Service (Amazon EKS) 集群时,收到以下授权错误:“错误:您必须登录服务器(未授权)。” 如何解决此错误?

简短描述

当 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 集群。

解决方法

完成以下步骤之前,请首先确定具有配置 Amazon EKS 集群的主访问权限的 IAM 用户或 IAM 角色(集群创建者)。此外还需确定集群创建者在集群创建后将予以授权的 IAM 用户。如需确定集群的创建者,请在 AWS CloudTrail 中搜索 CreateCluster API 调用,然后检查 API 调用的 userIdentity 部分。

注意:在以下步骤中,集群的创建者为 cluster_creator,并且当前无权访问但需要访问该集群的用户为 designated_user

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

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_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 文件:

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 正在运行。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?