跳至内容

如何解决使用 kubectl 命令访问我的 Amazon EKS 集群时出现的“Unauthorized”错误?

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 权限。有两种方法可以将 system:masters 权限扩展到其他 IAM 用户和角色。您可以获得集群创建者凭证,然后在 aws-auth ConfigMap 的 mapRoles 部分添加 IAM 角色。或者,您可以使用 Amazon EKS 访问条目。

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

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

解决方法

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

重要信息: aws-auth ConfigMap 已弃用。有关管理 Kubernetes API 访问权限的推荐方法,请参阅使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限。

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

要为拥有配置 Amazon EKS 集群的主要访问权限的集群创建者确定 IAM 实体,请完成以下步骤:

  1. 在 AWS CloudTrail 中搜索 CreateCluster API 调用。
  2. 查看 API 调用的 userIdentity 部分。
  3. 确定您在创建集群后向其授予授权的 IAM 实体。

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

完成以下步骤:

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

  2. 在已安装 kubectl 的主机上,运行以下命令,以便使用 designated_user 凭证配置 AWS CLI:

    aws configure
  3. 要验证您的 AWS 身份,请运行以下 get-caller-identity 命令:

    aws sts get-caller-identity

    以下示例输出返回 designated_user 的 IAM 用户详细信息:

    {
        "UserId": "YOUR_USER_ID",
        "Account": "YOUR_ACCOUNT_NUMBER",
        "Arn": "arn:aws:iam::YOUR_ACCOUNT_NUMBER:user/YOUR_IAM_USERNAME"
    }
  4. 要列出在默认命名空间集群中运行的容器组 (pod),请运行以下命令:

    kubectl get pods --namespace default

    注意: 输出显示“Unauthorized”错误消息,因为 designated_user 无权访问 Amazon EKS 集群。

  5. 要为 cluster_creator IAM 实体配置 AWS CLI 凭证,请运行以下命令:

    aws configure

    注意: 使用创建集群的 IAM 用户或角色的凭证配置 AWS CLI。默认情况下,只有集群创建者拥有对 Amazon EKS 集群的管理员访问权限。如果您已在 Amazon EKS 控制台中创建集群,则使用登录控制台时所用的相同 IAM 实体来配置 AWS CLI。如果您使用 eksctl 创建集群,则使用运行 eksctl 时具有有效凭证的 IAM 实体来配置 AWS CLI。

  6. 要验证 cluster_creator 是否有权访问该集群,请运行以下命令:

    kubectl get pods

    注意: 您不会收到“Unauthorized”错误消息,并且输出会列出在默认命名空间中运行的所有容器组 (pod)。如果输出不显示资源,则没有容器组 (pod) 在默认命名空间中运行。

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

  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”错误消息,并且输出会列出在默认命名空间中运行的所有容器组 (pod)。如果输出不显示资源,则没有容器组 (pod) 在默认命名空间中运行。

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

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

完成以下步骤:

  1. 要获取 assume_role_user 的 IAM 用户详细信息,请运行以下 get-caller-identity 命令:

    aws sts get-caller-identity
  2. 要验证 assume_role_user 是否有权访问该集群,请运行以下命令:

    kubectl get pods

    注意: 输出显示“Unauthorized”错误消息,因为 designated_user 无权访问 Amazon EKS 集群。

  3. 要允许 assume_role_user 代入 cluster_creator 的角色,请运行以下 assume-role 命令:

    aws sts assume-role --role-arn arn:aws:iam::123456789012:role/cluster_creator --role-session-name test

    注意: 将 123456789012 替换为您的 AWS 账号,将 cluster_creator 替换为您的角色名称,并将 test 替换为您的会话名称。输出会返回临时凭证:

    {
        "Credentials": {
            "AccessKeyId": "YOUR_ACCESS_KEY_ID",
            "SecretAccessKey": "YOUR_SECRET_ACCESS_KEY",
            "SessionToken": "YOUR_SESSION_TOKEN",
            "Expiration": "2026-03-31T18:20:00Z"
        },
        "AssumedRoleUser": {
            "AssumedRoleId": "AROA1234567890EXAMPLE:test",
            "Arn": "arn:aws:sts::123456789012:assumed-role/cluster_creator/test"
        }
    }
  4. 要使用临时 IAM 凭证设置 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_SESSION_TOKEN 环境变量,请运行以下命令:

    export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
    export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
    export AWS_SESSION_TOKEN=YOUR_SESSION_TOKEN

    注意: 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. 要获取 designated_user 的 IAM 用户详细信息,请运行以下命令:

aws sts get-caller-identity
  1. 要验证 designated_user 是否有权访问该集群,请运行以下命令:
kubectl get pods

注意: 您不会收到“Unauthorized”错误消息,并且输出会列出在默认命名空间中运行的所有容器组 (pod)。如果输出不显示资源,则没有容器组 (pod) 在默认命名空间中运行。如果您使用 eksctl,请参阅 Manage IAM users and roles(管理 IAM 用户和角色)。

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

注意: 有关如何使用 eksctl 管理访问条目的更多信息,请参阅 eksctl 中的 Amazon EKS access entries(Amazon EKS 访问条目)。

创建访问条目

创建访问条目,以便向您的 IAM 用户和角色授予集群访问权限。

注意: 要访问集群,最佳做法是使用具有短期凭证的 IAM 角色,而不是使用具有长期凭证的 IAM 用户。

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

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

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

使用访问条目配置您的集群

要使用 Amazon EKS 控制台配置您的集群,请完成以下步骤:

  1. 打开 Amazon EKS 控制台。
  2. 选择 Access(访问)选项卡。
  3. 在 Access configuration(访问配置)下,检查 Authentication mode(身份验证模式)的当前设置。
  4. 将集群身份验证模式设置为 EKS API 或 API_AND_CONFIG_MAP。

要使用 AWS CLI 配置您的集群,请运行 describe-cluster 命令:

aws eks describe-cluster --name CLUSTER_NAME --query 'cluster.accessConfig.authenticationMode' --region REGION

注意: 请将 CLUSTER_NAME 替换为您的集群名称,并将 REGION 替换为您的 AWS 区域。

如果集群的身份验证模式为 EKS API 或 API_AND_CONFIG_MAP,则您可以将集群配置为使用访问条目。如果不是,请参阅更改身份验证模式以使用访问条目。

要使用 AWS CLI 更改身份验证模式,请运行以下 update-cluster-config 命令:

aws eks update-cluster-config \
    --name CLUSTER_NAME \
    --access-config authenticationMode=API_AND_CONFIG_MAP

注意: 将 CLUSTER_NAME 替换为您的集群名称。如果您想永久关闭 ConfigMap 方法,请将 API_AND_CONFIG_MAP 替换为 API。您可以从 CONFIG_MAP 身份验证模式切换到 API 模式,但不能从 API 或 API_AND_CONFIG_MAP 切换到 CONFIG_MAP 模式。有关详细信息,请参阅 Identity and Access Management(身份和访问管理)。

相关信息

在 AWS CLI 中使用 IAM 角色

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

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