我为什么无法连接到 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。
1. 确认您的系统已安装 AWS CLI 版本 1.16.308 或更高版本:
$ aws --version
**重要提示:**您必须在系统上安装 Python 版本 2.7.9 或更高版本。否则,您会收到错误。
提示:使用适用于 macOS 的 yum、apt-get 或 homebrew 等软件包管理器安装 AWS CLI。
2. 检查当前身份,验证您使用的是具有 Amazon EKS 集群权限的正确凭证:
aws sts get-caller-identity
**注意:**创建 Amazon 集群的 AWS Identity and Access Management (IAM) 实体用户或角色将在创建集群时自动获得权限。这些权限在控制面板中集群的 RBAC 配置中授予。还可以在 aws-auth ConfigMap 中向 IAM 用户或角色授予 Amazon EKS 集群的访问权限。默认情况下,AWS IAM Authenticator for Kubernetes 使用配置的 AWS CLI 或 AWS SDK 身份。有关更多信息,请参阅启用 IAM 用户和角色对集群的访问。
3. 为集群创建或更新 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 步。
4. 测试配置:
$ 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 服务器端点
1. 确认您已连接到正确的 Amazon EKS API 服务器 URL。为此,请打开 kubectl verbosity,然后运行以下命令:
$ 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
2. 通过运行以下命令验证 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" ] }
3. 在前面的输出中,如果 endpointPublicAccess 为 true,请确保将 publicAccessCidrs 列表中的所有源 IP 地址加入允许列表。为此,请执行以下操作:
- 打开 Amazon EKS 控制台。
- 选择要更新的集群。
- 选择 Networking(网络)选项卡,然后选择 Manage Networking(管理网络)。
- 选择 Public(公共)。
- 在 Advanced settings(高级设置)下的 CIDR block(CIDR 块)中,输入需要加入允许列表的所有公共 CIDR 范围。
- 选择 Save changes(保存更改)。
在前面的输出中,如果 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 服务器端点。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前