当我连接到 Amazon EKS API 服务器时,如何解决错误“您必须登录到服务器(未授权)”?

4 分钟阅读
0

我在使用 kubectl 命令连接到 Amazon Elastic Kubernetes Service (Amazon EKS) 应用程序编程接口(API)服务器。我收到了消息“错误: 您必须登录到服务器(未授权)”。

简短描述

如果在 kubectl 中配置的 AWS Identity and Access Management(IAM)实体未经 Amazon EKS 进行身份验证,会出现此错误。

系统会根据您使用的 IAM 实体(用户或角色)对您进行身份验证,然后授予您访问 Amazon EKS 集群的权限。因此,请确保满足以下条件:

  • 您已将 kubectl 工具配置为使用您的 IAM 用户或角色。
  • 您的 IAM 实体已映射到 aws-auth ConfigMap。

要解决此问题,您必须根据您的用例完成以下其中一个部分中的步骤:

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

解决方法

如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确认您运行的是最新版本的 AWS CLI

您是集群创建者

如果您的 IAM 实体用于创建 Amazon EKS 集群,说明您是集群创建者。

1.    在 Amazon CloudWatch Log Insights 中运行以下查询,来确定集群创建者 ARN:

首先,为您的 Amazon EKS 集群(例如:/aws/eks/my-cluster/cluster)选择日志组。然后,运行以下查询:

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

**注意:**请务必启用 Amazon EKS 身份验证器日志。

此查询返回映射为集群创建者的 IAM 实体:

@message
time="2022-05-26T18:55:30Z" level=info msg="access granted" arn="arn:aws:iam::123456789000:user/testuser" client="127.0.0.1:57586" groups="[system:masters]" method=POST path=/authenticate uid="aws-iam-authenticator:123456789000:AROAFFXXXXXXXXXX" username=kubernetes-admin

2.    确保已使用集群创建者 IAM 实体配置 AWS CLI。要查看您的 Shell 环境中是否为 AWS CLI 配置了 IAM 实体,请运行以下命令:

$ aws sts get-caller-identity

您也可以使用特定的配置文件运行此命令:

$ aws sts get-caller-identity --profile MY-PROFILE

输出将返回为 AWS CLI 配置的 IAM 实体的 Amazon 资源名称(ARN)。

示例:

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

确认返回的 IAM 实体与集群创建者 IAM 实体相匹配。如果返回的 IAM 实体不是集群创建者,则更新 AWS CLI 配置以使用集群创建者 IAM 实体。

3.    使用以下命令更新或生成 kubeconfig 文件:

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

注意:

  • eks-cluster-name 替换为您的集群的名称。
  • aws-region 替换为您的 AWS 区域的名称。

要指定 AWS CLI 配置文件,运行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

注意:

  • eks-cluster-name 替换为您的集群的名称。
  • aws-region 替换为您的区域的名称。
  • my-profile 替换为您的配置文件的名称。

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

$ kubectl config view --minify

5.    要确认您的 IAM 实体已通过身份验证并且您可以访问您的 EKS 集群,请运行以下命令:

$ kubectl get svc

输出示例:

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

您不是集群创建者

如果您的 IAM 实体未用于创建集群,说明您不是集群创建者。这时,您必须将 IAM 实体映射到 aws-auth ConfigMap 来允许访问集群。

1.    确保您已使用 IAM 实体配置 AWS CLI。要查看在您的 Shell 环境中为 AWS CLI 配置的 IAM 实体,请运行以下命令:

$ aws sts get-caller-identity

您也可以使用特定的配置文件运行此命令:

$ aws sts get-caller-identity --profile my-profile

输出将返回为 AWS CLI 配置的 IAM 实体的 ARN。

示例:

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

确认返回的 IAM 实体是您的 IAM 实体。如果返回的 IAM 实体不是用于与集群交互的实体,先更新 AWS CLI 配置以使用正确的 IAM 实体。然后,再次尝试使用 kubectl 访问您的集群。如果问题仍然存在,请继续执行步骤 2。

2.    如果返回的 IAM 实体不是集群创建者,请将您的 IAM 实体添加到 aws-auth ConfigMap。这将允许 IAM 实体访问集群。

只有集群管理员可以修改 aws-auth ConfigMap。因此,请执行以下任一操作:

  • 按照您是集群创建者部分中的说明,使用集群创建者 IAM 实体访问集群。
  • 请集群管理员执行此操作。

运行以下命令,检查您的 IAM 实体是否在 aws-auth ConfigMap 中:

eksctl get iamidentitymapping --cluster cluster-name

-或者-

kubectl describe configmap aws-auth -n kube-system

如果您的 IAM 实体在 aws-auth ConfigMap 中,则可以跳到步骤 3。

通过运行以下命令自动映射 IAM 实体:

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \
    --group system:masters \
    --no-duplicate-arns \
    --username admin-user1

或者,您可以通过编辑 aws-auth ConfigMap 来手动映射 IAM 实体:

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

要添加 IAM 用户,请将 IAM 用户 ARN 添加到 mapUsers中。

示例:

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

要添加 IAM 角色,请将 IAM 角色 ARN 添加到 mapRoles中。

示例:

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

重要信息:

  • 映射 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。

3.    通过运行以下命令更新或生成 kubeconfig 文件。确保使用步骤 1 中返回的 IAM 实体配置 AWS CLI。

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

注意:

  • eks-cluster-name 替换为您的集群的名称。
  • aws-region 替换为您的 AWS 区域的名称。

您也可以使用特定的配置文件运行此命令:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

注意:

  • eks-cluster-name 替换为您的集群的名称。
  • aws-region 替换为您的 AWS 区域的名称。
  • my-profile 替换为您的配置文件的名称。

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

其他故障排除提示

如果错误仍然存在,请使用以下故障排除提示来确定问题。

当您运行 kubectl 命令时,会向 Amazon EKS 集群 API 服务器发送请求。然后,Amazon EKS 身份验证器会尝试对此请求进行身份验证。因此,可在 CloudWatch 中查看 EKS 身份验证器日志来确定问题。

1.    确保您已为 Amazon EKS 集群启用了日志记录功能

2.    打开 CloudWatch Log Insights。

3.    选择您的集群的日志组。示例:“/aws/eks/example-cluster/cluster”。

4.    运行以下查询:

fields @timestamp, @message
| filter @logStream like /authenticator/
| sort @timestamp desc
| limit 1000

通过运行 kubectl 命令识别出现错误时相同时间间隔内的日志行。您可以在 Amazon EKS 身份验证器日志中找到有关错误原因的更多信息。

  • 如果问题是由于为 kubectl 使用了不正确的 IAM 实体导致的,请查看 kubectl kubeconfig 和 AWS CLI 配置。确保您使用的是正确的 IAM 实体。例如,假设日志类似于以下内容。此输出意味着 kubectl 使用的 IAM 实体无法验证。确保 kubectl 使用的 IAM 实体在 IAM 中存在,并且该实体的编程访问已启用。
time="2022-12-26T20:46:48Z" level=warning msg="access denied" client="127.0.0.1:43440" error="sts getCallerIdentity failed: error from AWS (expected 200, got 403). Body: {\"Error\":{\"Code\":\"InvalidClientTokenId\",\"Message\":\"The security token included in the request is invalid.\",\"Type\":\"Sender\"},\"RequestId\":\"a9068247-f1ab-47ef-b1b1-cda46a27be0e\"}" method=POST path=/authenticate
  • 如果问题是由于您的 IAM 实体未在 aws-auth ConfigMap 中映射或映射不正确导致的,则查看 aws-auth ConfigMap。确保 IAM 实体已正确映射并满足您不是集群创建者部分中列出的要求。在这种情况下,EKS 身份验证器日志类似于以下内容:
time="2022-12-28T15:37:19Z" level=warning msg="access denied" arn="arn:aws:iam::XXXXXXXXXX:role/admin-test-role" client="127.0.0.1:33384" error="ARN is not mapped" method=POST path=/authenticate
  • 如果 aws-auth ConfigMap 已更新但您失去了对集群的访问权限,则可以使用集群创建者的 IAM 实体访问集群。这是因为不需要在 aws-auth ConfigMap 中映射集群创建者。
  • 如果删除了集群创建者 IAM 实体,请先再次创建相同的 IAM 用户或角色。然后,按照您是集群创建者部分中的步骤,使用此 IAM 实体访问集群。
  • 如果集群创建者是为已移除的 SSO 用户创建的 IAM 角色,则您无法再次创建此 IAM 角色。在这种情况下,请联系 AWS Support 寻求帮助。

相关信息

开启 IAM 用户和角色对集群的访问权限

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

Amazon EKS 问题排查

Kubernetes 网站上有关使用 RBAC 授权的文档

AWS 官方
AWS 官方已更新 1 年前