连接到 Amazon EKS API 服务器时如何解决未授权的服务器错误?
上次更新时间:2021 年 11 月 8 日
我在使用 kubectl 命令连接到 Amazon Elastic Kubernetes Service (Amazon EKS) API 服务器时收到消息“error: You must be logged in to the server (Unauthorized)”(错误: 您必须登录服务器(未经授权))。
简短描述
在您连接 Amazon EKS API 服务器之前,安装并配置最新版本的 AWS 命令行界面 (AWS CLI)。
注意:如果您在运行 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 与集群创建者相匹配。
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 -n kube-system
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 值只接受小写字符。 由于 rolearn 不支持路径,所以 IAM 角色应在没有路径的情况下进行映射。
system:masters 组允许超级用户访问,以在任何资源上执行任何操作。有关更多信息,请参阅 Kubernetes 网站上的默认角色和角色绑定。
您是收到错误的用户或角色
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
注意: 如果您仍然收到错误,请参阅 Kubernetes 网站上的 使用 RBAC 授权了解排查指南。