跳至内容

为什么我无法使用 kubectl 连接到我的 EKS 集群?

3 分钟阅读
0

当我使用 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"

  1. 运行以下命令,检查 kubeconfig 文件是否存在于主目录的默认位置 (.kube):

    cat ~/.kube/config
  2. 如果该文件存在,请验证 kubeconfig 文件中是否包含 base64 编码的集群 CA。此外,请检查 certificate-authority-data 文件是否存在,以及您是否正确配置了该文件。

  3. 如果 kubeconfig 文件不存在,请运行以下命令重新创建该文件:

    kubectl get svc --insecure-skip-tls-verify
  4. 检查您是否使用了可能阻止 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"

要解决此问题,请完成以下步骤:

  1. 运行 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。

  2. 将身份验证模式更改API_AND_CONFIG_MAPAPI,然后使用 EKS 访问条目向 IAM 用户授予 Kubernetes 访问权限

  3. 要授予适当的权限,请使用 APIAPI_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/AmazonEKSViewPolicy

    API_AND_CONFIG_MAP 身份验证模式
    对于 API_AND_CONFIG_MAP 身份验证模式,您可以使用上述 API 身份验证模式,也可以编辑配置映射。
    要编辑 aws-auth 配置映射,请运行以下命令:

    kubectl edit configmap aws-auth -n kube-system

    将您的 IAM 角色或用户添加到 mapRolesmapUsers 部分。
    以下是包含 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 ;

相关信息

通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群

AWS 官方已更新 1 年前