Kubernetes

Google Kubernetes Engine 節點池不會從 0 個節點自動擴縮

  • April 18, 2019

我正在嘗試在 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

引用自:https://serverfault.com/questions/962259