すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:GPU ワークロードのデプロイと実行

最終更新日:Nov 21, 2025

クラスターでスマートホスティングモードを有効にすると、マネージドノードプールを使用して GPU リソースを動的にスケーリングできます。これにより、オンライン推論など、トラフィックが変動する GPU ワークロードのコストを大幅に削減できます。

適用範囲

ステップ 1: GPU インスタンスタイプを持つマネージドノードプールを作成する

GPU ワークロード用に別のノードプールを作成します。GPU リソースを必要とするワークロードを送信すると、システムはリソース要件に基づいて GPU ノードを自動的に作成します。ノードがアイドル状態でスケールイン条件を満たすと、システムはノードを自動的に解放します。これにより、使用したリソースに対してのみ課金されるようになります。

  1. [ノードプールの作成] をクリックし、パラメーターを設定します。

    主要なパラメーターを以下に示します。パラメーターの詳細については、「ノードプールの作成」をご参照ください。

    設定項目

    説明

    ホスティング設定

    [スマートホスティング] を選択します。

    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 アプリケーションを例として使用し、デプロイプロセスを実証し、弾性スケーリングを検証します。

  1. ワークロードを作成してデプロイします。

    例を展開して表示

    1. stable-diffusion.yaml という名前のファイルを作成します。

      この YAML ファイルには 2 つの部分が含まれています:

      • Deployment: Stable Diffusion ワークロードを定義します。Pod は 1 つの NVIDIA GPU をリクエストし、対応する Taint の Toleration で設定されます。

      • Service: LoadBalancer サービスを作成して、パブリック IP アドレスを介してワークロードを公開し、リクエストをコンテナーのポート 7860 に転送します。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: stable-diffusion
        name: stable-diffusion
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: stable-diffusion
        template:
          metadata:
            labels:
              app: stable-diffusion
          spec:
            containers:
            - args:
              - --listen
              command:
              - python3
              - launch.py
              image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:v1.0.0-gpu
              imagePullPolicy: IfNotPresent
              name: stable-diffusion
              ports:
              - containerPort: 7860
                protocol: TCP
              readinessProbe:
                tcpSocket:
                  port: 7860
              resources:
                limits:
                  # 1 つの GPU カードリソースをリクエスト
                  nvidia.com/gpu: 1
                requests:
                  cpu: "6"
                  memory: 12Gi  
            # Pod が対応するノードプールにスケジューリングされるように Taint の Toleration を宣言する
            tolerations:
            - key: "nvidia.com/gpu"
              operator: "Equal"
              value: "true"
              effect: "NoSchedule"   
      ---
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          # LoadBalancer のエンドポイントがパブリック IP アドレスであることを指定する
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: PayByCLCU
        name: stable-diffusion-svc
        namespace: default
      spec:
        externalTrafficPolicy: Local
        ports:
        - port: 7860
          protocol: TCP
          targetPort: 7860
         # app=stable-diffusion ラベルを持つ Pod と関連付ける
        selector:
          app: stable-diffusion
         # LoadBalancer サービスを作成する
        type: LoadBalancer
    2. ワークロードをデプロイします。

      kubectl apply -f stable-diffusion.yaml
  2. 自動ノードスケールアウトを検証します。

    デプロイ後、利用可能な GPU リソースがないため、Pod は Pending 状態になります。

    1. Pod のステータスを確認します。

      kubectl get pod -l app=stable-diffusion
    2. Pod のイベントを確認します。

      kubectl describe pod -l app=stable-diffusion

      Events セクションでは、最初に 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 を開始しました
    3. 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
  3. Stable Diffusion へのアクセス。
    新しいノードがクラスターに参加し、Pod が開始されるまで数分待ちます。その後、インターネット経由でアプリケーションにアクセスできます。

    1. 次のコマンドを実行して、サービスのパブリック 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
    2. ブラウザで http://<EXTERNAL-IP>:7860 に移動します。

      Stable Diffusion Web UI ページが正常に読み込まれた場合、ワークロードは GPU ノードで実行されています。

  4. 自動ノードスケールインの検証 (手動トリガー)。
    自動スケールイン機能を検証するには、デプロイメントを手動で削除してノードをアイドル状態にします。

    1. 作成したデプロイメントとサービスを削除します。

      # デプロイメントを削除
      kubectl delete deployment stable-diffusion
      
      # サービスを削除
      kubectl delete service stable-diffusion-svc
    2. ノードのスケールインを監視します。

      ノードスケーリングコンポーネントは、スケールイントリガー遅延に達した後、コストを節約するためにクラスターからノードを自動的に削除します。スマートホスティングモードでのデフォルトの遅延は 3 分です。以前に取得したノード名を使用して、ノードを再度クエリします。

      kubectl get node $NODE_NAME

      期待される出力は、ノードが見つからないことを示します。これにより、ノードが期待どおりに自動的にスケールインされ、解放されたことが確認されます。

      サーバーからのエラー (NotFound): ノード "<nodeName>" が見つかりません