全部产品
Search
文档中心

Container Service for Kubernetes:Implementasikan skalabilitas elastis cepat di beberapa zona

更新时间:Mar 01, 2026

Arsitektur ketersediaan tinggi mengandalkan distribusi beban kerja yang merata di beberapa zona. Topik ini menjelaskan cara menggunakan komponen ack-autoscaling-placeholder untuk mencapai skalabilitas elastis yang cepat dan sadar zona dalam kluster ACK, sehingga peristiwa skala keluar menambahkan node ke zona yang tepat secara bersamaan.

Prasyarat

Cara kerja

Permasalahan

Saat kelompok node dikonfigurasi dengan vSwitch dari beberapa zona dalam satu grup penskalaan, Cluster Autoscaler tidak dapat menentukan zona spesifik mana yang membutuhkan node baru. Akibatnya, instans yang diperluas kapasitasnya mungkin terkonsentrasi di satu zona alih-alih didistribusikan secara merata, sehingga menggagalkan tujuan penerapan multi-zona.

image

Solusi

ACK mengatasi permasalahan ini dengan komponen ack-autoscaling-placeholder, yang menggunakan redundansi sumber daya untuk mengubah penskalaan elastis multi-zona menjadi penskalaan terarah pada kelompok node konkuren. Untuk informasi selengkapnya, lihat Gunakan ack-autoscaling-placeholder untuk menskalakan pod dalam hitungan detik. Mekanisme ini bekerja dalam tiga tahap:

  1. Buat satu kelompok node per zona dengan label zona. Setiap kelompok node diberi label yang mengidentifikasi zona tempat kelompok tersebut berada.

  2. Terapkan pod placeholder menggunakan nodeSelector. Komponen ack-autoscaling-placeholder menjadwalkan satu pod placeholder ke setiap zona berdasarkan label zona tersebut. Pod placeholder ini menggunakan PriorityClass dengan bobot lebih rendah daripada pod aplikasi.

  3. Pod aplikasi menggantikan (preempt) pod placeholder. Saat pod aplikasi berada dalam status Pending, mereka menggantikan pod placeholder berprioritas lebih rendah pada node yang ada. Pod placeholder yang tergantikan kemudian menjadi Pending. Karena penjadwalan pod placeholder menggunakan nodeSelector (bukan antiAffinity), Cluster Autoscaler dapat mengidentifikasi zona pasti yang dibutuhkan oleh setiap pod placeholder yang tertunda dan memicu penskalaan terarah ke kelompok node yang sesuai secara konkuren.

Alur penskalaan

Gambar berikut menunjukkan cara kerja penskalaan simultan di dua zona dengan arsitektur ini.

image
  1. Komponen ack-autoscaling-placeholder membuat satu pod placeholder di setiap zona. Pod placeholder memiliki prioritas penjadwalan lebih rendah daripada pod aplikasi sesungguhnya.

  2. Saat pod aplikasi memasuki status Pending, mereka dengan cepat menggantikan pod placeholder dan diterapkan pada node yang ada di setiap zona. Pod placeholder yang tergantikan kemudian memasuki status Pending.

  3. Karena pod placeholder dijadwalkan menggunakan nodeSelector, Cluster Autoscaler dapat memperluas kapasitas ke zona yang sesuai secara konkuren.

Langkah 1: Buat kelompok node untuk setiap zona dan konfigurasikan label node kustom

  1. Masuk ke ACK console. Pada panel navigasi sebelah kiri, klik Clusters.

  2. Pada halaman Clusters, temukan kluster yang ingin Anda kelola lalu klik namanya. Di panel navigasi sebelah kiri, pilih Nodes > Node Pools.

  3. Klik Create Node Pool dan lengkapi konfigurasi kelompok node sesuai petunjuk. Contoh ini membuat kelompok node bernama auto-zone-I dengan autoscaling diaktifkan di Zona I. Tabel berikut hanya menjelaskan parameter utama. Untuk informasi selengkapnya, lihat Buat dan kelola kelompok node. Saat status kelompok node auto-zone-I menampilkan Active dalam daftar kelompok node, berarti kelompok node telah berhasil dibuat.

    ParameterDescription
    Node Pool Nameauto-zone-I
    Scaling ModePilih Auto untuk mengaktifkan autoscaling.
    vSwitchPilih vSwitch di Zona I.
    Node LabelsAtur Key label node menjadi available_zone dan Value-nya menjadi i.
  4. Ulangi langkah-langkah sebelumnya untuk membuat kelompok node dengan autoscaling diaktifkan untuk setiap zona yang memerlukan autoscaling.

    Node pools across multiple zones

Verifikasi: Di daftar kelompok node, pastikan setiap kelompok node spesifik zona memiliki status Active dan label zona diterapkan dengan benar.

Langkah 2: Terapkan ack-autoscaling-placeholder dan konfigurasikan Penyebaran placeholder

Terapkan komponen

  1. Di panel navigasi sebelah kiri Konsol ACK, pilih Marketplace > Marketplace.

  2. Temukan dan klik ack-autoscaling-placeholder. Di halaman ack-autoscaling-placeholder, klik Deploy.

  3. Pilih kluster dari daftar drop-down Cluster dan namespace dari daftar drop-down Namespace, lalu klik Next. Pilih versi chart dari daftar drop-down Chart Version, konfigurasikan parameters, lalu klik OK. Setelah komponen diterapkan, pilih Applications > Helm di panel navigasi sebelah kiri. Anda dapat memastikan bahwa aplikasi berada dalam status Deployed.

Perbarui rilis Helm dengan Penyebaran placeholder

  1. Di panel navigasi sebelah kiri halaman detail, pilih Applications > Helm.

  2. Pada halaman Helm, klik Update di kolom Actions untuk ack-autoscaling-placeholder-default.

  3. Di panel Update Release, perbarui file YAML berdasarkan contoh berikut, lalu klik OK. Terapkan satu placeholder untuk setiap zona dan definisikan satu Penyebaran placeholder untuk setiap zona. Contoh ini membuat Penyebaran placeholder di Zona I, K, dan H. Setiap entri dalam daftar deployments mengikuti struktur yang sama. Entri pertama di bawah ini diberi anotasi lengkap; entri berikutnya hanya berbeda pada nilai name dan nodeSelector. Tabel berikut merangkum bidang yang harus Anda ubah untuk setiap zona: Setelah pembaruan berhasil, Penyebaran placeholder dibuat untuk setiap zona.

    FieldZona IZona KZona H
    nameack-place-holder-Iack-place-holder-Kack-place-holder-H
    nodeSelector{"avaliable_zone":i}{"avaliable_zone":k}{"avaliable_zone":h}
       deployments:
       # --- Placeholder Zona I ---
       - affinity: {}
         annotations: {}
         containers:
         - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1
           imagePullPolicy: IfNotPresent
           name: placeholder
           resources:
             requests:
               cpu: 3500m     # Permintaan CPU untuk setiap pod placeholder.
               memory: 6      # Permintaan memori untuk setiap pod placeholder.
         imagePullSecrets: {}
         labels: {}
         name: ack-place-holder-I             # Nama Penyebaran. Gunakan akhiran unik untuk setiap zona.
         nodeSelector: {"avaliable_zone":i}   # Harus sesuai dengan kunci dan nilai label node dari Langkah 1.
         replicaCount: 10                     # Jumlah pod placeholder per zona.
         tolerations: []
    
       # --- Placeholder Zona K (struktur sama, zona berbeda) ---
       - affinity: {}
         annotations: {}
         containers:
         - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1
           imagePullPolicy: IfNotPresent
           name: placeholder
           resources:
             requests:
               cpu: 3500m
               memory: 6
         imagePullSecrets: {}
         labels: {}
         name: ack-place-holder-K
         nodeSelector: {"avaliable_zone":k}
         replicaCount: 10
         tolerations: []
    
       # --- Placeholder Zona H (struktur sama, zona berbeda) ---
       - affinity: {}
         annotations: {}
         containers:
         - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1
           imagePullPolicy: IfNotPresent
           name: placeholder
           resources:
             requests:
               cpu: 3500m
               memory: 6
         imagePullSecrets: {}
         labels: {}
         name: ack-place-holder-H
         nodeSelector: {"avaliable_zone":h}
         replicaCount: 10
         tolerations: []
    
       fullnameOverride: ""
       nameOverride: ""
       podSecurityContext: {}
       priorityClassDefault:
         enabled: true
         name: default-priority-class
         value: -1

    Placeholder Deployments created

Verifikasi: Pilih Applications > Helm dan pastikan ack-autoscaling-placeholder-default menampilkan status Deployed dengan konfigurasi yang telah diperbarui.

Langkah 3: Buat PriorityClass untuk beban kerja

PriorityClass beban kerja harus memiliki nilai lebih tinggi daripada PriorityClass placeholder (-1) agar pod aplikasi dapat menggantikan pod placeholder. Anda memiliki dua opsi:

  • Opsi A: PriorityClass Bernama — Tetapkan secara eksplisit ke beban kerja tertentu melalui priorityClassName.

  • Opsi B: PriorityClass Global — Berlaku otomatis untuk semua pod yang tidak menentukan PriorityClass.

Opsi A: PriorityClass Bernama

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

       apiVersion: scheduling.k8s.io/v1
       kind: PriorityClass
       metadata:
         name: high-priority
       value: 1000000              # Nilai prioritas. Harus lebih tinggi daripada nilai prioritas default (-1) pod placeholder yang dibuat di Langkah 2.
       globalDefault: false
       description: "Priority class ini hanya boleh digunakan untuk pod layanan XYZ."

Opsi B: PriorityClass Global

Jika Anda tidak memerlukan PriorityClass terpisah untuk setiap pod, Anda dapat mengonfigurasi PriorityClass global sebagai default. Setelah diterapkan, pod tanpa PriorityClass yang ditentukan secara otomatis mengadopsi nilai prioritas ini, dan preemption berlaku secara otomatis.

   apiVersion: scheduling.k8s.io/v1
   kind: PriorityClass
   metadata:
     name: global-high-priority
   value: 1                              # Nilai prioritas. Harus lebih tinggi daripada nilai prioritas default (-1) pod placeholder yang dibuat di Langkah 2.
   globalDefault: true
   description: "Priority class ini hanya boleh digunakan untuk pod layanan XYZ."

Terapkan PriorityClass

  1. Buat PriorityClass tersebut. Output yang diharapkan:

       kubectl apply -f priorityClass.yaml
       priorityclass.scheduling.k8s.io/high-priority created
Verifikasi: Jalankan kubectl get priorityclass dan pastikan high-priority (atau global-high-priority) muncul dalam daftar dengan nilai prioritas yang benar.

Langkah 4: Buat beban kerja

Contoh ini menggunakan Zona I.

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

       apiVersion: apps/v1
       kind: Deployment
       metadata:
         name: placeholder-test
         labels:
           app: nginx
       spec:
         replicas: 1
         selector:
           matchLabels:
             app: nginx
         template:
           metadata:
             labels:
               app: nginx
           spec:
             nodeSelector:                        # Aturan yang digunakan untuk memilih node.
               avaliable_zone: "i"
             priorityClassName: high-priority     # PriorityClass yang dikonfigurasi di Langkah 3. Opsional jika konfigurasi global diaktifkan.
             containers:
             - name: nginx
               image: nginx:1.7.9
               ports:
               - containerPort: 80
               resources:
                 requests:
                   cpu: 3                         # Permintaan sumber daya beban kerja.
                   memory: 5
  2. Terapkan beban kerja tersebut. Output yang diharapkan: Setelah penerapan, di halaman Workloads > Pods, Anda dapat melihat bahwa PriorityClass beban kerja lebih tinggi daripada PriorityClass pod placeholder. Pod placeholder berjalan di node yang diperluas kapasitasnya dan memicu penskalaan konkuren oleh Cluster Autoscaler untuk mempersiapkan peristiwa penskalaan beban kerja berikutnya. Pilih Nodes > Nodes. Di halaman Nodes, Anda dapat memastikan bahwa pod beban kerja berjalan di node yang sebelumnya menjalankan pod placeholder.

       kubectl apply -f workload.yaml
       deployment.apps/placeholder-test created

    Workload deployed

    Workload pod placement

Verifikasi: Di halaman Workloads > Pods, pastikan pod beban kerja berstatus Running dan pod placeholder yang tergantikan telah memicu penskalaan node di zona yang benar.