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

4 分钟阅读
0

我创建了一个 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 的 yumapt-gethomebrew 等软件包管理器来安装 AWS CLI。

  1. 检查当前身份,确认您使用的是有 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 用户和角色对集群的访问权限

  1. 为您的集群创建或更新 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 步。

  1. 测试您的配置:
$ 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 详细程度,然后执行以下命令:
$ 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
  1. 执行以下命令,验证是否可以公开访问 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"
    ]
}
  1. 在前面的输出中,如果 endpointPublicAccesstrue,则务必将 publicAccessCidrs 列表中的所有源 IP 地址列入允许列表。为此,请执行以下操作:

  2. 打开 Amazon EKS 控制台

  3. 选择要更新的集群。

  4. 选择联网选项卡,然后选择管理联网

  5. 选择公有。

  6. 高级设置下,对于 CIDR 块,输入所有需要列入允许列表的公有 CIDR 范围。

  7. 选择保存更改

在前面的输出中,如果 endPointPrivateAccesstrue,则确保 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 故障排除

如何排除在连接到 Amazon EKS API 服务器时出现的“You must be logged in to the server (Unauthorized)”错误?

AWS 官方
AWS 官方已更新 1 年前