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
Minimal satu vSwitch telah dibuat di setiap zona tempat Anda ingin memperluas kapasitas instans. Untuk informasi selengkapnya, lihat Buat dan kelola vSwitch. Setelah membuat vSwitch, Anda dapat memilihnya saat membuat dan mengelola kelompok node.
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.
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:
Buat satu kelompok node per zona dengan label zona. Setiap kelompok node diberi label yang mengidentifikasi zona tempat kelompok tersebut berada.
Terapkan pod placeholder menggunakan nodeSelector. Komponen
ack-autoscaling-placeholdermenjadwalkan satu pod placeholder ke setiap zona berdasarkan label zona tersebut. Pod placeholder ini menggunakan PriorityClass dengan bobot lebih rendah daripada pod aplikasi.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.
Komponen
ack-autoscaling-placeholdermembuat satu pod placeholder di setiap zona. Pod placeholder memiliki prioritas penjadwalan lebih rendah daripada pod aplikasi sesungguhnya.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.
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
Masuk ke ACK console. Pada panel navigasi sebelah kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang ingin Anda kelola lalu klik namanya. Di panel navigasi sebelah kiri, pilih Nodes > Node Pools.
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.
Parameter Description Node Pool Name auto-zone-I Scaling Mode Pilih Auto untuk mengaktifkan autoscaling. vSwitch Pilih vSwitch di Zona I. Node Labels Atur Key label node menjadi available_zonedan Value-nya menjadii.Ulangi langkah-langkah sebelumnya untuk membuat kelompok node dengan autoscaling diaktifkan untuk setiap zona yang memerlukan autoscaling.

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
Di panel navigasi sebelah kiri Konsol ACK, pilih Marketplace > Marketplace.
Temukan dan klik ack-autoscaling-placeholder. Di halaman ack-autoscaling-placeholder, klik Deploy.
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
Di panel navigasi sebelah kiri halaman detail, pilih Applications > Helm.
Pada halaman Helm, klik Update di kolom Actions untuk ack-autoscaling-placeholder-default.
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
deploymentsmengikuti struktur yang sama. Entri pertama di bawah ini diberi anotasi lengkap; entri berikutnya hanya berbeda pada nilainamedannodeSelector. Tabel berikut merangkum bidang yang harus Anda ubah untuk setiap zona: Setelah pembaruan berhasil, Penyebaran placeholder dibuat untuk setiap zona.Field Zona I Zona K Zona H nameack-place-holder-Iack-place-holder-Kack-place-holder-HnodeSelector{"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
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
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
Buat PriorityClass tersebut. Output yang diharapkan:
kubectl apply -f priorityClass.yamlpriorityclass.scheduling.k8s.io/high-priority created
Verifikasi: Jalankankubectl get priorityclassdan pastikanhigh-priority(atauglobal-high-priority) muncul dalam daftar dengan nilai prioritas yang benar.
Langkah 4: Buat beban kerja
Contoh ini menggunakan Zona I.
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: 5Terapkan 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.yamldeployment.apps/placeholder-test created

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