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

4 分钟阅读
0

我使用 kubectl 命令连接到 Amazon Elastic Kubernetes Service (Amazon EKS) API 服务器。我收到消息“error: 您必须登录到服务器(未授权)”。

简短描述

如果在 kubectl 中配置的 AWS Identity and Access Management(IAM)实体未经 Amazon EKS 进行身份验证,会出现此错误。系统会根据您使用的 IAM 实体(用户或角色)对您进行身份验证,然后授予您访问 Amazon EKS 集群的权限。此错误通常由以下配置之一引起:

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

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

  • 您是集群创建者
  • 您不是集群创建者
  • 使用访问条目

解决方法

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

您是集群创建者

如果您的 IAM 实体用于创建 Amazon EKS 集群,说明您是集群创建者。要以集群创建者的身份解决错误,请完成以下步骤:

  1. Amazon CloudWatch Log Insights 中,为您的 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 实体:

    @messagetime="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. 查看 AWS CLI 的集群创建者 IAM 实体。要查看您的 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 区域的名称。
    要为 kubeconfig 文件指定 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. 查看 AWS CLI 的集群创建者 IAM 实体。要查看在您的 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. 如果返回的 IAM 实体不是集群创建者,将您的实体添加到 aws-auth ConfigMap 以允许该实体访问集群。只有集群管理员可以修改 aws-auth ConfigMap,因此请完成以下任务之一:
    要使用集群创建者 IAM 实体访问集群,请完成您是集群创建者部分的步骤。
    或请集群管理员执行此操作。

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

    eksctl get iamidentitymapping --cluster cluster-name

    -或-

    kubectl describe configmap aws-auth -n kube-system

    如果您的 IAM 实体在 aws-auth ConfigMap 中,则继续执行下一步。如果您的 IAM 实体不在 aws-auth ConfigMap 中,则运行以下命令来自动映射您的 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 实体添加到 aws-auth ConfigMap,将 IAM 用户或角色 ARN 添加到 mapUsers
    IAM 用户示例:

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

    IAM 角色示例:

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

    重要事项:
    映射 IAM 角色时不能带路径。有关 rolearn 路径要求的详细信息,请参阅 aws-auth ConfigMap 不授予对集群的访问权限部分。
    要为 AWS IAM Identity Center IAM 角色指定 rolearn,从角色 ARN 中删除路径 "/aws-reserved/sso.amazonaws.com/REGION"。否则,ConfigMap 中的条目无法授权您为有效用户。
    system:masters 组允许超级用户访问,支持在任何资源上执行任何操作。有关详细信息,请参阅 Kubernetes 网站上的默认角色和角色绑定。要限制此用户的访问权限,创建 Amazon EKS 角色和角色绑定资源。有关更多信息,请参阅所需权限

  4. 运行以下命令更新或生成 kubeconfig 文件。确保使用您的 IAM 实体配置 AWS CLI。

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

    **注意:**将 eks-cluster-name 替换为您的集群的名称。将 aws-region 替换为您的区域的名称。
    您也可以使用特定配置文件运行此命令:

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

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

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

    $ kubectl config view --minify
  6. 要确认您的 IAM 用户或角色已通过身份验证,再次访问集群。例如,您可以运行以下命令来确认错误已解决:

    $ kubectl get svc

    输出示例:

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

使用访问条目重新获得对集群的访问权限

使用 CreateAccessEntry API 提供或恢复对您的 Amazon EKS 集群的访问权限。有关更多信息,请参阅如何使用 Amazon EKS 访问条目 API 来恢复对 EKS 集群的访问权限?

故障排除

当您运行 kubectl 命令时,会向 Amazon EKS 集群 API 服务器发送请求。然后,Amazon EKS 身份验证器会尝试对此请求进行身份验证。如果 Amazon EKS 身份验证器无法对请求进行身份验证,在 CloudWatch 中检查 EKS 身份验证器日志。使用以下故障排除提示来确定问题。

访问您的 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 命令。

查看您的 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 实体已正确映射并满足您不是集群创建者部分列出的要求。对于映射错误或缺少的 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 实体。之后,重新创建的集群创建者 IAM 实体可与 IAM 实体具有相同的 ARN。然后,完成您是集群创建者部分的步骤,使用 IAM 实体访问集群。

  • 如果集群创建者是为已删除的 SSO 用户创建的 IAM 角色,您无法再次创建此 IAM 角色。在这种情况下,请联系 AWS Support 寻求帮助。

相关信息

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

Kubernetes 网站上的使用 RBAC 授权

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

eksctl 网站上的 EKS 访问条目

AWS 官方
AWS 官方已更新 7 个月前