クラスターでスマートホスティングモードを有効にすると、マネージドノードプールを使用して GPU リソースを動的にスケーリングできます。これにより、オンライン推論など、トラフィックが変動する GPU ワークロードのコストを大幅に削減できます。
適用範囲
ノードオペレーティングシステムは ContainerOS 3.6 以降です。ContainerOS のバージョンをアップグレードするには、「オペレーティングシステムの変更」をご参照ください。
ステップ 1: GPU インスタンスタイプを持つマネージドノードプールを作成する
GPU ワークロード用に別のノードプールを作成します。GPU リソースを必要とするワークロードを送信すると、システムはリソース要件に基づいて GPU ノードを自動的に作成します。ノードがアイドル状態でスケールイン条件を満たすと、システムはノードを自動的に解放します。これにより、使用したリソースに対してのみ課金されるようになります。
[ノードプールの作成] をクリックし、パラメーターを設定します。
主要なパラメーターを以下に示します。パラメーターの詳細については、「ノードプールの作成」をご参照ください。
設定項目
説明
ホスティング設定
[スマートホスティング] を選択します。
VSwitch
ノードプールがスケーリングされると、[スケーリングポリシー] に基づいて、選択した vSwitch のゾーンでノードがスケールインまたはスケールアウトされます。高可用性を実現するには、異なるゾーンにある 2 つ以上の vSwitch を選択します。
インスタンス関連の設定
[インスタンス設定方法] を [インスタンスタイプの指定] に設定します。
アーキテクチャ: Elastic GPU Service。
インスタンスタイプ: 必要に応じて、ecs.gn7i-c8g1.2xlarge (NVIDIA A10) などの適切な インスタンスファミリー を選択します。スケールアウトの成功率を高めるには、複数のインスタンスタイプを選択します。
Taints
非 GPU ワークロードがより高価な GPU ノードにスケジューリングされるのを防ぐために、論理的な隔離のために Taint を使用します。
キー: nvidia.com/gpu
値: true
効果: NoSchedule
ステップ 2: GPU ワークロードのリソースリクエストと Taint の Toleration を設定する
アプリケーションをノードプールにスケジューリングし、GPU ノードの自動作成をトリガーできるようにするには、YAML 設定で GPU リソース要件とノードの Taint に対する Toleration を指定する必要があります。
GPU リソースリクエストの設定: コンテナーの
resourcesフィールドに必要な GPU リソースを指定します。# ... spec: containers: - name: gpu-automode resources: limits: nvidia.com/gpu: 1 # 1 つの GPU カードリソースをリクエスト # ...Taint の Toleration の設定:
tolerationsフィールドを追加して、ノードプールの Taint と一致させます。これにより、Pod をこれらの Taint を持つノードにスケジューリングできます。# ... spec: tolerations: - key: "nvidia.com/gpu" # ノードプールに設定された Taint のキーと一致させる operator: "Equal" value: "true" # ノードプールに設定された Taint の値と一致させる effect: "NoSchedule" # ノードプールに設定された Taint の効果と一致させる # ...
ステップ 3: GPU ワークロードをデプロイし、弾性スケーリングを検証する
このセクションでは、Stable Diffusion Web UI アプリケーションを例として使用し、デプロイプロセスを実証し、弾性スケーリングを検証します。
ワークロードを作成してデプロイします。
自動ノードスケールアウトを検証します。
デプロイ後、利用可能な GPU リソースがないため、Pod は
Pending状態になります。Pod のステータスを確認します。
kubectl get pod -l app=stable-diffusionPod のイベントを確認します。
kubectl describe pod -l app=stable-diffusionEventsセクションでは、最初にFailedSchedulingイベントが表示され、その後にProvisionNodeイベントが表示されます。これは、スケールアウトがトリガーされたことを示します。...... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 15m default-scheduler 0/3 ノードが利用可能です: 1 ノードに許容されない Taint {node.kubernetes.io/not-ready: } があります, 2 CPU 不足, 2 メモリ不足, 2 nvidia.com/gpu 不足。プリエンプション: 0/3 ノードが利用可能です: 3 プリエンプションはスケジューリングに役立ちません。 Normal ProvisionNode 16m GOATScaler ゾーン cn-beijing-k にインスタンスタイプ ecs.gn7i-c8g1.2xlarge でノード asa-2ze2h0f4m5ctpd8kn4f1 をプロビジョニング、トリガー時刻 2025-11-19 02:58:01.096 Normal AllocIPSucceed 12m terway-daemon IP 10.XX.XX.141/16 の割り当てに 4.764400743s かかりました Normal Pulling 12m kubelet イメージ "yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:v1.0.0-gpu" をプルしています Normal Pulled 3m48s kubelet イメージ "yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:v1.0.0-gpu" のプルに成功しました (8m47.675s、待機時間を含む)。イメージサイズ: 11421866941 バイト。 Normal Created 3m42s kubelet コンテナーを作成しました: stable-diffusion Normal Started 3m24s kubelet コンテナー stable-diffusion を開始しましたPod が実行されているノードの名前を取得します。
# Pod が実行されているノードの名前を NODE_NAME 変数に保存します NODE_NAME=$(kubectl get pod -l app=stable-diffusion -o jsonpath='{.items[0].spec.nodeName}') # ノード名を出力します echo "Stable Diffusion is running on node: $NODE_NAME" # ノードの詳細を表示して、Ready 状態であることを確認します kubectl get node $NODE_NAME
Stable Diffusion へのアクセス。
新しいノードがクラスターに参加し、Pod が開始されるまで数分待ちます。その後、インターネット経由でアプリケーションにアクセスできます。次のコマンドを実行して、サービスのパブリック IP アドレス (
EXTERNAL-IP) を取得します。kubectl get svc stable-diffusion-svc出力で
EXTERNAL-IPを見つけます。NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE stable-diffusion-svc LoadBalancer 192.XXX.XX.196 8.XXX.XX.68 7860:31302/TCP 18mブラウザで
http://<EXTERNAL-IP>:7860に移動します。Stable Diffusion Web UI ページが正常に読み込まれた場合、ワークロードは GPU ノードで実行されています。
自動ノードスケールインの検証 (手動トリガー)。
自動スケールイン機能を検証するには、デプロイメントを手動で削除してノードをアイドル状態にします。作成したデプロイメントとサービスを削除します。
# デプロイメントを削除 kubectl delete deployment stable-diffusion # サービスを削除 kubectl delete service stable-diffusion-svcノードのスケールインを監視します。
ノードスケーリングコンポーネントは、スケールイントリガー遅延に達した後、コストを節約するためにクラスターからノードを自動的に削除します。スマートホスティングモードでのデフォルトの遅延は 3 分です。以前に取得したノード名を使用して、ノードを再度クエリします。
kubectl get node $NODE_NAME期待される出力は、ノードが見つからないことを示します。これにより、ノードが期待どおりに自動的にスケールインされ、解放されたことが確認されます。
サーバーからのエラー (NotFound): ノード "<nodeName>" が見つかりません