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

Container Service for Kubernetes:UnitedDeployment コントローラーによるワークロードのスケーリング

最終更新日:Dec 20, 2025

UnitedDeployment カスタムリソースは、複数の同種のワークロードを Subsets と呼ばれる柔軟なユニットにグループ化することで、管理を簡素化します。例えば、アプリケーションを複数のアベイラビリティゾーンにデプロイする必要がある場合、各ゾーンの Deployment に対して Subset を定義できます。UnitedDeployment は、各 Subset の詳細な更新とデプロイメントを管理するため、個別の Deployment YAML ファイルを手動で設定・維持する必要がなくなります。

さらに、UnitedDeployment を Horizontal Pod Autoscaler (HPA) と組み合わせることで、複数のコンピューティングリソースを使用するクラスターで順序付きスケーリングを実現できます。これにより、Pod を特定の順序 (例えば、最も安価なリソースから最も高価なリソースへ) でスケールアップし、その逆の順序でスケールダウンすることが可能になり、リソースコストを大幅に最適化できます。

詳細については、Kruise の公式ドキュメント「UnitedDeployment」をご参照ください。本トピックでは、さまざまなシナリオの要件を満たすために、YAML ファイルを使用して UnitedDeployment コントローラーを設定する方法について説明します。

サポートされているワークロードタイプ

UnitedDeployment コントローラーは、StatefulSet、Advanced StatefulSet、CloneSet、Deployment のワークロードタイプのみをサポートします。詳細については、「OpenKruise を使用したクラウドネイティブアプリケーションのデプロイ」をご参照ください。

前提条件

シナリオ 1:UnitedDeployment コントローラーと HPA の併用

ご利用のクラスターに複数のリソースタイプが含まれている場合、UnitedDeployment の YAML ファイルでサブセットを設定し、リソースタイプを選択します。また、maxReplicas フィールドを追加して、Pod 数が上限に達した後の Pod のスケジュール方法を指定することもできます。HPA を使用して UnitedDeployment の水平ポッド自動スケーリングを実装すると、Pod は指定されたリソースの優先度に基づいてスケーリングされます。HPA を設定する際、HPA の scaleTargetRef フィールドを UnitedDeployment とその UnitedDeployment の名前に設定します。

重要

OpenKruise 1.5.0 が必要です。OpenKruise のリリースノートの詳細については、「OpenKruise」をご参照ください。

image

この例では、クラスター内に 2 つのノードプールが存在します。ノードプール A はサブスクリプション ECS インスタンスで構成され、ノードプール B はスポットインスタンスで構成されています。システムが、サブスクリプション ECS インスタンス > スポットインスタンス > ECI の優先順位で、異なるタイプのノードに Pod をスケジュールするように設定します。あるタイプのリソースが不足した場合、システムはより低い優先度のノードを Pod のスケジューリングに使用します。

  1. test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    test.yaml ファイルは、UnitedDeployment をオーケストレーションするために使用されます。ファイル内の template パラメーターは、Deployment の設定を定義します。このファイルでは、3 つのサブセットも定義されています。

    • subset-a の Pod はノードプール A のサブスクリプション ECS インスタンスにデプロイされ、subset-b の Pod はノードプール B のスポットインスタンスにデプロイされます。subset-a と subset-b の両方でレプリカ数は 1 です。

    • subset-c には、ECI を選択するための nodeSelectorTerm および tolerations パラメーターが設定されています。この場合、subset-c の Pod は ECI にデプロイされます。subset-c のレプリカ数は 3 です。

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: ud-nginx
    spec:
      replicas: 6
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: ud-nginx
      template:
        deploymentTemplate:
          metadata:
            labels:
              app: ud-nginx
          spec:
            selector:
              matchLabels:
                app: ud-nginx
            template:
              metadata:
                labels:
                  app: ud-nginx
              spec:
                containers:
                - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
                  name: nginx
      topology:
        subsets:
        - name: subset-a
          nodeSelectorTerm:
            matchExpressions:
            - key: alibabacloud.com/nodepool-id
              operator: In
              values:
              - np92019eec42004d878fcdc990fcb9****   # 値をノードプール A の ID に置き換えます。
          replicas: 1
        - name: subset-b
          nodeSelectorTerm:
            matchExpressions:
            - key: alibabacloud.com/nodepool-id
              operator: In
              values:
              - np011de1f2de3d48bd8a92a015fc5c****  # 値をノードプール B の ID に置き換えます。
          replicas: 1
        - name: subset-c
          nodeSelectorTerm:
            matchExpressions:
            - key: type
              operator: In
              values:
              - virtual-kubelet
          tolerations:
          - key: virtual-kubelet.io/provider
            operator: Exists
          replicas: 3
      updateStrategy:
        manualUpdate:
          partitions:
            subset-a: 0
            subset-b: 0
            subset-c: 0
        type: Manual
  2. 次のコマンドを実行して UnitedDeployment をデプロイします。

    kubectl apply -f test.yaml

    想定される出力:

    uniteddeployment.apps.kruise.io/ud-nginx created
  3. 次のコマンドを実行して、Pod が作成されたかどうかを確認します。

    kubectl get pod -o wide
    NAME                                       READY   STATUS    RESTARTS   AGE   IP               NODE                            NOMINATED NODE   READINESS GATES
    ud-nginx-subset-a-7lbtd-5b5bd77549-5bw6l   1/1     Running   0          73s   192.XX.XX.126    cn-hangzhou.10.XX.XX.131       <none>           <none>
    ud-nginx-subset-b-nvvfw-5c9bcd6766-lv6sp   1/1     Running   0          73s   192.XX.XX.239    cn-hangzhou.10.XX.XX.132      <none>           <none>
    ud-nginx-subset-c-m78fd-7796b66fd8-7p52j   1/1     Running   0          73s   192.XX.XX.130    virtual-kubelet-cn-hangzhou-h   <none>           <none>
    ud-nginx-subset-c-m78fd-7796b66fd8-fd7f7   1/1     Running   0          73s   192.XX.XX.129    virtual-kubelet-cn-hangzhou-h   <none>           <none>
    ud-nginx-subset-c-m78fd-7796b66fd8-mn4qb   1/1     Running   0          73s   192.XX.XX.131    virtual-kubelet-cn-hangzhou-h   <none>           <none>

    この出力は、Pod が UnitedDeployment の設定で定義されているように、異なるサブセットにデプロイされていることを示しています。

シナリオ 2:ゾーンをまたいだアプリケーションのデプロイ

アプリケーションの可用性を向上させるには、通常、コンピューティングリソースやストレージリソースを複数のゾーンにまたがってデプロイする必要があります。異なるゾーンのノードに異なるラベルを追加できます。次に、UnitedDeployment の YAML ファイルのサブセット設定でラベルセレクターを設定します。これにより、UnitedDeployment は、異なるサブセットの Pod を、一致するラベルを持つ異なるゾーンにスケジュールします。

image
  1. 3 つのノードが異なるゾーンに存在します。次のコマンドを実行して、各ノードにそのノードが存在するゾーンを示すラベルを追加します。

    例えば、ゾーン A のノードには node=zone-a ラベル、ゾーン B のノードには node=zone-b ラベル、ゾーン C のノードには node=zone-c ラベルが追加されます。

    kubectl label node cn-beijing.10.XX.XX.131 node=zone-a
    node/cn-beijing.10.80.20.131 labeled # ノード 10.XX.XX.131 に node=zone-a ラベルを追加します。
    kubectl label node cn-beijing.10.XX.XX.132 node=zone-b
    node/cn-beijing.10.80.20.132 labeled  # ノード 10.XX.XX.132 に node=zone-b ラベルを追加します。
    kubectl label node cn-beijing.10.XX.XX.133 node=zone-c
    node/cn-beijing.10.80.20.133 labeled  # ノード 10.XX.XX.133 に node=zone-c ラベルを追加します。
  2. test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    test.yaml ファイルは、UnitedDeployment をオーケストレーションするために使用されます。ファイル内の template パラメーターは、StatefulSet の設定を定義します。このファイルでは、ゾーンごとにサブセットも定義されています。

    • statefulSetTemplate フィールドは StatefulSet のテンプレートを定義します。UnitedDeployment は、このテンプレートに基づいて各サブセットに StatefulSet を作成します。

    • subsets セクションでは、各ゾーンのサブセットを定義します。subset-a のポッドは、ラベルが node=zone-a であるノードにデプロイされます。subset-b のポッドは、ラベルが node=zone-b であるノードにデプロイされます。subset-c のポッドは、ラベルが node=zone-c であるノードにデプロイされます。

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: sample-ud
    spec:
      replicas: 6
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: sample
      template:
        statefulSetTemplate:
          metadata:
            labels:
              app: sample
          spec:
            selector:
              matchLabels:
                app: sample
            template:
              metadata:
                labels:
                  app: sample
              spec:
                containers:
                - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
                  name: nginx
      topology:
        subsets:
        - name: subset-a
          nodeSelectorTerm:
            matchExpressions:
            - key: node
              operator: In
              values:
              - zone-a
          replicas: 1
        - name: subset-b
          nodeSelectorTerm:
            matchExpressions:
            - key: node
              operator: In
              values:
              - zone-b
          replicas: 50%
        - name: subset-c
          nodeSelectorTerm:
            matchExpressions:
            - key: node
              operator: In
              values:
              - zone-c
      updateStrategy:
        manualUpdate:
          partitions:
            subset-a: 0
            subset-b: 0
            subset-c: 0
        type: Manual
  3. 次のコマンドを実行して UnitedDeployment をデプロイします。

    kubectl apply -f test.yaml

    想定される出力:

    uniteddeployment.apps.kruise.io/sample-ud created
  4. 次のコマンドを実行して、Pod と StatefulSet が作成されたかどうかを確認します。

    kubectl get pod
    # 想定される出力:
    NAME                                     READY   STATUS    RESTARTS   AGE
    sample-ud-subset-a-cplwg-0               1/1     Running   0          6m5s
    sample-ud-subset-b-rj7kt-0               1/1     Running   0          6m4s
    sample-ud-subset-b-rj7kt-1               1/1     Running   0          5m49s
    sample-ud-subset-b-rj7kt-2               1/1     Running   0          5m43s
    sample-ud-subset-c-g6jvx-0               1/1     Running   0          6m5s
    sample-ud-subset-c-g6jvx-1               1/1     Running   0          5m51s
    
    kubectl get statefulset
    # 想定される出力:
    NAME                       READY   AGE
    sample-ud-subset-a-cplwg   1/1     7m34s
    sample-ud-subset-b-rj7kt   3/3     7m34s
    sample-ud-subset-c-g6jvx   2/2     7m34s

    この出力は、Pod と StatefulSet が作成され、ゾーン A、ゾーン B、ゾーン C のノードで実行されていることを示しています。

シナリオ 3:UnitedDeployment コントローラーを使用した ECS インスタンスと ECI でのアプリケーションのコロケーション

ビジネスの急増に対応するため、クラスターノードのリソース供給を確保しつつ、同時にコストを管理する必要がある場合があります。この問題に対処するために、Pod スケジューリングで ECS インスタンスを優先し、ECS インスタンスが不足したときに ACK が自動的に ECI にアプリケーションをデプロイするように設定できます。Pod がスケールインされると、ACK はまず ECI 上で実行されている Pod を削除します。

image

次の例では、レプリカがどのようにスケジュールされるかを示すために UnitedDeployment が作成されます。レプリカ数が 4 を超えない場合、レプリカは ECS インスタンスにスケジュールされます。レプリカ数が 4 から 10 の間の場合、超過した Pod は ECI にスケジュールされます。

  1. test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    • deploymentTemplate フィールドは Deployment のテンプレートを定義します。UnitedDeployment は、このテンプレートに基づいて各サブセットに Deployment を作成します。

    • subsets セクションでは 2 つのサブセットを定義します。最初のサブセットの Pod は ECS インスタンスにスケジュールされます。2 番目のサブセットのレプリカは ECI にスケジュールされます。最初のサブセットは最大 4 つのレプリカをサポートします。UnitedDeployment によってプロビジョニングされるレプリカ数が 4 を超えない場合、レプリカは ECS インスタンスにスケジュールされます。レプリカ数が 4 から 10 の間の場合、超過した Pod は ECI にスケジュールされます。

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: ud-nginx
    spec:
      replicas: 6
      selector:
        matchLabels:
          app: sample
      template:
      # statefulSetTemplate or advancedStatefulSetTemplate or cloneSetTemplate or deploymentTemplate
        deploymentTemplate:
          metadata:
            labels:
              app: sample
          spec:
            selector:
              matchLabels:
                app: sample
            template:
              metadata:
                labels:
                  app: sample
              spec:
                containers:
                - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
                  name: nginx
                  resources:
                    requests:
                      cpu: "500m"
      topology:
        subsets:
        - name: ecs
          maxReplicas: 4
        - name: eci
          maxReplicas: null
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: united-deployment-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps.kruise.io/v1alpha1
        kind: UnitedDeployment
        name: ud-nginx  # 値を UnitedDeployment の名前に置き換えます。
      minReplicas: 4
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
  2. 次のコマンドを実行して UnitedDeployment をデプロイします。

    kubectl apply -f test.yaml

    想定される出力:

    horizontalpodautoscaler.autoscaling/united-deployment-hpa created
  3. 次のコマンドを実行して、Pod のステータスをクエリします。

    kubectl get pod -o wide
    # 想定される出力:
    NAME                                  READY   STATUS    RESTARTS       AGE   IP               NODE                       NOMINATED NODE   READINESS GATES
    ud-nginx-eci-dxfbz-864bdb77b-2d4t9    1/1     Running   0             3m9s   192.XX.XX.129   cn-hangzhou.192.XX.XX.120   <none>           <none>
    ud-nginx-eci-dxfbz-864bdb77b-zppfh    1/1     Running   0             3m9s   192.XX.XX.11    cn-hangzhou.192.XX.XX.251   <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh   1/1     Running   0             3m9s   192.XX.XX.4     cn-hangzhou.192.XX.XX.251   <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz   1/1     Running   0             3m9s   192.XX.XX.145   cn-hangzhou.192.XX.XX.32    <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl   1/1     Running   0             3m9s   192.XX.XX.150   cn-hangzhou.192.XX.XX.20    <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc   1/1     Running   0             3m9s   192.XX.XX.128   cn-hangzhou.192.XX.XX.120   <none>           <none>

    出力は、Deployment のレプリカが UnitedDeployment によって定義されたスケジューリングポリシーに基づいて動的にスケジュールされていることを示しています。最初の 4 つのレプリカは ECS インスタンスにスケジュールされ、残りの 2 つのレプリカは ECI にスケジュールされます。

  4. HPA をトリガーしてスケールインアクティビティを実行し、次のコマンドを実行して Pod のステータスをクエリします。

    kubectl get pod -o wide
    NAME                                  READY   STATUS    RESTARTS       AGE    IP              NODE                        NOMINATED NODE   READINESS GATES
    ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh   1/1     Running   0             8m14s   192.168.8.4     cn-hangzhou.192.168.8.251   <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz   1/1     Running   0             8m14s   192.168.6.145   cn-hangzhou.192.168.6.32    <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl   1/1     Running   0             8m14s   192.168.6.150   cn-hangzhou.192.168.6.20    <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc   1/1     Running   0             8m14s   192.168.5.128   cn-hangzhou.192.168.5.120   <none>           <none>

    出力は、レプリカ数が 6 から 4 にスケールダウンされたことを示しています。ECI 上の Pod が優先的に削除されます。

関連ドキュメント

  • スケールアウト時に複数のゾーンにノードを追加する方法の詳細については、「複数のゾーンにまたがる迅速なスケーリングの実装」をご参照ください。

  • クラスターのリソース容量が Pod スケジューリングの要件を満たせない場合にノードの自動スケーリングを有効にするには、ACK が提供するノードスケーリングソリューションを参照することを推奨します。詳細については、「ノードスケーリング」をご参照ください。