如何解决连接到 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 授权。