我在 AWS Fargate 執行個體上執行的 Amazon Elastic Kubernetes Service (Amazon EKS) Pod 會停滯於「擱置中」狀態。
簡短說明
使用 AWS Fargate 的 Amazon EKS Pod 可能會停滯於「擱置中」狀態有下列幾種原因:
- 因為無法使用特定的 vCPU 和記憶體組合,發生容量錯誤。
- 您已使用預設註釋建立 CoreDNS Pod,將其對應至 Amazon Elastic Compute Cloud (Amazon EC2) 運算類型。若要在 Fargate 節點上對其進行排程,請移除 Amazon EC2 運算類型。
- 您建立 Pod 並將其指派給 fargate-scheduler 時,Pod 未與任何 Fargate 設定檔相符。如果建立 Pod 時不相符,則不會自動重新排定至 Fargate 節點。即使您建立了稍後相符的設定檔,也是如此。在此情況下,系統會將 Pod 指派給 default-scheduler。
- 如果系統將 Pod 指派給 fargate-scheduler,但仍處於「擱置中」狀態,則 Pod 可能需要其他疑難排解。
解決方法
先決條件
- 設定名稱空間並 (選用項目) 指定 Kubernetes 標籤,以與 Pod 選取器的標籤相符。僅限兩項條件都符合 Pod 規格時,Fargate 工作流程才會將 Pod 與 Fargate 設定檔相符。
- 如果您在單一 Fargate 設定檔中指定多個 Pod 選取器,則 fargate-scheduler 會在與任何選取器相符時排定 Pod。
- 如果 Pod 規格與多個 Fargate 設定檔相符,則會根據隨機 Fargate 設定檔來排定 Pod。若要避免這種情況,您可以在 Pod 規格中使用註釋 eks.amazonaws.com/fargate-profile:fp_name。將 fp_name 取代為您的 Fargate 設定檔名稱。
重要事項: 下列步驟僅適用於使用 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 容量。請稍後重試,或在不同的可用區域中嘗試。」
此訊息指出 Fargate 無法根據您選取的 vCPU 和記憶體組合來佈建運算容量。
若要解決該錯誤,請完成下列步驟:
- 嘗試在 20 分鐘後再次建立 Pod。由於錯誤與容量問題相關,因此確切的時間量可能會有所差異。
- 變更 Pod 規格內的要求 (CPU 和記憶體)。如需 Pod 規格的相關資訊,請參閱 Kubernetes 網站上的「Kubernetes 如何套用資源要求和限制」。然後,Fargate 工作流程會佈建 vCPU 和記憶體的新組合。
**注意事項:**根據您的其中一種組合對您收取費用。如需如何根據您的 Pod 規格完成組合的詳細資訊,請參閱「Pod CPU 和記憶體」。從終端機或整合式開發環境 (IDE) 執行 kubectl describe node 命令,以取得更高的 vCPU 和記憶體組合值。Fargate 並非一律根據您的要求提供可用容量。Fargate 會以最佳方式從容量集區佈建資源。您僅需支付 Pod 使用量以及等值的 vCPU 和記憶體組合的費用。
解決處於擱置中狀態的 CoreDNS Pod
如果 CoreDNS Pod 處於「擱置中」狀態,則您的輸出會類似於下列訊息:
kubectl get pods -n kube-system
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
指派給 fargate-scheduler 的 Pod 可能會停滯於「擱置中」狀態有多種原因。如果您的 Pod 仍處於「擱置中」狀態,則 describe 輸出會類似於下列訊息:
Events:
Type Reason Age From
---- ------ ---- ----
Warning FailedScheduling 2m25s (x301 over 5h3m) fargate-scheduler
若要解決該錯誤,請完成下列任務:
- 刪除並重新建立 Pod。
- 確認 Pod 規格 YAML 中未設定的下列規格。這些規格可能會導致 fargate-scheduler 略過 Pod:
節點選取器
<>節點名稱
schedulerName
- 確認在 Fargate 設定檔中選取的子網路有足夠的可用 IP 地址以建立新的 Pod。每個 Fargate 節點會耗用子網路的一個 IP 地址。
- 確認 NAT 閘道已設為公有子網路,並且已連接彈性 IP 地址。
- 確認與您的虛擬私有雲端 (VPC) 相關聯的 DHCP 選項集的 domain-name-servers有 AmazonProvidedDNS 或有效的 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.
在輸出中,確認 schedulerName 是 fargate-scheduler。如果列為 default-scheduler,則 fargate-scheduler 會略過此 Pod。若要疑難排解此問題,請檢查您的 Pod 組態是否有運算類型註釋。如需詳細資訊,請參閱 AWS Fargate 考量事項。