web-dev-qa-db-ja.com

Google Kubernetes Engineノードプールが0ノードから自動スケーリングしない

GKEで機械学習ジョブを実行しようとしていますが、GPUを使用する必要があります。

this walkthrough で説明されているように、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つのノードに増やすまで。

これはGPUノードプールの現在の制限ですか、それとも何か見落としがありましたか?

4
notnami

オートスケーラーは、GPUノードプールのスケーリングをサポートしています(0を含む)。

この問題の考えられる理由の1つは、Node Auto-Provisioningを有効にし、リソース制限を設定した場合(UIまたは--max-cpu、max-memoryなどのgcloudフラグを介して)である場合)です。制限は、自動スケーリングを有効にして手動で作成したノードプールを含む、クラスター内のすべての自動スケーリングに適用されます(ドキュメントのメモを参照: https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto -provisioning#resource_limits )。

特に、NAPを有効にしていて、GPUでノードプールを自動スケーリングする場合は、 https://cloud.google.com/kubernetesで説明されているように、GPUのリソース制限を設定する必要があります。 -engine/docs/how-to/node-auto-provisioning#gpu_limits

最後に、自動プロビジョニングはGPUもサポートしているため、(上記のようにリソース制限を設定した場合)実際にGPUワークロード用のノードプールを作成する必要はありません-NAPによって自動的に作成されます。

===

また、将来の参考のために、オートスケーラーが一部のポッドのノードの作成に失敗した場合は、オートスケーラーイベントを使用してそれをデバッグすることができます。

  • ポッド(kubectl describe pod <your-pod>)には、2つのイベントのいずれかが表示されます(表示されるまでに1分かかる場合があります):
    • TriggeredScaleUp-これは、オートスケーラーがこのポッドにノードを追加することを決定したことを意味します。
    • NotTriggerScaleUp-オートスケーラーがポッドを検出しましたが、ノードプールを拡大してそれを支援できるとは考えていません。 1.12以降のイベントには、ノードを別のノードプールに追加してもポッドが役に立たない理由のリストが含まれています。これは通常、デバッグに最も役立つイベントです。
  • 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を実行して、オートスケーラーの現在のステータスを確認できます。

4
Maciek Pytel