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

4 分钟阅读
0

当我使用 kubectl 命令访问 Amazon Elastic Kubernetes Service (Amazon EKS) 集群时,收到错误消息“error: You must be logged in to the server (Unauthorized)”(错误:您必须登录到服务器(未授权))。

简短描述

如果 AWS Identity and Access Management (IAM) 用户或角色创建的 Amazon EKS 集群与 aws-iam-authenticator 使用的集群不同,则您会收到 Unauthorized(未授权)错误消息。要解决此问题,请配置您的 Amazon EKS 集群的基于角色的访问控制 (RBAC) 以授权 IAM 实体。有关 RBAC 的详细信息,请参阅 Kubernetes 网站上的使用 RBAC 授权

只有 Amazon EKS 集群的创建者拥有配置集群的 system:masters permissions(system:masters 权限)。有两种方法可以将 system:masters 权限扩展到其他 IAM 用户和角色:

  • 代入集群创建者凭证。然后,在 aws-auth ConfigMapmapRoles 部分中添加 IAM 角色。
  • 使用 EKS 访问条目。

**重要事项:**最佳做法是不要将 cluster_creator 添加到 ConfigMap 中。如果您错误地配置了 ConfigMap,则所有 IAM 用户和角色(包括 cluster_creator)都可能会永久失去对 Amazon EKS 集群的访问权限。默认情况下,cluster_creator 拥有对其创建的集群的管理员访问权限,因此您无需将 cluster_creater 添加到 aws-auth ConfigMap 中。

**注意:**在以下解决方法中,cluster_creator 是在 Amazon EKS 中创建集群的 IAM 实体。您授予访问权限的用户为 designated_user

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

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

为拥有配置 Amazon EKS 集群的主要访问权限的集群创建者确定 IAM 实体。要确定集群创建者,请在 AWS CloudTrail 中搜索 CreateCluster API 调用,然后查看 API 调用的 userIdentity 部分。

然后,确定您在创建集群后向其授予授权的 IAM 实体。

当 cluster_creator 为 IAM 用户时,使用 aws-auth ConfigMap 授予集群访问权限

完成以下步骤:

  1. 在本地主机上安装 kubectl。或者,如果您有安装 kubectl 软件包的专用 Amazon Elastic Compute Cloud (Amazon EC2) 实例,请使用 SSH 连接到该实例

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

    aws configure
  3. 运行 get-caller-identity AWS CLI 命令:

    aws sts get-caller-identity

    输出返回 designated_user 的 IAM 用户详细信息:

    {  
        "UserId": "#####################",  
        "Account": "############",  
        "Arn": "arn:aws:iam::############:user/designated_user"  
    }
  4. 列出在默认命名空间的集群中运行的容器组:

    kubectl get pods --namespace default

    输出显示 Unauthorized(未授权)错误消息,因为 designated_user 无权访问 Amazon EKS 集群。

  5. 配置 cluster_creator 的 AWS 访问密钥 ID 和 AWS 秘密访问密钥。
    如果您已使用 Amazon EKS 控制台创建集群,则在本地主机上,在 AWS CLI 中配置 cluster_creator IAM 用户或角色:

    aws configure

    如果您已使用 eksctl 创建集群,请使用指定的 AWS CLI 配置文件凭证配置 AWS CLI 以运行 kubectl 命令。

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

    kubectl get pods

    您不会收到 Unauthorized(未授权)错误消息,并且输出列出了在默认命名空间中运行的所有容器组。如果输出不显示任何资源,则没有容器组在默认命名空间中运行。

  7. 要授予 designated_user 访问集群的权限,请将 mapUsers 部分添加到您的 aws-auth.yaml 文件中。有关详细信息,请参阅向您的 Amazon EKS 集群添加 IAM 原则

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

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

    kubectl apply -f aws-auth.yaml
  10. 再次更改 AWS CLI 配置以使用 designated_user 的凭证:

aws configure
  1. 验证 designated_user 是否有权访问集群:
kubectl get pods

您不会收到 Unauthorized(未授权)错误消息,并且输出列出了在默认命名空间中运行的所有容器组。如果输出不显示任何资源,则没有容器组在默认命名空间中运行。

当 cluster_creator 为 IAM 角色时,使用 aws-auth ConfigMap 授予集群访问权限

如果 IAM 角色而不是 IAM 用户创建了集群,则您无法使用凭证。相反,您必须代入创建集群的 IAM 角色才能为 designated_user 提供访问权限。

完成以下步骤:

  1. 运行 get-caller-identity AWS CLI 命令以获取 assume_role_user 的 IAM 用户详细信息:

    aws sts get-caller-identity
  2. 确认 assume_role_user 有权访问集群:

    kubectl get pods

    输出显示 Unauthorized(未授权)错误消息,因为 designated_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 文件中。

  7. designated_user 添加到 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. 运行 get-caller-identity AWS CLI 命令以获取 designated_user 的 IAM 用户详细信息:

aws sts get-caller-identity
  1. 确认 designated_user 有权访问集群:
kubectl get pods

您不会收到 Unauthorized(未授权)错误消息,并且输出列出了在默认命名空间中运行的所有容器组。如果输出不显示任何资源,则没有容器组在默认命名空间中运行。

**注意:**如果您使用 eksctl,请参阅在 eksctl 网站上的管理 IAM 用户和角色以了解详细信息。

使用 EKS 访问条目向 IAM 用户和角色授予集群访问权限

Amazon EKS 支持三种访问条目身份验证模式:

  • CONFIG_MAP 仅使用 aws-auth ConfigMap
  • API_AND_CONFIG_MAP 同时使用 EKS 访问条目 API 和 aws-auth ConfigMap。此模式优先通过 EKS 访问条目进行身份验证,当您需要将现有 aws-auth 权限迁移到 EKS 访问条目时非常有用。
  • API 仅使用 EKS 访问条目 API。

有关详细信息,请参阅授予 IAM 用户和角色访问 Kubernetes API 的权限

要使用访问条目配置集群,请将集群身份验证模式设置为 EKS APIEKS API and ConfigMap(EKS API 和 ConfigMap)。

要检查集群的当前身份验证模式,请完成以下步骤:

  1. 打开 Amazon EKS 控制台
  2. 选择 Access(访问)选项卡。
  3. Access configuration(访问配置)下,选中 Authentication mode(身份验证模式)标签。

或者,运行 describe-cluster 命令:

aws eks describe-cluster --name example-cluster --query 'cluster.accessConfig.authenticationMode' --region exampleRegion

如果集群的身份验证模式为 EKS APIEKS API and ConfigMap(EKS API 和 ConfigMap),则可以将集群配置为使用访问条目。如果不是,请参阅更改身份验证模式以使用访问条目

**注意:**您可以从 CONFIG_MAP 身份验证模式切换到 API 模式,但不能从 APIAPI_AND_CONFIG_MAP 切换到 CONFIG_MAP 模式。有关详细信息,请参阅 GitHub 网站上的集群访问管理器

相关信息

在 AWS CLI 中使用 IAM 角色

使用 EKS 访问条目授予 IAM 用户访问 Kubernetes 的权限

将现有的 aws-auth ConfigMap 条目迁移到访问条目

如何使用 Amazon EKS 访问条目 API 恢复对 EKS 集群的访问权限?