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

3 分的閱讀內容
0

我的工作節點未加入我的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集。我想對此問題進行疑難排解。

解決方法

若要將工作節點加入 Amazon EKS 叢集,請完成下列步驟。

**重要事項:**下列步驟不包含在不符合下列條件的環境中註冊工作節點所需的組態:

使用 Systems Manager 自動化執行手冊以找出常見問題

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

**重要事項:**為了確保自動化正確運作,AWS Systems Manager 必須為執行中,且您的工作節點必須具有存取 Systems Manager 的許可。若要授予 AWS Systems Manager 的存取許可,請將 AmazonSSMManagedInstanceCore 政策連接至 AWS Identity and Access Management (IAM) 角色。此 IAM 角色對應至您的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體設定檔。此組態也是您透過 eksctl 建立之 Amazon EKS 受管節點群組的預設值。

請為叢集名稱使用下列格式:[-a-zA-Z0-9]{1,100}$

完成下列步驟:

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

確認您有適用於您 Amazon VPC 的 DNS 支援

確認 EKS 叢集的 Amazon VPC 已開啟 DNS 主機名稱DNS 解析

要檢查這些屬性並開啟,完成下列步驟:

  1. 開啟 Amazon VPC 主控台
  2. 在導覽窗格,選擇您的 VPC
  3. 選取您要編輯的 VPC。
  4. 詳細資料索引標籤下,檢查 DNS 主機名稱和 DNS 解析是否已開啟。
  5. 如果這兩個屬性未開啟,選取啟用
  6. 選擇儲存變更

如需詳細資訊,請參閱 View and update DNS attributes for your VPC

確認執行個體設定檔的工作節點有正確的權限

將下列 AWS 受管政策附加至與執行個體設定檔工作節點相關的角色:

  • AmazonEKSWorkerNodePolicy
  • AmazonEKS_CNI_Policy
  • AmazonEC2ContainerRegistryReadOnly

要將政策附加至角色,請參閱新增 IAM 身分權限 (主控台)

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

**注意:**如果您使用 AWS CloudFormation 啟動工作節點,則不必為工作節點設定使用者資料。而是要遵循 AWS 管理主控台的啟動自我管理 Amazon Linux 節點指示。

如果您使用受管節點群組來啟動工作節點,則不必透過 Amazon EKS 最佳化 Amazon Linux AMI 設定使用者資料。只有您使用自訂 AMI 透過受管節點群組以啟動工作節點時,才須設定使用者資料。

如果您搭配自訂啟動範本使用 Amazon 受管節點群組,請在啟動範本中指定正確的使用者資料。如果 Amazon EKS 叢集是使用 VPC 端點建立連線的完全私有叢集,請在使用者資料指定以下內容:

  • certificate-authority
  • api-server-endpoint
  • DNS 叢集 IP 位址

如有必要,提供使用者資料,以將引數傳遞至 Amazon EKS 最佳化 Linux/Bottlerocket AMI 隨附的 bootstrap.sh 檔案

要為工作節點設定使用者資料,啟動 Amazon EC2 執行個體時指定使用者資料

例如,如果您使用第三方工具,例如 Terraform,更新使用者欄位以啟動 EKS 工作節點:

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

重要事項:

  • 使用您的 EKS 叢集名稱,取代 ${ClusterName}
  • 使用其他啟動程序值,取代 ${BootstrapArguments},或將此屬性保留空白。

確認您 Amazon VPC 子網路的網路連線已經正確設定

  • 如果您使用網際網路閘道,請確定閘道正確連接至路由表,不會重新導向至 null 路由。
  • 如果您使用 NAT 閘道,請確定在公用子網路中正確設定閘道。此外,請確認路由表不包含 null 路由。
  • 如果您將 VPC 私人端點用於完全私人叢集,請確定您有下列端點:
    com.amazonaws.region.ec2 (介面端點)
    com.amazonaws.region.ecr.api (介面端點)
    com.amazonaws.region.ecr.dkr (介面端點)
    com.amazonaws.region.s3 (閘道端點)
    com.amazonaws.region.sts (介面端點)
  • 您使用服務帳戶的 IAM 角色設定的 Pod,會從 AWS Security Token Service (AWS STS) API 呼叫取得憑證。如果沒有輸出網際網路存取權限,則您必須在 VPC 建立並使用 AWS STS VPC 端點。
  • VPC 端點的安全群組必須有輸入規則,允許來自連接埠 443 的流量。如需詳細資訊,請參閱 Control traffic to your AWS resources using security groups
  • 確定連接至 VPC 端點的政策有必要的許可。

**注意:**如果您使用任何其他 AWS 服務,則必須建立這些端點。若要查看一些常用的服務和端點,請參閱 Deploy private clusters with limited internet access。另外,您可以根據您的使用案例,建立端點服務

確認您的工作節點與 EKS 叢集位於相同的 Amazon VPC

完成下列步驟:

  1. 開啟 Amazon EKS 主控台
  2. 選擇叢集,然後選取您的叢集。
  3. 網路區段,識別與叢集相關的子網路。

**注意:**您可以設定不同的子網路以在其中啟動工作節點。子網路必須位於相同的 Amazon VPC,並適當標記。Amazon EKS 只會針對您在叢集建立期間設定的子網路,自動管理標籤。因此,確認您已適當標記子網路。

如需詳細資訊,請參閱子網路需求與考量事項

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

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

若要檢查 aws-auth ConfigMap 檔案,請執行下列命令:

kubectl describe configmap -n kube-system aws-auth

如果 aws-auth ConfigMap 未正確設定,則會顯示下列錯誤訊息:

571 reflector.go:153] k8s.io/kubernetes/pkg/kubelet/kubelet.go:458 : Failed to list *v1.Node: Unauthorized

符合工作節點的安全群組需求

確認控制平面的安全群組和工作節點安全群組已設定為輸入和輸出流量的最佳實務的設定。此外,確認您的自訂網路 ACL 規則已設定為允許進出0.0.0.0/0 的流量,來自連接埠 804431025-65535

設定工作節點的標籤

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

如需詳細資訊,請參閱 VPC 需求與考量事項

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

確認您可以在與路由表相關聯的子網路中啟動工作節點。路由表必須透過 NAT 或網際網路閘道,路由至 API 端點。

如果您在受限的私人網路啟動工作節點,請確認您的工作節點可以連線至 EKS API 伺服器端點。

如果您透過使用自訂 DNS 而非 AmazonProvidedDNS 的 Amazon VPC 來啟動工作節點,則節點可能無法解析端點。停用端點的公開存取,且僅啟動私人存取時,會發生未解析的端點。如需詳細資訊,請參閱開啟 Amazon EKS 叢集端點的 DNS 解析

確認已正確設定您的叢集的叢集角色

您的叢集必須具備最低 AmazonEKSClusterPolicy 許可的叢集角色。此外,您叢集的信任關係必須允許 sts:AssumeRoleeks.amazonaws.com 服務,如以下範例所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

如需詳細資訊,請參閱 Amazon EKS cluster IAM role

確認已啟動區域性 STS 端點

如果叢集位於支援 STS 端點的區域,請啟動區域性 STS 端點以驗證 kubeletkubelet 便可建立節點物件。

確認 AMI 已設定為與 EKS 搭配使用,並且包含必要的元件

如果用於工作節點的 AMI 不是 Amazon EKS 最佳化 Amazon Linux AMI,請確認下列 Kubernetes 元件處於作用中狀態:

  • kubelet
  • AWS IAM Authenticator
  • Docker (Amazon EKS 版本 1.23 與更舊版本)
  • containerd

使用 SSH 連線至您的 EKS 工作節點執行個體,並檢查 kubelet 代理程式日誌

kubelet 代理程式會設定為 systemd 服務。

若要驗證您的 kubelet 日誌,請執行下列命令:

journalctl -f -u kubelet

若要解決問題,請參閱 Amazon EKS troubleshooting guide,瞭解常見錯誤。

使用 Amazon EKS 日誌收集程式指令碼,疑難排解錯誤

您可以使用日誌檔和作業系統日誌以疑難排解 Amazon EKS 的問題。

您必須使用 SSH 連線至有問題的工作節點,並執行下列指令碼:

curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh

sudo bash eks-log-collector.sh

相關資訊

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

AWS 官方
AWS 官方已更新 8 個月前