为什么我无法连接到我的 Amazon EKS 集群?
我创建了一个 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 服务器端点
要解决此问题,请完成以下步骤:
-
要检查您是否可以连接到 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 -
要检查 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" ] }要允许公共访问,请确保 endpointPublicAccess 为 true。要保持访问私密性,请确保 endpointPublicAccess 为 false。如果 endpointPublicAccess 为 false,请继续执行步骤 9。如果 endpointPublicAccess 为 true,则安全最佳实践是将 endpointPublicAccess 限制在特定的 IP 地址范围。完成步骤 3-8,将允许的 IP 地址添加到 publicAccessCidrs 允许列表。
-
打开 Amazon EKS 控制台。
-
选择 Clusters(集群),然后选择要更新的集群。
-
选择 Networking(联网)选项卡,然后选择 Manage networking(管理联网)。
-
选择 Public(公开)。
-
在 Advanced settings(高级设置)下,对于 CIDR block(CIDR 块),输入要添加到许可列表的公有 CIDR 范围。
**重要事项:**包括私有子网中的 Worker 节点用来访问互联网的 NAT 网关的 IP 地址。此外,还应包括所有 NAT 设备网络组件的 IP 地址。 -
选择 Save changes(保存更改)。
-
如果您已在 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 -
更新集群安全组,以便将源 IP 地址或 CIDR 范围添加到您的允许列表。这使得 kubectl 客户端能够在集群 VPC 内连接到 Amazon EKS API 服务器端点。
相关信息
当我连接到 Amazon EKS API 服务器时,如何解决错误"You must be logged in to the server (Unauthorized)"?
De-mystifying cluster networking for Amazon EKS worker nodes(揭秘 Amazon EKS Worker 节点的集群网络)
- 语言
- 中文 (简体)

相关内容
AWS 官方已更新 5 个月前
