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

上次更新时间:2020 年 9 月 28 日

当我尝试通过 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 集群。

注意: 如果您使用 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_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 正在运行。


这篇文章对您有帮助吗?


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