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

上次更新日期︰2022 年 11 月 21 日

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

簡短描述

在以下一些常見案例中,Pod 在使用 AWS Fargate 的 Amazon Elastic Kubernetes Service (Amazon EKS) 上陷入待處理狀態:

  • 由於特定 vCPU/記憶體組合不可用,因此存在容量錯誤。
  • CoreDNS Pod 是使用預設註釋建立的,該注釋會將這些 Pod 映射至 Amazon Elastic Compute Cloud (Amazon EC2) 運算類型。必須移除 EC2 才能在 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:

解決方案

重要提示:以下步驟僅適用於使用 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

這表示 Fargate 無法根據您選取的 vCPU/記憶體組合來佈建運算容量。

若要解決此錯誤:

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

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

如果 CoreDNS Pod 處於待處理狀態:

kubectl get pods -n kube-system<br>NAME                                     READY   STATUS     RESTARTS      AGE
coredns-6548845887-qk9vf                 0/1     Pending    0             157m

這可能是因為 CoreDNS 部署具有以下預設註釋:eks.amazonaws.com/compute-type : ec2

若要解決此問題並將 Pod 重新指派給 Fargate 排程器,請參閱更新 CoreDNS

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

指派給遠端排程器的 Pod 可能會停留在待處理狀態的原因有多種,從 Pod 註釋的設定錯誤到網路問題。如果您的 Pod 仍處於待處理狀態,則 describe 輸出類似下列內容:

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 輸入。此外還必須為您的叢集開啟私有端點存取

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

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

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

在輸出中,確認 schedulerNamedefault-scheduler。如果它列為 default-scheduler,則遠端排程器會略過此 Pod。若要進行疑難排解,請檢查您的 Pod 組態是否有運算類型註釋,並參閱 AWS Fargate 考量事項


此文章是否有幫助?


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