AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
为什么我无法使用 kubectl 连接到我的 EKS 集群?
当我使用 kubectl 命令行工具尝试连接到我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群时,我收到一条错误消息。
解决方法
如果您在使用 kubectl 时无法连接到 Amazon EKS 集群,则可能是您未正确配置服务、权限或设置。当本地环境无法与 EKS 集群的 API 服务器通信时,也可能会出现此错误。根据您收到的错误消息对问题进行故障排除。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
先决条件:
-
运行以下命令,以检查系统是否可以与正确的集群建立连接:
kubectl config current-context -
运行以下 get-caller-identity AWS CLI 命令,以验证当前已通过身份验证的 AWS Identity and Access Management (IAM) 用户或角色是否正确:
aws sts get-caller-identity**注意:**请根据集群身份验证模式允许 IAM 主体访问集群上的 Kubernetes 对象。
"exec plugin invalid" 错误消息
当 kubeconfig 文件中的身份验证 API 版本与 Kubernetes API 控制面板版本不兼容时,您会收到以下错误消息:
"exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha""
运行以下 update-kubeconfig 命令,以更新集群的 kubeconfig 文件:
aws eks update-kubeconfig --region region-code --name my-cluster
**注意:**请将 region-code 替换为您的集群所在的 AWS 区域,并将 my-cluster 替换为您的集群名称。
您的 kubectl 版本必须与 Amazon EKS 集群控制面板版本相差(早于或晚于)不超过一个次要版本。例如,kubectl 1.29 版本的客户端可与 Kubernetes 1.28、1.29 和 1.30 版本的集群配合使用。
"couldn't get current server API group list" 错误消息
当 kubeconfig 文件不存在或不含证书颁发机构 (CA) 时,您会收到以下错误消息:
"couldn't get current server API group list: Get "https://xxxxxxxxxxxxxxxxxxxx..eks.amazonaws.com/api?timeout=32s": tls: failed to verify certificate: x509: certificate signed by unknown authority"
-
运行以下命令,检查 kubeconfig 文件是否存在于主目录的默认位置 (.kube):
cat ~/.kube/config -
如果该文件存在,请验证 kubeconfig 文件中是否包含 base64 编码的集群 CA。此外,请检查 certificate-authority-data 文件是否存在,以及您是否正确配置了该文件。
-
如果 kubeconfig 文件不存在,请运行以下命令重新创建该文件:
kubectl get svc --insecure-skip-tls-verify -
检查您是否使用了可能阻止 TLS 的代理或 VPN。
"could not get current server API group list" 超时错误消息
如果源主机无法通过端口 443 与 API 服务器通信,请求将超时,且您会收到以下错误消息:
"could not get current server API group list: Get "https://xxxxxxxxxxxxxxxxxxxx.gr7.<region-code>.eks.amazonaws.com/api?timeout=32s": dial tcp xx.yy.zz.vvv:443: i/o timeout"
运行以下命令,在端口 443 上使用 telnet 检查设备与 API 服务器端点的连接:
$ echo exit | telnet
输出示例:
xxxxxxxxxxxxxxxxxxxx.gr7.us-east-2.eks.amazonaws.com 443Trying 18.224.160.210... Connected to xxxxxxxxxxxxxxxxxxxx.gr7.us-east-2.eks.amazonaws.com. Escape character is '^]'. Connection closed by foreign host.
如果 telnet 命令未能解决问题,请执行以下操作:
- 如果您在 API 服务器端点上激活了公共访问权限,请检查您是否将对该 API 服务器端点的访问限制在一定的 CIDR 范围内。确保设备的 IP 地址属于该 CIDR 块。此外,请检查 API 服务器端点访问行为。
- 如果您仅在 API 服务器端点上激活了私有访问权限,则所有集群 API 服务器流量都必须来自虚拟私有云 (VPC) 或已连接的网络。此外,kubectl 命令也必须来自 VPC 内部或已连接的网络。有关详细信息,请参阅访问私有 API 服务器。
- 检查安全组或网络访问控制列表(网络 ACL)是否阻止了对 Kubernetes API 服务器的请求。确保集群安全组允许端口 443 上来自源 CIDR 的流量。
"couldn't get current API server group list" 错误消息
当您尝试执行某项操作,但没有访问 Amazon EKS 集群上 Kubernetes API 的权限时,您会收到以下错误消息:
"couldn't get current server API group list: the server has asked for the client to provide credentials"
要解决此问题,请完成以下步骤:
-
运行 get-caller-identity 命令以查看是谁发出了访问 EKS 集群的请求:
aws sts get-caller-identity输出示例:
{ "UserId": "user-ID", "Account": "account-ID", "Arn": "arn:aws:iam::account-ID:user/kube-user" }**注意:**上述示例输出中将包含发出请求的 IAM 实体的用户 ID、AWS 账户和 ARN。
-
将身份验证模式更改为 API_AND_CONFIG_MAP 或 API,然后使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限。
-
要授予适当的权限,请使用 API 或 API_AND_CONFIG_MAP 身份验证模式添加 IAM 实体的条目。
API 身份验证模式
运行以下 create-access-entry 命令,以创建允许 IAM 主体对您的 Amazon EKS 集群进行身份验证的访问条目:aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:user/my-user --type STANDARD --username my-user**注意:**在上述命令中,请将主体 ARN 替换为您的 IAM 实体的 ARN。
运行以下 associate-access-policy 命令将访问条目与访问策略相关联:aws eks associate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \ --access-scope type=cluster --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicyAPI_AND_CONFIG_MAP 身份验证模式
对于 API_AND_CONFIG_MAP 身份验证模式,您可以使用上述 API 身份验证模式,也可以编辑配置映射。
要编辑 aws-auth 配置映射,请运行以下命令:kubectl edit configmap aws-auth -n kube-system将您的 IAM 角色或用户添加到 mapRoles 或 mapUsers 部分。
以下是包含 IAM 角色条目的 mapRoles 部分示例:mapRoles: | - groups: - system:masters rolearn: arn:aws:iam::111122223333:role/MyEKSrole username: eks-user**注意:**请将示例 ARN 替换为您的 IAM 角色的 ARN。如果您使用的是 IAM 用户,请将 MapRoles 替换为 MapUsers,将 ARN 替换为 IAM 用户的 ARN。
上述示例将 IAM 主体映射到 system:masters 组,该组可授予对集群的完全管理访问权限。要实现更严格的访问控制,请将 IAM 主体映射到自定义 Kubernetes 用户或组,并使用 Kubernetes 基于角色的访问控制 (RBAC) 对象来定义所需的权限。有关详细信息,请参阅 Kubernetes 网站上的使用 RBAC 授权。
"Did you specify the right host or port?" 错误消息
如果您未正确配置 kubeconfig 文件,kubectl 将无法连接到 EKS 集群,且您会收到以下错误消息:
"The connection to the server localhost:8080 was refused - did you specify the right host or port?"
要解决此问题,请执行以下操作:
-
运行以下命令更新 kubeconfig 文件:
aws eks update-kubeconfig --region region-code --name my-cluster -
运行以下命令检查 kubeconfig 文件中的当前上下文:
kubectl config current-context -
如果 current-context 命令的输出未指向预期的 EKS 集群,请运行以下命令:
kubectl config use-context ;
相关信息
- 语言
- 中文 (简体)
