我为什么无法连接到 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。

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.    在前面的输出中,如果 endpointPublicAccesstrue,请确保将 publicAccessCidrs 列表中的所有源 IP 地址加入允许列表。为此,请执行以下操作:

  1. 打开 Amazon EKS 控制台
  2. 选择要更新的集群。
  3. 选择 Networking(网络)选项卡,然后选择 Manage Networking(管理网络)。
  4. 选择 Public(公共)。
  5. Advanced settings(高级设置)下的 CIDR block(CIDR 块)中,输入需要加入允许列表的所有公共 CIDR 范围。
  6. 选择 Save changes(保存更改)。

在前面的输出中,如果 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 官方已更新 10 个月前