跳至內容

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

3 分的閱讀內容
0

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

簡短描述

您無法連線到 Amazon EKS 叢集可能是因為以下其中一個原因:

  • 您沒有為叢集建立 kubeconfig 檔案。
  • 您無法連線到 Amazon EKS API 伺服器端點。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

您並未建立 kubeconfig 檔案

建立 Amazon EKS 叢集後,請設定 kubeconfig 檔案,讓您能使用 kubectl 命令列連線到叢集。kubeconfig 檔案包含您的 Kubernetes 叢集組態。

根據您的作業系統 (OS),您可以在下列位置找到 kubeconfig 檔案:

  • 對於 Linux 或 macOS,請前往 $HOME/.kube/config
  • 對於 Windows,請前往 %USERPROFILE%\.kube\config

若要使用不同的檔案位置,請執行下列其中一個動作:

  • KUBECONFIG 環境變數設定為指向新位置。
  • 執行 kubectl 命令時,請使用 --kubeconfig 旗標指定自訂檔案路徑。

如果預設位置已存在 kubeconfig 檔案,則 Amazon EKS 會將新組態與現有檔案合併。您可以使用 kubectl config 命令來管理叢集上下文。如需詳細資訊,請參閱 Kubernetes 網站上的 kubectl config

您無法連線到 Amazon EKS API 伺服器端點

若要解決此問題,請完成以下步驟:

  1. 若要檢查您是否可以連線到 Amazon EKS API 伺服器網址,請使用較高詳細程度執行以下指令:

    kubectl get svc --v=9

    命令輸出會顯示詳細的連線訊息,包括您的連線所使用的 API 伺服器網址。檢查 HTTP Trace: DNS Lookup (HTTP 追蹤:DNS 查詢) 中列出的 IP 位址。
    輸出範例:

    I0110 16:43:36.920095   48173 loader.go:373] Config loaded from file:  /Users/abs/.kube/configI0110 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 伺服器是否可公開存取,請執行以下 describe-cluster AWS CLI 命令:

    aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig

    **注意:**將 cluster_name 替換為您的叢集名稱,並將 example_region 替換為您的 AWS 區域。
    輸出範例:

    {    "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"
        ]
    }

    若要允許公開存取,請確保 endpointPublicAccess 設為 true。若要保持私密存取,請確保 endpointPublicAccess 設為 false。如果 endpointPublicAccess 設為 false,請繼續進行步驟 9。如果 endpointPublicAccess 設為 true,安全上的最佳實務是將 endpointPublicAccess 限制在特定 IP 位址範圍內。完成步驟 3-8,將允許的 IP 位址新增到 publicAccessCidrs 允許清單中。

  3. 開啟 Amazon EKS console (Amazon EKS 主控台)。

  4. 選擇 Clusters (叢集),然後選取要更新的叢集。

  5. 選擇 Networking (網路) 索引標籤,然後選擇 Manage networking (管理網路)。

  6. 選擇 Public (公開)。

  7. Advanced settings (進階設定) 下的 CIDR 區塊中,輸入要新增至允許清單中的公有 CIDR 範圍。
    **重要:**包含位於私有子網路中,工作節點用來存取網際網路的 NAT 閘道 IP 位址。另請包含所有 NAT 裝置網路元件的 IP 位址。

  8. 選擇 Save changes (儲存變更)。

  9. 如果您以僅限私有模式設定叢集的 API 伺服器,請確保 kubectl 請求來自叢集的網路。如果您的 kubectl 請求來自 Amazon Virtual Private Cloud (Amazon VPC) 外部,那麼在執行 get svc 命令時,您會收到以下逾時錯誤:

    $ kubectl get svc --v=9I0110 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
  10. 更新叢集安全群組,以將來源 IP 位址或 CIDR 範圍新增至您的允許清單。這可讓 kubectl 用戶端從叢集 VPC 內部連線到 Amazon EKS API 伺服器端點。

相關資訊

對 Amazon EKS 叢集與節點的問題進行疑難排解

如何解決連線到 Amazon EKS API 伺服器時,出現的 錯誤?"You must be logged in to the server (Unauthorized)"

Amazon EKS 工作節點叢集網路解密

如何鎖定對 Amazon EKS 叢集中特定 IP 位址的 API 存取權?