如何解决连接到 Amazon EKS API 服务器时出现的未经授权服务器错误?

上次更新日期:2022 年 9 月 20 日

我正在使用 kubectl 命令连接到 Amazon Elastic Kubernetes Service(Amazon EKS)API 服务器。我收到消息“error: You must be logged in to the server (Unauthorized) [错误:您必须登录到服务器(未经授权)]”。如何解决此问题?

简短描述

集群管理员必须完成下面其中一个部分中的步骤:

  • 您是集群创建者
  • 您不是集群创建者

然后,收到错误的人必须完成您是收到此错误的用户或角色部分中的步骤。

解决方法

您是集群创建者

注意:如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

1.    要查看您的 AWS CLI 用户或角色的配置,请运行下面的命令:

$ aws sts get-caller-identity

输出将返回 AWS Identity and Access Management (IAM) 用户或角色的 Amazon 资源名称 (ARN)。例如:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

2.    确认 ARN 与集群创建者相匹配。要找到集群创建者,您可以在 Amazon CloudWatch Application Insights 中运行以下命令。注意:Amazon EKS 将控制面板端的集群创建者 IAM 角色映射为 kubernetes-admin。如果在创建集群时激活了 API 服务器日志记录,则可以查询实体创建者。

fields @logstream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50

此查询返回映射为集群创建者的 IAM 实体。代入您在输出中收到的 IAM 实体角色,然后再次对集群进行 kubectl 调用。

3.    使用下面的命令之一更新或生成 kubeconfig 文件。

以 IAM 用户的身份运行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

注意:eks-cluster-name 替换为您的集群名称。将 aws-region 替换为您的 AWS 区域。

以 IAM 角色的身份运行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole

注意:eks-cluster-name 替换为您的集群名称。将 aws-region 替换为您的 AWS 区域。

4.    要确认 kubeconfig 文件已更新,请运行以下命令:

$ kubectl config view --minify

5.    要确认您的 IAM 用户或角色已经过身份验证,请运行以下命令:

$ kubectl get svc

示例输出:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

您不是集群创建者

1.    要获取您的 AWS CLI 用户或角色的配置,请运行下面的命令:

$ aws sts get-caller-identity

输出将返回 IAM 用户或角色的 ARN。

2.    要求集群拥有者或管理员将您的 IAM 用户或角色添加到 aws-auth ConfigMap 中。

注意:如果您有正确的 IAM 权限,则可以使用 AssumeRole 以集群创建者的身份登录。

3.    要在文本编辑器中编辑 aws-auth ConfigMap,集群拥有者或管理员必须运行以下命令:

$ kubectl edit configmap aws-auth --namespace kube-system

注意:如果您收到错误“Error from server (NotFound): configmaps "aws-auth" not found [服务器错误(找不到):找不到配置映射“aws-auth”],请按照说明将 aws-authConfigMap 应用到您的集群

4.    要添加 IAM 用户或 IAM 角色,请完成以下其中一个步骤。

添加 IAM 用户到 mapUsers。例如:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
      - system:masters

注意:请将 testuser 替换为您的用户名。

添加 IAM 角色到 mapRoles。例如:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
      - system:masters

注意:请将 testrole 替换为您的角色。

mapRoles 部分的 username 值只接受小写字符。必须映射 IAM 角色而不使用路径。要了解有关 rolearn 路径要求的更多信息,请展开 IAM 问题排查中的 aws-auth ConfigMap 不授予对集群的访问权限部分

要为 AWS IAM Identity Center(AWS Single Sign-On 的后继者)的 IAM 角色指定 rolearn,请从角色 ARN 中删除路径 '/aws-reserved/sso.amazonaws.com/REGION'。否则,ConfigMap 中的条目将无法授权您作为有效用户。

system:masters 组允许超级用户访问,以在任何资源上执行任何操作。有关更多信息,请参阅默认角色和角色绑定。要限制此用户的访问权限,您可以创建 Amazon EKS 角色和角色绑定资源。有关限制用户在 Amazon EKS 控制台中查看资源的访问权限的示例,请执行必需权限中的步骤 2 和 3。

您是收到错误的用户或角色

1.    要在更新 aws-auth ConfigMap 之后更新或生成 kubeconfig 文件,请运行以下命令之一。

以 IAM 用户的身份运行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

注意:eks-cluster-name 替换为您的集群名称。将 aws-region 替换为您的 AWS 区域。

2.    以 IAM 角色的身份运行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole

注意:eks-cluster-name 替换为您的集群名称。将 aws-region 替换为您的 AWS 区域。

3.    要确认 kubeconfig 文件已更新,请运行以下命令:

$ kubectl config view --minify

4.    要确认您的 IAM 用户或角色已经过身份验证,请运行以下命令:

$ kubectl get svc

示例输出:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

注意:如果您仍然收到错误,请参阅问题排查指南使用 RBAC 授权


这篇文章对您有帮助吗?


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