為什麼我無法連線至 Amazon EKS 叢集?

4 分的閱讀內容
0

我建立了 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集,但無法連線至我的叢集。

簡短描述

由於下列其中一個原因,您可能無法連線至 EKS 叢集:

  • 您並未建立叢集的 kubeconfig 檔案。
  • 您無法連線至 Amazon EKS API 伺服器端點。

解決方法

您並未建立 kubeconfig 檔案

建立 Amazon EKS 叢集之後,您必須使用 AWS Command Line Interface (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 組態中授予這些許可。IAM 使用者或角色也會在 aws-auth ConfigMap 中授予 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 Resource Name (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 詳細資訊,然後執行下列命令:

$ 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. 選擇網路索引標籤,然後選擇管理網路
  4. 選取公開
  5. 進階設定下的 CIDR 區塊中,輸入所有需要允許列出的公開 CIDR 範圍。
  6. 選擇儲存變更

在上述輸出訊息中,如果 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 伺服器時,如何解決「您必須登入伺服器 (未經授權)」錯誤?

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