Google Kubernetes Engine 節點池不會從 0 個節點自動擴縮
我正在嘗試在 GKE 上執行機器學習作業,並且需要使用 GPU。
如本演練中所述,我使用 Tesla K80 創建了一個節點池。
我將最小節點大小設置為 0,並希望自動縮放器會根據我的作業自動確定我需要多少個節點:
gcloud container node-pools create [POOL_NAME] \ --accelerator type=nvidia-tesla-k80,count=1 --zone [COMPUTE_ZONE] \ --cluster [CLUSTER_NAME] --num-nodes 3 --min-nodes 0 --max-nodes 5 \ --enable-autoscaling
最初,沒有需要 GPU 的作業,因此集群自動縮放器正確地將節點池縮小到 0。
但是,當我使用以下規範創建作業時
resources: requests: nvidia.com/gpu: "1" limits: nvidia.com/gpu: "1"
這是完整的作業配置。(請注意,此配置部分是自動生成的。我還刪除了一些與問題無關的環境變數)。
Insufficient nvidia.com/gpu
在我手動將節點池增加到至少 1 個節點之前,該 pod 一直處於掛起狀態。這是 GPU 節點池的目前限制,還是我忽略了什麼?
Autoscaler 支持擴展 GPU 節點池(包括從 0 到 0)。
此問題的一個可能原因是您啟用了節點自動配置並設置了資源限制(通過 UI 或 gcloud 標誌,例如 –max-cpu、max-memory 等)。這些限制適用於集群中的所有自動縮放,包括您手動創建的啟用自動縮放的節點池(請參閱文件中的註釋:https ://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning#資源限制)。
特別是如果您啟用了 NAP 並且想要使用 GPU 自動擴展節點池,您需要按照 https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-中的描述為 GPU 設置資源限制供應#gpu_limits。
最後,自動配置還支持 GPU,因此(假設您如上所述設置了資源限制)您實際上不需要為 GPU 工作負載創建節點池 - NAP 會自動為您創建一個。
===
此外,為了將來參考 - 如果自動縮放器無法為您的某些 pod 創建節點,您可以嘗試使用自動縮放器事件對其進行調試:
在您的 pod (
kubectl describe pod <your-pod>
) 上應該有 2 個事件之一(可能需要一分鐘才能顯示):
- TriggeredScaleUp - 這意味著自動縮放器決定為此 pod 添加一個節點。
- NotTriggerScaleUp - 自動縮放器發現了您的 pod,但它認為無法擴展任何節點池來幫助它。在 1.12 及更高版本中,該事件包含了為什麼將節點添加到不同的節點池對 pod 沒有幫助的原因列表。這通常是調試最有用的事件。
kubectl get events -n kube-system | grep cluster-autoscaler
將為您提供描述所有自動縮放器操作(放大、縮小)的事件。如果嘗試擴大規模,但無論出於何種原因失敗,它也會有描述該情況的事件。請注意,事件在創建後僅在 Kubernetes 中可用 1 小時。您可以通過轉到 UI 並導航至 Stackdriver->Logging->Logs 並在下拉菜單中選擇“GKE Cluster Operations”來查看 Stackdriver 中的歷史事件。
最後,您可以通過執行來檢查自動縮放器的目前狀態
kubectl get configmap cluster-autoscaler-status -o yaml -n kube-system
。