如何對 Amazon EKS 叢集和節點群組的 eksctl 問題進行疑難排解?

上次更新日期︰2022 年 1 月 6 日

我在使用 eksctl 建立或更新 Amazon Elastic Kubernetes Service (Amazon EKS) 時,遇到了問題。

簡短描述

以下是您在使用 eksctl 建立或管理 Amazon EKS 叢集或節點群組時可能遇到的常見問題:

  • 您不知道如何使用 eksctl 建立叢集。請參閲開始使用 Amazon EKS – 建立 Amazon EKS 叢集的 eksctl 和 eksctl 部分
  • 您不知道如何為受管節點群組指定 kubelet 自舉選項。遵循指定 kubelet 自舉選項解決方案部分中的步驟操作。
  • 您不知道如何變更現有節點群組的執行個體類型。您必須建立新的節點群組。請參閲遷移至新的節點群組Nodegroup 不可變性 (來自 eskctl 網站)。
  • 您已達到 AWS 資源的數目上限。請檢查您的資源,以查看是否可以刪除未使用的資源。如果您仍然需要更多容量,則請參閲請求增加配額
  • 您可以在容量有限的可用區域中啟動控制平面執行個體。請參閱如何解決 Amazon EKS 中的叢集建立錯誤?
  • 節點無法移動至就緒狀態。遵循解決操作逾時問題解決方案部分中的步驟操作。
  • 叢集的匯出值不存在。遵循在私有子網路中建立節點群組解決方案部分中的步驟操作。
  • 您使用了不受支援的執行個體類型來建立叢集或節點群組。請遵循檢查您的執行個體類型是否受支援解決方案部分中的步驟操作。

解決方案

指定 kubelet 自舉選項

依預設,eksctl 會建立自舉指令碼,並將其新增至工作節點在自舉期間執行的啟動範本。若要指定您自己的 kubelet 自舉選項,請使用 overrideBootstrapCommand 規範來覆寫 eksctl 自舉指令碼。針對受管和自我管理節點群組,請使用 overrideBootstrapCommand

組態檔案規範:

managedNodeGroups:
  name: custom-ng
  ami: ami-0e124de4755b2734d
  securityGroups:
    attachIDs: ["sg-1234"]
  maxPodsPerNode: 80
  ssh:
    allow: true
  volumeSize: 100
  volumeName: /dev/xvda
  volumeEncrypted: true
  disableIMDSv1: true
  overrideBootstrapCommand: |#!/bin/bash/etc/eks/bootstrap.sh managed-cluster --kubelet-extra-args '--node-labels=eks.amazonaws.com/nodegroup=custom-ng,eks.amazonaws.com/nodegroup-image=ami-0e124de4755b2734d'

注意:只有在使用自訂 AMI 時,才能使用 overrideBootstrapCommand。如果您未指定 AMI ID,則叢集會建立失敗。

未指定自訂 AMI ID

如果您在建立受管節點群組時未指定自訂 AMI ID,則 EKS 預設會使用 Amazon EKS 最佳化的 AMI 和自舉指令碼。若要使用 Amazon EKS 最佳化的 AMI,同時使用自訂使用者資料來指定自舉參數,您可以在受管節點群組組態中指定 AMI ID。

若要取得最新 Amazon EKS 最佳化 AMI 的最新 AMI ID,請執行以下命令:

aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.21/amazon-linux-2/recommended/image_id --region Region --query "Parameter.Value" --output text

注意:用您的 AWS 區域取代 Region

解決操作逾時問題

您正在建立節點並收到以下錯誤:

waiting for at least 1 node(s) to become ready in "nodegroup"

您在使用 eksctl 建立 EKS 節點群組時,eksctl CLI 會連線至 API 伺服器,以持續檢查 Kubernetes 節點狀態。CLI 會等待節點移至就緒狀態,如果節點無法移動,則最終會逾時。

以下是節點無法移至就緒狀態的原因:

  • 在自舉程序中,kubelet 無法與 EKS API 伺服器端點通訊或進行身分驗證。
  • aws-nodekube-proxy Pod 未處於執行中狀態。
  • Amazon Elastic Compute Cloud (Amazon EC2) 工作節點使用者資料未成功執行。

kubelet 無法與 EKS API 伺服器端點通訊

如果 kubelet 在自舉程序中無法與 EKS API 伺服器端點通訊,則取得 EKS API 伺服器端點。

在工作節點上執行以下命令:

curl -k https://123456DC0A12EC12DE0C12BC312FCC1A.yl4.us-east-1.eks.amazonaws.com
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {
    
  },
  "code": 403
}

前述命令應傳回 HTTP 403 狀態碼。如果命令逾時,則 EKS API 伺服器與工作節點之間可能存在網路連線問題。

若要解決連線問題,請完成與您的使用案例相關的以下步驟之一:

  • 如果工作節點位於私有子網路中,則檢查 EKS API 伺服器端點是否處於私有,或者公有和私有存取模式。
  • 如果 EKS API 伺服器端點設定為私有,則必須為私有託管區域套用某些規則,才會將流量路由至 API 伺服器。Amazon Virtual Private Cloud (Amazon VPC) 屬性 enableDnsHostnamesenableDnsSupport 必須設定為 True。此外,針對 Amazon VPC 設定的 DHCP 選項必須在其網域清單中包含 AmazonProvideDNS
  • 如果在公有子網路中建立了節點群組,請確定將子網路的 IPv4 公有尋址屬性設定為 True。如果未將屬性設定為 True,則不會為工作節點指派公有 IP 地址,也無法存取網際網路。
  • 檢查 Amazon EKS 叢集安全群組是否允許從工作節點安全群組傳送至連接埠 443 的輸入請求。

kubelet 無法透過 EKS API 伺服器端點進行身分驗證

如果 kubelet 在自舉程序期間無法透過 EKS API 伺服器端點進行身分驗證,則請完成以下步驟。

1.    執行以下命令以驗證工作節點是否擁有 STS 端點的存取權:

telnet sts.region.amazonaws.com 443

注意:用您的 AWS 區域取代 region

2.    請確定工作節點的 IAM 角色已新增至 aws-auth ConfigMap。

例如:

apiVersion:v1 kind:ConfigMap metadata:name:aws-auth namespace:kube-system data:mapRoles:|
    - rolearn: ARN of instance role (not instance profile)
      username: system:node:{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

注意:針對 Microsoft Windows 節點群組,您必須將額外的 eks:kube-proxy-windows RBAC 群組新增至節點群組 IAM 角色的 mapRoles 部分。

aws-node and kube-proxy Pod 未處於執行中狀態

若要檢查 aws-nodekube-proxy Pod 是否處於執行中狀態,請執行以下命令:

kubectl get pods -n kube-system

如果 aws-node Pod 處於失敗狀態,則請檢查工作節點與 Amazon EC2 端點之間的連線:

ec2.region.amazonaws.com

注意:用您的 AWS 區域取代 region

檢查 AWS 受管政策 AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnly 是否連接至節點群組的 IAM 角色。

如果節點處於私有子網路中,則必須將 Amazon ECR VPC 端點設定為允許從 Amazon Elastic Container Registry (Amazon ECR) 中提取映像。

如果您將 IRSA 與 Amazon VPC CNI 搭配使用,則將 AmazonEKS_CNI_Policy AWS 受管政策連接至 aws-node Pod 使用的 IAM 角色。您還必須將政策連接至沒有 IRSA 之節點群組的 IAM 角色。

EC2 工作節點使用者資料未成功執行

若要檢查執行使用者資料時是否出現錯誤,請檢閱 /var/log/cloud-init.log/var/log/cloud-init-output.log 的 cloud-init 日誌。

若要收集更多資訊,請在工作節點上執行 EKS Logs Collector 指令碼

在私有子網路中建立節點群組

您正在建立節點群組並收到以下錯誤:

No export named eksctl--cluster::SubnetsPublic found. Rollback requested by user

如果您使用 PrivateOnly 聯網建立了 Amazon EKS 叢集,則 AWS CloudFormation 無法建立公有子網路。這意味着公有子網路不存在匯出值。如果叢集不存在匯出值,則節點群組建立會失敗。

若要解決此問題,您可以在使用 eksctl 內嵌命令時包含 --node-private-networking 標誌。您還可以使用節點群組組態中的 privateNetworking: true 規範,請求在私有子網路中建立節點群組。

更新您的 eksctl 版本或指定正確的 AWS 區域

您會收到以下錯誤:

no eksctl-managed CloudFormation stacks found for "cluster-name"

如果您使用低於 0.40.0 的 eksctl 版本,則只能檢視或管理您使用 eksctl 建立的 Amazon EKS 資源。若要管理並非使用 eksctl 建立的資源,請將 eksctl 更新為 0.40.0 或更高版本。若要了解針對並非使用 eksctl 建立之叢集可以執行的命令,請參閲非 eksctl-created 叢集 (來自 eksctl 網站)。

此外,如果指定了不正確的 AWS 區域,則找不到 eksctl-managed CloudFormation 堆疊。若要解決此問題,請確定已指定您的 Amazon EKS 資源所在的正確區域。

請檢查您的執行個體類型是否受支援

如果您使用不受支援的執行個體類型來建立叢集或節點,則會收到以下錯誤:

You must use a valid fully-formed launch template. The requested configuration is currently not supported. Please check the documentation for supported configurations'

若要檢查特定 AWS 區域是否支援您的執行個體類型或其他組態,請執行以下命令:

aws ec2 describe-instance-type-offerings --region Region --query 'InstanceTypeOfferings[*].{InstanceType:InstanceType}'

注意:用您的 AWS 區域取代 Region


此文章是否有幫助?


您是否需要帳單或技術支援?