為什麼無法連線至 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 版或更高版本。否則,您會收到錯誤。

**提示:**使用 yumapt-gethomebrew 等套件管理員,來安裝 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.    在上述的輸出中,如果 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 個月前