如何疑難排解 Amazon EKS 受管節點群組建立失敗的問題?

3 分的閱讀內容
0

我的 Amazon Elastic Kubernetes Service (Amazon EKS) 受管節點群組無法建立。節點無法加入叢集,且我收到類似下列內容的錯誤訊息: "Instances failed to join the kubernetes cluster".(執行個體無法加入 Kubernetes 叢集。)

簡短說明

要解決 Amazon EKS 受管節點群組建立失敗的問題,請依照下列步驟執行:

  • 使用 AWS Systems Manager Automation 執行手冊以識別常見問題。
  • 確認工作節點安全群組流量需求。
  • 驗證工作節點 Identity and Access Management (IAM) 權限。
  • 確認叢集的 Amazon Virtual Private Cloud (Amazon VPC) 支援 DNS 主機名稱和解析。
  • 使用工作節點的 NodeInstanceRole 更新 aws-auth ConfigMap。
  • 設定工作節點的標籤。
  • 確認工作節點的 Amazon VPC 子網路有可用的 IP 地址。
  • 確認工作節點可以連線到叢集的 API 伺服器端點。
  • 確認 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Registry (Amazon ECR) 和 Amazon Simple Storage Service (Amazon S3) API 端點可以連線到您的 AWS 區域。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,確定您使用的是最新版本的 AWS CLI

使用系統管理員自動化執行手冊以識別常見問題

使用 AWSSupport-TroubleshootEKSWorkerNode 執行手冊以尋找導致工作節點無法加入叢集的常見問題。

**重要事項:**要自動化運作,您的工作節點必須有存取系統管理員的權限,並且系統管理員正常執行。要授予權限,請將 AmazonSSMManagedInstanceCore AWS 受管政策附加到與您的 EC2 執行個體設定檔對應的 IAM 角色。這是透過 eksctl 建立之 EKS 受管節點群組的預設組態。

  1. 開啟執行手冊
  2. 檢查 AWS 管理主控台中的 AWS 區域是否設定為與叢集相同的區域。
    注意:檢閱執行手冊的文件詳細資訊區段,以取得有關執行手冊的詳細資訊。
  3. 輸入參數區段,在 ClusterName欄位指定叢集的名稱,並在 WorkerID 欄位指定執行個體 ID。
  4. (選用) 在 AutomationAssumeRole 欄位,指定 IAM 角色,以允許系統管理員執行動作。如果未指定,則會使用目前 IAM 實體的 IAM 權限,執行執行手冊中的動作。
  5. 選擇 Execute(執行)。
  6. 檢查輸出區段,了解為什麼您的工作節點未加入您的叢集,以及您可以解決問題的步驟。

確認工作節點安全群組流量需求

確認控制平面的安全性群組和工作節點安全群組已設定輸入和輸出流量的建議設定。預設情況下,Amazon EKS 會將叢集安全群組套用至節點群組的執行個體,以加速節點與控制平面間的通訊。如果您在受管節點群組的啟動範本中指定自訂安全群組,Amazon EKS 不會新增叢集安全群組。

驗證工作節點 IAM 權限

確定與工作節點相關的 IAM 執行個體角色已附加 AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnly 政策。

**注意:**您必須將 Amazon 受管政策AmazonEKS_CNI_Policy 附加到 IAM 角色。您可以附加到節點執行個體角色。不過,最佳實務是將政策附加至與e kube-system 命名空間中 aws-node Kubernetes 服務帳戶相關的角色。如需詳細資訊,請參閱為設定 Kubernetes 的 Amazon VPC CNI 外掛程式以將 IAM 角色用於服務帳戶

確認叢集的 Amazon VPC 支援 DNS 主機名稱和解析

設定 EKS 叢集端點的私有權限後,您必須為 Amazon VPC 開啟 DNS 主機名稱和 DNS 解析。您啟動端點私有權限時,Amazon EKS 會為您建立 Amazon Route 53 私有託管區域。然後,Amazon EKS 將其與您的叢群的Amazon VPC 建立關聯。如需詳細資訊,請參閱 Amazon EKS 叢集端點存取控制

使用工作節點的 NodeInstanceRole 更新 aws-auth ConfigMap

驗證 aws-auth ConfigMap 是否正確設定工作節點的 IAM 角色,而不是執行個體設定檔。

設定工作節點的標籤

針對工作節點的標籤屬性,將索引鍵設定為 kubernetes.io/cluster/clusterName 並設定 已擁有

確認工作節點的 Amazon VPC 子網路有可用的 IP 地址

如果您的 Amazon VPC IP 地址不足,您可以建立次要 CIDR 與現有的 Amazon VPC 的關聯。如需詳細資訊,請參閱 Amazon EKS VPC 和子網路需求和考量事項

確認您的 Amazon EKS 工作節點可以連線到您叢集的 API 伺服器端點

如果有透過下列閘道的網際網路路由,您可以在叢集 VPC 或對等子網路內的任何子網路,啟動工作節點:

  • NAT
  • 網際網路
  • 中轉

如果您的工作節點是在受限的私人網路中啟動,確認您的工作節點可以連線到 Amazon EKS API 伺服器端點。如需詳細資訊,請參閱需求以在無輸出網際網路權限的私有叢集中執行 Amazon EKS。

注意: 針對位於由 NAT 閘道支援的私有子網路的節點,最佳實務是在公有子網路中建立 NAT 閘道。

如果您沒有使用 AWS PrivateLink 端點,透過代理伺服器驗證下列 AWS 服務的 API 端點存取權限:

  • Amazon EC2
  • Amazon ECR
  • Amazon S3

要驗證工作節點是否有 API 伺服器的權限,使用 SSH 連線至工作節點,然後執行下列 netcat 命令:

nc -vz 9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com 443

**注意:使用您的 API 伺服器端點,取代 ** 9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com

檢查 kubelet 日誌,同時仍然連接到您的執行個體:

journalctl -f -u kubelet

如果 kubelet 日誌未提供問題來源的相關資訊,則檢查工作節點的 kubelet 狀態:

sudo systemctl status kubelet

收集 Amazon EKS 日誌和作業系統日誌,以進一步進行疑難排解。

確認 Amazon EC2、Amazon ECR 和 Amazon S3 API 端點可以連線到您的 AWS 區域

使用 SSH 以連線至其中一個工作節點,然後針對每個服務執行下列命令:

$ nc -vz ec2.region.amazonaws.com 443
$ nc -vz ecr.region.amazonaws.com 443
$ nc -vz s3.region.amazonaws.com 443

注意:使用工作者節點的 AWS 區域,取代區域

設定工作節點的使用者資料

針對有指定 AMI 的受管節點群組啟動範本,您必須為工作節點提供啟動程序命令,才能加入叢集。Amazon EKS 不會將預設啟動程序命令合併到您的使用者資料中。如需詳細資訊,請參閱在 Amazon EKS 託管節點群組中導入啟動範本和自訂 AMI 支援指定 AMI

帶啟動程序命令的範例啟動範本:

#!/bin/bash
set -o xtrace
/etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}

**注意:**使用 Amazon EKS 叢集的名稱,取代 ${ClusterName}。如果需要,使用其他啟動程序值,取代 ${BootstrapArguments}

相關資訊

疑難排解 Amazon EKS

如何讓我的工作節點加入我的 Amazon EKS 叢集?