Google Kubernetes Engine 节点池不会从 0 个节点自动扩缩

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 节点池的当前限制,还是我忽略了什么?

答案1

Autoscaler 支持扩展 GPU 节点池(包括从 0 开始扩展)。

出现此问题的一个可能原因是您启用了节点自动配置并设置了资源限制(通过 UI 或 gcloud 标志,例如 --max-cpu、max-memory 等)。这些限制适用于集群中的所有自动扩缩,包括您在启用自动扩缩的情况下手动创建的节点池(请参阅文档中的注释:https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning#resource_limits)。

特别是如果你启用了 NAP 并且想要使用 GPU 自动扩展节点池,你需要设置 GPU 的资源限制,如中所述 https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning#gpu_limits

最后,自动配置还支持 GPU,因此(假设您按照上面所述设置资源限制)您实际上不需要为您的 GPU 工作负载创建节点池 - NAP 会自动为您创建一个。

===

此外,以供将来参考 - 如果自动缩放器无法为某些 pod 创建节点,您可以尝试使用自动缩放器事件进行调试:

  • 在你的 pod ( kubectl describe pod <your-pod>) 上应该有以下两个事件之一(可能需要一分钟才能显示出来):
    • TriggeredScaleUp——这意味着自动扩缩器决定为该 pod 添加一个节点。
    • NotTriggerScaleUp - 自动缩放器发现了您的 Pod,但它认为没有任何节点池可以扩展来帮助它。在 1.12 及更高版本中,该事件包含将节点添加到不同节点池不会帮助 Pod 的原因列表。这通常是调试最有用的事件。
  • kubectl get events -n kube-system | grep cluster-autoscaler将为您提供描述所有自动缩放器操作(扩大、缩小)的事件。如果尝试扩大规模,但因某种原因失败,它也将有描述该情况的事件。

请注意,事件在创建后 1 小时内仅在 Kubernetes 中可用。您可以转到 UI 并导航至 Stackdriver->Logging->Logs 并在下拉菜单中选择“GKE Cluster Operations”,查看 Stackdriver 中的历史事件。

最后,您可以通过运行来检查自动缩放器的当前状态kubectl get configmap cluster-autoscaler-status -o yaml -n kube-system

相关内容