為什麼無法連線至 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 版或更高版本。否則,您會收到錯誤。
**提示:**使用 yum、apt-get 或 homebrew 等套件管理員,來安裝 macOS 的 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 軟體開發套件身分。如需詳細資訊,請參閱開啟叢集的 IAM 使用者和角色存取權。
3. 為叢集建立或更新 kubeconfig 檔案:
aws eks --region example_region update-kubeconfig --name cluster_name
**注意:**以 AWS 區域名稱取代 example_region。將 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 軟體開發套件憑證鏈中的 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 主控台。
- 選擇您要更新的叢集。
- 選擇 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 伺服器端點。
相關資訊
相關內容
- 已提問 5 個月前lg...
- 已提問 5 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 個月前
- AWS 官方已更新 10 個月前
- AWS 官方已更新 2 年前