如何解決 AWS Fargate 上的 Amazon EKS Pod 陷入「待處理」狀態問題?

上次更新日期:2021 年 12 月 20 日

在 AWS Fargate 執行個體上執行的 Amazon Elastic Kubernetes Service (Amazon EKS) Pod 陷入「待處理」狀態。如何讓這些 Pod 執行?

簡短描述

以下是一些常見的案例,可以使用 AWS Fargate 阻止在 Amazon Elastic Kubernetes Service (Amazon EKS) 上執行。

  • 由於特定 vCPU/記憶體組合不可用,因此存在容量錯誤。
  • CoreDNS Pod 建立時包含預設註釋,必須移除才能在 Fargate 節點上對其排程。
  • 該 Pod 在建立時與任何 Fargate 描述檔均不相符,並且未指派給 fargate-scheduler。如果 Pod 在建立時不相符,則不會自動將其重新排程至 Fargate 節點,即使稍後會建立相符的描述檔。在這種情況下,該 Pod 將指派給 default-scheduler。
  • 如果該 Pod 已指派給 fargate-scheduler,但仍處於待處理狀態,則可能需要進行其他疑難排解。

在進行疑難排解之前,請注意 Fargate 以下 Pod 規則:

  • 您必須為 Pod 選擇器設定命名空間和比對標籤。Fargate 工作流程僅在兩個條件都與 Pod 規範相符時,才會使 Pod 與 Fargate 相符。
  • 在單一 Fargate 描述檔內指定多個 Pod 選擇器的情況下,如果 Pod 與任何選擇器相符,則該 Pod 將依據 fargate-schedule 排程。
  • 如果 Pod 規範與多個 Fargate 描述檔相符,則會根據隨機 Fargate 描述檔排程該 Pod。為了避免此情況,您可以在 Pod 規範內使用註釋 eks.amazonaws.com/fargate-profile:<fp_name>

解決方案

重要提示:以下步驟僅適用於使用 AWS Fargate 啟動的 Pod。如需有關在 Amazon EC2 執行個體上啟動 Pod 的資訊,請參閲如何對 Amazon EKS 中的 Pod 狀態進行疑難排解?

了解您的 Pod 狀態

1.    執行以下命令來檢查您的 Pod 狀態

kubectl get pods -n <namespace>

2.    若要取得有關 Pod 的更多錯誤資訊,請執行以下 describe 命令:

kubectl describe pod YOUR_POD_NAME -n <namespace>

根據 describe 命令的輸出,請參閲以下解決方案。

解決容量錯誤

如果您的 Pod 存在容量問題,則 describe 輸出類似於以下內容:

Fargate capacity is unavailable at this time. Please try again later or in a different availability zone

若要解決此錯誤:

  • 在 15-20 分鐘後重試 Pod。由於錯誤以容量為基礎,所以確切的時長可能會有所差異。
  • 變更 Pod 規範內的請求 (CPU/ 記憶體)。vCPU/記憶體的新組合則透過 Fargate 工作流程佈建。
    注意:依據您的其中一個組合計費。請參閲 Pod CPU 和記憶體,了解有關如何根據您的 Pod 規範最終確定組合的詳細資訊。從終端/IDE 執行「kubectl 描述節點」命令,可為您提供更高的 vCPU/記憶體組合值。Fargate 並不總是根據您的請求擁有可用的容量,並且會盡可能從容量集區中佈建資源。但是,僅針對 Pod 用量和等效的 vCPU/記憶體組合計費。

解決處於待處理狀態的 CoreDNS Pod 問題

如果您的 Pod 為 CoreDNS Pod,則描述輸出中 Pod 的名稱類似於以下內容:

NAME                                     READY   STATUS     RESTARTS      AGE
coredns-6548845887-qk9vf                 0/1     Pending    0             157m

若要解決此問題並將 Pod 重新指派給 Fargate 排程器:修補 CoreDNS 部署,以移除下列預設註釋︰eks.amazonaws.com/compute-type : ec2

解決指派給 default-scheduler 的 Pod 問題

若要確定為您的 Pod 指派的排程器,請執行以下命令:

kubectl get pods -o yaml -n <namespace> <pod-name> | grep schedulerName.

在輸出中,確認 schedulerNamedefault-scheduler,更新 Pod 規範,然後重新建立 Pod。

如果 schedulerNamefargate-scheduler,但仍然出現錯誤,請確認您的 Pod 遵循所有規則和 Fargate 考量。如需更多疑難排解步驟,請參閲以下部分。

對指派給 fargate-scheduler 的 Pod 問題進行疑難排解

如果您的 Pod 已指派給 fargate-scheduler,但仍處於待處理狀態,則描述輸出類似於以下內容:

Events:
Type       Reason              Age                     From     
----       ------              ----                    ----     
Warning    FailedScheduling    2m25s (x301 over 5h3m)  fargate-scheduler

對此錯誤進行疑難排解︰

  • 刪除並重新建立 Pod。
  • 確認未在 Pod 規範 YAML 中設定以下內容:
    節點選取器
    <>節點名稱
    schedulerName
    這些規範會導致 fargate-scheduler 略過該 Pod。
  • 確認在 Fargate 描述檔中選取的子網路擁有足夠的可用 IP 地址來建立新的 Pod。每個 Fargate 節點從子網路中取用一個 IP 地址。
  • 確認 NAT 閘道已設定為公有子網路,並向其連接彈性 IP。
  • 確認與您的 VPC 關聯的 DHCP 選項集擁有 AmazonProvidedDNS 或 domain-name-servers 的有效 DNS 伺服器主機名稱。
  • 確認您的 VPC 的 DNS 主機名稱和 DNS 解析已開啟
  • 如果您正在為 Fargate Pod 使用私有子網路,且僅針對服務通訊設定 VPC 端點,則請確認您擁有允許使用 DNS 名稱的下列端點:
    ECR - API
    ECR - DKR
    S3 閘道端點
  • 確認連接至 VPC 端點的安全群組允許從 Fargate 與 API 伺服器進行通訊。VPC 端點安全群組必須允許叢集 VPC CIDR 的連接埠 443 輸入。此外還必須為您的叢集開啟私有端點存取

此文章是否有幫助?


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