為什麼我無法連線至 Amazon EKS 叢集?
我建立了 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 的套件管理員 (例如 yum、apt-get 或 homebrew) 以安裝 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. 在上述輸出訊息中,如果 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 伺服器端點。
相關資訊
相關內容
- 已提問 2 個月前lg...
- 已提問 2 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 個月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 個月前