当我连接到 Amazon EKS API 服务器时,如何解决错误“您必须登录到服务器(未授权)”?
我在使用 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 寻求帮助。
相关信息
在 Amazon EKS 中创建集群之后,如何提供对其他 IAM 用户和角色的访问权限?
Kubernetes 网站上有关使用 RBAC 授权的文档
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前