全部产品
Search
文档中心

Container Service for Kubernetes:Implementasikan penskalaan workload berdasarkan pengontrol UnitedDeployment

更新时间:Dec 20, 2025

Resource kustom UnitedDeployment menyederhanakan pengelolaan beberapa workload homogen dengan mengelompokkannya ke dalam unit fleksibel yang disebut Subsets. Misalnya, ketika sebuah aplikasi perlu diterapkan di beberapa zona ketersediaan, Anda dapat mendefinisikan Subset untuk Deployment di setiap zona. UnitedDeployment kemudian mengelola pembaruan dan penerapan detail halus untuk setiap Subset, sehingga menghilangkan kebutuhan untuk mengonfigurasi dan memelihara file YAML Deployment secara terpisah secara manual.

Selain itu, Anda dapat menggunakan UnitedDeployment bersama Horizontal Pod Autoscaler (HPA) untuk mencapai penskalaan terurut di kluster yang menggunakan campuran sumber daya komputasi. Hal ini memungkinkan Pod diperluas kapasitasnya dalam urutan tertentu (misalnya dari termurah ke termahal) dan diskalakan-masuk dalam urutan terbalik, sehingga secara signifikan mengoptimalkan biaya sumber daya.

Lihat dokumentasi resmi Kruise UnitedDeployment untuk detail selengkapnya. Topik ini menjelaskan cara mengonfigurasi pengontrol UnitedDeployment menggunakan file YAML untuk memenuhi kebutuhan dalam berbagai skenario.

Jenis workload yang didukung

Pengontrol UnitedDeployment hanya mendukung jenis workload berikut: StatefulSet, Advanced StatefulSet, CloneSet, dan Deployment. Untuk informasi lebih lanjut, lihat Gunakan OpenKruise untuk menerapkan aplikasi cloud-native.

Prasyarat

Skenario 1: Gunakan pengontrol UnitedDeployment bersama HPA

Jika kluster Anda berisi beberapa jenis sumber daya, konfigurasikan subset dalam file YAML UnitedDeployment untuk memilih satu jenis sumber daya. Anda juga dapat menambahkan bidang maxReplicas untuk menentukan cara penjadwalan Pod setelah jumlah Pod mencapai batas atas. Saat Anda menggunakan HPA untuk menerapkan horizontal pod autoscaling pada UnitedDeployment, Pod diskalakan berdasarkan prioritas sumber daya yang ditentukan. Saat mengonfigurasi HPA, atur bidang scaleTargetRef HPA ke UnitedDeployment dan nama UnitedDeployment tersebut.

Penting

Diperlukan OpenKruise 1.5.0. Untuk informasi lebih lanjut mengenai catatan rilis OpenKruise, lihat OpenKruise.

image

Dalam contoh ini, terdapat dua kelompok node di kluster. Kelompok Node A terdiri dari instans ECS langganan, sedangkan Kelompok Node B terdiri dari instans preemptible. Konfigurasikan sistem agar menjadwalkan Pod ke berbagai jenis node sesuai urutan prioritas berikut: instans ECS langganan > instans spot > ECI. Ketika node jenis tertentu kehabisan stok, sistem akan menggunakan node dengan prioritas lebih rendah untuk penjadwalan Pod.

  1. Buat file bernama test.yaml dan salin konten berikut ke dalam file tersebut.

    File test.yaml digunakan untuk mengatur UnitedDeployment. Parameter template dalam file tersebut mendefinisikan konfigurasi Deployment. File ini juga mendefinisikan tiga subset.

    • Pod subset-a diterapkan pada instans ECS langganan di Kelompok Node A. Pod subset-b diterapkan pada instans preemptible di Kelompok Node B. Jumlah replika adalah 1 baik pada subset-a maupun subset-b.

    • subset-c dikonfigurasi dengan parameter nodeSelectorTerm dan tolerations, yang digunakan untuk memilih ECI. Dalam kasus ini, Pod subset-c diterapkan pada ECI. Jumlah replika pada subset-c adalah 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****   # Ganti nilai ini dengan ID Kelompok Node A. 
          replicas: 1
        - name: subset-b
          nodeSelectorTerm:
            matchExpressions:
            - key: alibabacloud.com/nodepool-id
              operator: In
              values:
              - np011de1f2de3d48bd8a92a015fc5c****  # Ganti nilai ini dengan ID Kelompok Node B. 
          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. Jalankan perintah berikut untuk menerapkan UnitedDeployment:

    kubectl apply -f test.yaml

    Output yang diharapkan:

    uniteddeployment.apps.kruise.io/ud-nginx created
  3. Jalankan perintah berikut untuk memeriksa apakah Pod telah dibuat:

    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>

    Output tersebut menunjukkan bahwa Pod diterapkan pada subset berbeda sesuai konfigurasi UnitedDeployment.

Skenario 2: Terapkan aplikasi lintas zona

Untuk meningkatkan ketersediaan aplikasi, biasanya Anda perlu menerapkan sumber daya komputasi atau penyimpanan di beberapa zona. Anda dapat menambahkan label berbeda ke node di zona berbeda. Kemudian, konfigurasikan pemilih label dalam konfigurasi subset pada file YAML UnitedDeployment. Dengan cara ini, UnitedDeployment menjadwalkan Pod dari subset berbeda ke zona berbeda yang memiliki label yang sesuai.

image
  1. Terdapat tiga node di zona berbeda. Jalankan perintah berikut untuk menambahkan label ke setiap node guna menunjukkan zona tempat node tersebut berada.

    Misalnya, label node=zone-a ditambahkan ke node di Zona A, label node=zone-b ditambahkan ke node di Zona B, dan label node=zone-c ditambahkan ke node di Zona C.

    kubectl label node cn-beijing.10.XX.XX.131 node=zone-a
    node/cn-beijing.10.80.20.131 labeled # Tambahkan label node=zone-a ke node 10.XX.XX.131. 
    kubectl label node cn-beijing.10.XX.XX.132 node=zone-b
    node/cn-beijing.10.80.20.132 labeled  # Tambahkan label node=zone-b ke node 10.XX.XX.132. 
    kubectl label node cn-beijing.10.XX.XX.133 node=zone-c
    node/cn-beijing.10.80.20.133 labeled  # Tambahkan label node=zone-c ke node 10.XX.XX.133.
  2. Buat file bernama test.yaml dan salin konten berikut ke dalam file tersebut.

    File test.yaml digunakan untuk mengatur UnitedDeployment. Parameter template dalam file tersebut mendefinisikan konfigurasi StatefulSet. File ini juga mendefinisikan satu subset untuk setiap zona.

    • Bidang statefulSetTemplate mendefinisikan templat StatefulSet. UnitedDeployment membuat StatefulSet pada setiap subset berdasarkan templat tersebut.

    • Bagian subsets mendefinisikan satu subset untuk setiap zona. Pod subset-a diterapkan pada node yang memiliki label node=zone-a. Pod subset-b diterapkan pada node yang memiliki label node=zone-b. Pod subset-c diterapkan pada node yang memiliki label 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. Jalankan perintah berikut untuk menerapkan UnitedDeployment:

    kubectl apply -f test.yaml

    Output yang diharapkan:

    uniteddeployment.apps.kruise.io/sample-ud created
  4. Jalankan perintah berikut untuk memeriksa apakah Pod dan StatefulSet telah dibuat:

    kubectl get pod
    # Output yang diharapkan:
    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
    # Output yang diharapkan:
    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

    Output tersebut menunjukkan bahwa Pod dan StatefulSet telah dibuat serta berjalan pada node di Zona A, Zona B, dan Zona C.

Skenario 3: Gunakan pengontrol UnitedDeployment untuk menempatkan aplikasi secara bersamaan pada instans ECS dan ECI

Untuk menangani lonjakan bisnis, Anda mungkin perlu memastikan ketersediaan sumber daya node kluster sekaligus mengendalikan biaya. Untuk mengatasi masalah ini, Anda dapat memprioritaskan instans ECS untuk penjadwalan Pod dan mengonfigurasi Container Service for Kubernetes (ACK) agar secara otomatis menerapkan aplikasi pada ECI ketika instans ECS kehabisan stok. Saat Pod diskalakan-masuk, ACK akan terlebih dahulu menghapus Pod yang berjalan di ECI.

image

Pada contoh berikut, UnitedDeployment dibuat untuk menunjukkan cara penjadwalan replika. Ketika jumlah replika tidak melebihi 4, replika tersebut dijadwalkan ke instans ECS. Ketika jumlah replika berada di antara 4 hingga 10, Pod tambahan dijadwalkan ke ECI.

  1. Buat file bernama test.yaml dan salin konten berikut ke dalam file tersebut.

    • Bidang deploymentTemplate mendefinisikan templat Deployment. UnitedDeployment membuat Deployment pada setiap subset berdasarkan templat tersebut.

    • Bagian subsets mendefinisikan dua subset. Pod pada subset pertama dijadwalkan ke instans ECS. Replika pada subset kedua dijadwalkan ke ECI. Subset pertama mendukung hingga empat replika. Ketika jumlah replika yang disediakan oleh UnitedDeployment tidak melebihi 4, replika tersebut dijadwalkan ke instans ECS. Ketika jumlah replika berada di antara 4 hingga 10, Pod tambahan dijadwalkan ke ECI.

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: ud-nginx
    spec:
      replicas: 6
      selector:
        matchLabels:
          app: sample
      template:
      # statefulSetTemplate atau advancedStatefulSetTemplate atau cloneSetTemplate atau 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  # Ganti nilai ini dengan nama UnitedDeployment. 
      minReplicas: 4
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
  2. Jalankan perintah berikut untuk menerapkan UnitedDeployment:

    kubectl apply -f test.yaml

    Output yang diharapkan:

    horizontalpodautoscaler.autoscaling/united-deployment-hpa created
  3. Jalankan perintah berikut untuk menanyakan status Pod:

    kubectl get pod -o wide
    # Output yang diharapkan:
    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>

    Output tersebut menunjukkan bahwa replika Deployment dijadwalkan secara dinamis berdasarkan kebijakan penjadwalan yang ditentukan oleh UnitedDeployment. Empat replika pertama dijadwalkan ke instans ECS. Dua replika sisanya dijadwalkan ke ECI.

  4. Picu HPA untuk melakukan aktivitas skala-masuk, lalu jalankan perintah berikut untuk menanyakan status 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>

    Output tersebut menunjukkan bahwa jumlah replika diskalakan-masuk dari 6 menjadi 4. Pod pada ECI dihapus terlebih dahulu.

Referensi

  • Untuk informasi lebih lanjut tentang cara menambahkan node di beberapa zona selama aktivitas skala keluar, lihat Implementasikan penskalaan cepat lintas beberapa zona.

  • Untuk mengaktifkan penskalaan otomatis node saat kapasitas sumber daya kluster tidak memenuhi kebutuhan penjadwalan Pod, kami merekomendasikan Anda merujuk ke solusi node scaling yang disediakan oleh ACK. Untuk informasi lebih lanjut, lihat Node scaling.