为什么我无法连接到我的 Amazon EKS 集群?
我创建了一个 Amazon Elastic Kubernetes Service(Amazon EKS)集群,但我无法连接到我的集群。
简短描述
由于以下原因之一,您可能无法连接到 EKS 集群:
- 您没有为集群创建 kubeconfig 文件。
- 您无法连接到 Amazon EKS API 服务器端点。
解决方法
您没有创建 kubeconfig 文件
创建 Amazon EKS 集群后,必须使用 AWS 命令行界面(AWS CLI)配置 kubeconfig 文件。此配置允许您使用 kubectl 命令行连接到集群。以下解决方法向您展示了如何使用 AWS CLI update-kubeconfig 命令为您的集群创建 kubeconfig 文件。要在不使用 AWS CLI 的情况下手动更新您的 kubeconfig 文件,请参阅为 Amazon EKS 集群创建或更新 kubeconfig 文件。
**注意:**如果在执行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
- 验证您的系统上是否安装有 AWS CLI 1.16.308 或更高版本:
$ aws --version
**重要事项:**您的系统上必须安装 Python 2.7.9 或更高版本。否则,您会收到错误。
**提示:**使用适用于 macOS 的 yum、apt-get 或 homebrew 等软件包管理器来安装 AWS CLI。
- 检查当前身份,确认您使用的是有 Amazon EKS 集群访问权限的正确凭证:
aws sts get-caller-identity
**注意:**创建集群时,创建 Amazon 集群的 AWS Identity and Access Management(AWS IAM)实体用户或角色会自动获得权限。这些权限在控制面板中集群的 RBAC 配置中授予。也可以在 aws-auth ConfigMap中授予 IAM 用户或角色访问 Amazon EKS 集群的权限。默认情况下,适用于 Kubernetes 的 AWS IAM 身份验证器使用配置的 AWS CLI 或 AWS SDK 身份。有关更多信息,请参阅启用 IAM 用户和角色对集群的访问权限。
- 为您的集群创建或更新 kubeconfig 文件:
aws eks --region example_region update-kubeconfig --name cluster_name
**注意:**将 example_region 替换为您的 AWS 区域的名称。请将 cluster_name 替换为您的 EKS 集群名称。
默认情况下,Linux 的配置文件是在您主目录的 kubeconfig 路径($HOME/.kube/config)中创建的。该文件也可能与该位置的现有 kubeconfig 合并。对于 Windows,该文件位于 %USERPROFILE%\.kube\config。
您也可以通过设置 KUBECONFIG(从 Kubernetes 网站)环境变量或使用以下 --kubeconfig 选项来指定其他路径:
$ kubectl get pods --kubeconfig ./.kube/config
注意:要在运行 kubectl 命令时进行身份验证,您可以使用 --role-arn 选项指定 IAM 角色 Amazon 资源名称(ARN)。否则,将使用您的默认 AWS CLI 或 AWS SDK 凭证链中的 IAM 实体。有关更多信息,请参阅 update-kubeconfig。或者,完成为 Amazon EKS 集群创建或更新 kubeconfig 文件的手动创建 kubeconfig 文件部分中的第 6 步。
- 测试您的配置:
$ kubectl get svc
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1m
**注意:**如果您收到其他授权或资源类型错误,请参阅未授权或访问被拒绝(kubectl)。
您无法连接到 Amazon EKS API 服务器端点
- 验证您是否连接到正确的 Amazon EKS API 服务器 URL。为此,请启用 kubectl 详细程度,然后执行以下命令:
$ kubectl get svc --v=9
输出类似于以下内容:
I0110 16:43:36.920095 48173 loader.go:373] Config loaded from file: /Users/abs/.kube/config I0110 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 服务器:
$ aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig
输出类似于以下内容:
{ "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,则务必将 publicAccessCidrs 列表中的所有源 IP 地址列入允许列表。为此,请执行以下操作:
-
打开 Amazon EKS 控制台。
-
选择要更新的集群。
-
选择联网选项卡,然后选择管理联网。
-
选择公有。
-
在高级设置下,对于 CIDR 块,输入所有需要列入允许列表的公有 CIDR 范围。
-
选择保存更改。
在前面的输出中,如果 endPointPrivateAccess 为 true,则确保 kubectl 请求来自集群的网络内部。如果您的 kubectl 请求来自您的 Amazon Virtual Private Cloud(Amazon VPC)之外,则会出现以下超时错误:
$ kubectl get svc --v=9 I0110 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 客户端就可以连接到 Amazon EKS API 服务器端点。
相关信息
如何排除在连接到 Amazon EKS API 服务器时出现的“You must be logged in to the server (Unauthorized)”错误?
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 6 个月前