跳至内容

为什么我无法连接到我的 Amazon EKS 集群?

3 分钟阅读
0

我创建了一个 Amazon Elastic Kubernetes Service (Amazon EKS) 集群,但我无法连接。

简短描述

由于以下原因之一,您可能无法连接到 Amazon EKS 集群:

  • 您没有为集群创建 kubeconfig 文件。
  • 您无法连接到 Amazon EKS API 服务器端点。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

您没有创建 kubeconfig 文件

创建 Amazon EKS 集群后,配置您的 kubeconfig 文件,这样您就可以使用 kubectl 命令行连接到您的集群。kubeconfig 文件包含您的 Kubernetes 集群配置。

根据您的操作系统 (OS),您可以在以下位置找到您的 kubeconfig 文件:

  • 对于 Linux 或 macOS,请转到 $HOME/.kube/config
  • 对于 Windows,请转到 %USERPROFILE%\.kube\config

要使用不同的文件位置,请执行以下操作之一:

  • KUBECONFIG 环境变量设置为指向新位置。
  • 当您运行 kubectl 命令来指定自定义文件路径时,使用 --kubeconfig 标志。

如果 kubeconfig 文件已存在于默认位置,则 Amazon EKS 会将新配置与现有文件合并。您可以使用 kubectl config 命令管理您的集群上下文。有关详细信息,请参阅 Kubernetes 网站上的 kubectl config

您无法连接到 Amazon EKS API 服务器端点

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

  1. 要检查您是否可以连接到 Amazon EKS API 服务器 URL,请以更高的详细级别运行以下命令:

    kubectl get svc --v=9

    命令输出显示详细的连接信息,包括您的连接使用的 API 服务器 URL。检查列出用于 HTTP 跟踪: DNS 查询的 IP 地址。
    输出示例:

    I0110 16:43:36.920095   48173 loader.go:373] Config loaded from file:  /Users/abs/.kube/configI0110 16:43:36.936844   48173 round_trippers.go:466] curl -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500'
    I0110 16:43:37.362185   48173 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/ resolved to [{18.119.155.77 } {3.136.153.3 }]
    I0110 16:43:37.402538   48173 round_trippers.go:510] HTTP Trace: Dial to tcp:18.119.155.77:443 succeed
    I0110 16:43:37.500276   48173 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500 200 OK in 563 milliseconds
    I0110 16:43:37.500302   48173 round_trippers.go:570] HTTP Statistics: DNSLookup 1 ms Dial 40 ms TLSHandshake 44 ms ServerProcessing 52 ms Duration 563 ms
    I0110 16:43:37.500308   48173 round_trippers.go:577] Response Headers:
    I0110 16:43:37.500316   48173 round_trippers.go:580] Audit-Id: 37c17136-7fa7-40e9-8fe6-b24426e81564
    I0110 16:43:37.500323   48173 round_trippers.go:580] Cache-Control: no-cache, private
    I0110 16:43:37.500329   48173 round_trippers.go:580] Content-Type: application/json
    I0110 16:43:37.500334   48173 round_trippers.go:580] X-Kubernetes-Pf-Flowschema-Uid: 508eb99e-d99b-44db-8ade-838c99fe8e9f
    I0110 16:43:37.500340   48173 round_trippers.go:580] X-Kubernetes-Pf-Prioritylevel-Uid: d324d3db-05ce-441b-a0ff-c31cbe8f696c
    I0110 16:43:37.500345   48173 round_trippers.go:580] Date: Tue, 10 Jan 2023 21:43:37 GMT
  2. 要检查 Amazon EKS API 服务器是否可公开访问,请运行以下 describe-cluster AWS CLI 命令:

    aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig

    **注意:**将 cluster_name 替换为您的集群名称,将 example_region 替换为您的 AWS 区域。
    输出示例:

    {    "subnetIds": [
            "subnet-abc1",
            "subnet-abc2",
            "subnet-abc3",
            "subnet-abc4",
            "subnet-abc5",
            "subnet-abc6"
        ],
        "securityGroupIds": [
           "sg-abc7"
        ],
        "clusterSecurityGroupId": "sg-abc7",
        "vpcId": "vpc-abc9",
        "endpointPublicAccess": true,
        "endpointPrivateAccess": false,
        "publicAccessCidrs": [
            "0.0.0.0/0"
        ]
    }

    要允许公共访问,请确保 endpointPublicAccesstrue。要保持访问私密性,请确保 endpointPublicAccessfalse。如果 endpointPublicAccessfalse,请继续执行步骤 9。如果 endpointPublicAccesstrue,则安全最佳实践是将 endpointPublicAccess 限制在特定的 IP 地址范围。完成步骤 3-8,将允许的 IP 地址添加到 publicAccessCidrs 允许列表。

  3. 打开 Amazon EKS 控制台

  4. 选择 Clusters(集群),然后选择要更新的集群。

  5. 选择 Networking(联网)选项卡,然后选择 Manage networking(管理联网)。

  6. 选择 Public(公开)。

  7. Advanced settings(高级设置)下,对于 CIDR block(CIDR 块),输入要添加到许可列表的公有 CIDR 范围。
    **重要事项:**包括私有子网中的 Worker 节点用来访问互联网的 NAT 网关的 IP 地址。此外,还应包括所有 NAT 设备网络组件的 IP 地址。

  8. 选择 Save changes(保存更改)。

  9. 如果您已在 private-only 模式下配置集群的 API 服务器,请确保 kubectl 请求来自集群的网络。如果您的 kubectl 请求来自您的 Amazon Virtual Private Cloud (Amazon VPC) 之外,则在运行 get svc 命令时会收到以下超时错误:

    $ kubectl get svc --v=9I0110 17:15:58.889798   50514 loader.go:373] Config loaded from file:  /Users/example-user/.kube/config
    I0110 17:15:58.896715   50514 round_trippers.go:466] curl -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500'
    I0110 17:15:59.374499   50514 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com resolved to [{192.168.126.17 } {192.168.144.26 }]
    I0110 17:16:14.285027   50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.126.17:443 failed: dial tcp 192.168.126.17:443: i/o timeout
    I0110 17:16:29.191768   50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.144.26:443 failed: dial tcp 192.168.144.26:443: i/o timeout
    I0110 17:16:29.196959   50514 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500  in 30300 milliseconds
    I0110 17:16:29.197724   50514 round_trippers.go:570] HTTP Statistics: DNSLookup 183 ms Dial 14906 ms TLSHandshake 0 ms Duration 30300 ms
    I0110 17:16:29.197768   50514 round_trippers.go:577] Response Headers:
    I0110 17:16:29.199254   50514 helpers.go:264] Connection error: Get https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500: dial tcp 192.168.126.17:443: i/o timeout
    Unable to connect to the server: dial tcp 192.168.126.17:443: i/o timeout
  10. 更新集群安全组,以便将源 IP 地址或 CIDR 范围添加到您的允许列表。这使得 kubectl 客户端能够在集群 VPC 内连接到 Amazon EKS API 服务器端点。

相关信息

排查 Amazon EKS 集群和节点问题

当我连接到 Amazon EKS API 服务器时,如何解决错误"You must be logged in to the server (Unauthorized)"?

De-mystifying cluster networking for Amazon EKS worker nodes(揭秘 Amazon EKS Worker 节点的集群网络)

如何锁定对 Amazon EKS 集群中特定 IP 地址的 API 访问权限?