Secara default, Pod dijadwalkan berdasarkan resource yang diminta, bukan berdasarkan beban aktual node. Aktifkan penjadwalan berbasis beban (load-aware scheduling) pada kluster ACK managed Pro untuk menempatkan Pod pada node dengan beban aktual lebih rendah, menyeimbangkan pemanfaatan, serta mengurangi risiko kegagalan node akibat kelebihan beban.
Cara kerja penjadwalan berbasis beban
Penjadwalan berbasis beban adalah plugin yang diimplementasikan oleh penjadwal Container Service for Kubernetes (ACK) berdasarkan Kubernetes Scheduling Framework. Kebijakan penjadwalan Kubernetes native menempatkan Pod terutama berdasarkan alokasi resource. Penjadwal ACK justru mendeteksi beban resource aktual setiap node: ia merujuk statistik historis beban node, memperkirakan beban Pod yang akan dijadwalkan, lalu menempatkan Pod tersebut pada node dengan beban lebih rendah. Pendekatan ini menyeimbangkan beban di seluruh node dan membantu mencegah kegagalan aplikasi atau node akibat kelebihan beban pada satu node.
Penjadwalan berbasis beban memerlukan komponen kube-scheduler dan add-on ack-koordinator. Add-on ack-koordinator mengumpulkan dan melaporkan pemanfaatan resource node, sedangkan penjadwal ACK menggunakan data tersebut untuk memberi skor dan mengurutkan node sehingga node dengan beban lebih rendah dipilih terlebih dahulu. Untuk detail desain add-on, lihat arsitektur ack-koordinator.
Pada gambar berikut, Requested adalah jumlah resource yang telah diminta dan Usage adalah jumlah resource yang benar-benar digunakan. Hanya resource yang benar-benar digunakan yang dihitung sebagai beban aktual. Dengan kondisi node yang identik, penjadwal ACK menugaskan Pod baru ke Node B, yang memiliki beban lebih rendah.

Pemanfaatan node berubah secara dinamis seiring waktu dan lingkungan kluster, traffic workload, serta volume permintaan. Untuk mengurangi kemungkinan kluster kembali tidak seimbang setelah Pod dijadwalkan, add-on ack-koordinator juga menyediakan descheduling. Gunakan penjadwalan berbasis beban bersama dengan gunakan descheduling berbasis hotspot untuk menyeimbangkan beban node agar beban node tetap seimbang dari waktu ke waktu.
Cara pengukuran beban node
Statistik beban dapat diagregasi dengan berbagai cara, termasuk nilai rata-rata dan persentil. Secara default, penjadwal ACK menggunakan rata-rata selama 5 menit terakhir. Untuk mengubah jenis agregasi, atur parameter loadAwareAggregatedUsageAggragationType. Untuk detailnya, lihat Parameter kube-scheduler kustom.
Untuk memori, data penggunaan mengecualikan page cache karena sistem operasi dapat mereklaim page cache tersebut. Pemanfaatan yang dikembalikan oleh perintah kubectl top node mencakup page cache. Untuk melihat penggunaan memori aktual suatu node, lihat Konfigurasi Managed Service for Prometheus.
Kebijakan penjadwalan
Penjadwalan berbasis beban menyediakan kebijakan berikut. Kedua kebijakan menggunakan statistik beban node agregat yang dijelaskan pada bagian sebelumnya.
Kebijakan | Deskripsi |
Node filtering | Menyaring node kandidat berdasarkan beban aktual. Jika beban aktual suatu node melebihi ambang batas beban yang dikonfigurasi, penjadwal tidak akan menjadwalkan Pod ke node tersebut. Node filtering dinonaktifkan secara default. Untuk mengaktifkannya, atur parameter |
Node scoring | Memberi skor pada node kandidat berdasarkan dimensi CPU dan dimensi memori, lalu memilih node dengan skor lebih tinggi terlebih dahulu. Skor dihitung sebagai |
Prasyarat
Jenis kluster — Hanya kluster ACK managed Pro yang didukung. Untuk prosedurnya, lihat Buat kluster ACK Pro.
Add-on ack-koordinator — Instal add-on ack-koordinator versi 1.1.1-ack.1 atau yang lebih baru. Untuk prosedur instalasi, lihat ack-koordinator (sebelumnya ack-slo-manager).
Versi penjadwal ACK — Penjadwal ACK harus memenuhi persyaratan versi sesuai versi Kubernetes kluster Anda, seperti yang tercantum dalam tabel berikut.
Versi Kubernetes | Versi penjadwal ACK yang diperlukan |
1.26 dan yang lebih baru | Semua versi |
1.24 | v1.24.6-ack-4.0 atau yang lebih baru |
1.22 | v1.22.15-ack-4.0 atau yang lebih baru |
Versi-versi ini diperlukan untuk mengonfigurasi penjadwalan berbasis beban melalui parameter kube-scheduler. Beberapa versi penjadwal yang lebih lama hanya mendukung protokol anotasi Pod. Untuk matriks kompatibilitas lengkap, lihat FAQ.
Penagihan
Menginstal atau menggunakan add-on ack-koordinator gratis. Namun, Anda mungkin dikenai biaya dalam skenario berikut:
Resource node pekerja — ack-koordinator adalah add-on non-managed yang mengonsumsi resource node pekerja setelah diinstal. Permintaan resource dapat dikonfigurasi untuk setiap modul selama instalasi.
Metrik kustom — Secara default, ack-koordinator mengekspos metrik pemantauan untuk fitur seperti profiling resource dan penjadwalan detail halus dalam format Prometheus. Jika Anda memilih Enable Prometheus monitoring metrics for ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini ditagih sebagai metrik kustom. Biayanya bervariasi berdasarkan faktor seperti ukuran kluster dan jumlah aplikasi. Sebelum mengaktifkan fitur ini, lihat Penagihan instans Prometheus untuk memahami tier gratis dan harga metrik kustom. Untuk memantau dan mengelola penggunaan resource Anda, gunakan kueri penggunaan.
Langkah 1: Aktifkan penjadwalan berbasis beban
Penjadwalan berbasis beban tidak berlaku kecuali add-on ack-koordinator dan penjadwal ACK memenuhi persyaratan versi yang dijelaskan dalam Prasyarat.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Components and Add-ons .
Temukan kube-scheduler dan klik Configuration.
Pada kotak dialog parameter kube-scheduler, konfigurasikan parameter yang dijelaskan dalam tabel berikut lalu klik OK.
Tabel berikut menjelaskan parameter utama untuk penjadwalan berbasis beban. Untuk referensi pengaturan parameter lengkap dan versi add-on yang diperlukan setiap parameter, lihat kube-scheduler dan .
Parameter
Tipe
Deskripsi
Nilai valid
Nilai default
Contoh
loadAwareThresholdDaftar yang terdiri dari nama resource
resourceNamedan ambang batasthreshold.Ambang batas jenis sumber daya yang sesuai, yang digunakan oleh kebijakan penyaringan node.
resourceName:cpudanmemorydidukung.threshold: [0,100].Kosong, artinya node filtering dinonaktifkan.
resourceName: cpudanthreshold: 80loadAwareResourceWeightDaftar yang terdiri dari nama resource
resourceNamedan bobotresourceWeight.Bobot penilaian tipe resource yang sesuai, digunakan oleh kebijakan node scoring. Anda harus memilih Specifies whether to enable load-aware node scoring during pod scheduling.
resourceName: hanyacpudanmemoryyang didukung.resourceWeight: bilangan bulat dalam rentang [1,100].cpu: 1danmemory: 1resourceName: cpudanresourceWeight: 1loadAwareAggregatedUsageAggragationTypeenum
Jenis agregasi statistik beban.
avg: nilai rata-rata.p50: persentil ke-50, yaitu median.p90,p95, danp99: persentil ke-90, ke-95, dan ke-99.avg,p50,p90,p95, danp99avgp90PentingJika auto scaling node sudah diaktifkan untuk node di kluster, ambang batas filtering berbasis beban dapat memicu scale-out atau scale-in yang tidak diinginkan. Hal ini karena auto scaling node melakukan scale-out berdasarkan apakah Pod sedang pending dan melakukan scale-in berdasarkan tingkat alokasi kluster. Untuk menggunakan auto scaling node bersama filtering node berbasis beban, sesuaikan konfigurasi agar sesuai dengan kapasitas dan pemanfaatan kluster Anda, seperti yang dijelaskan dalam Aktifkan auto scaling node.
Di panel navigasi sisi kiri, klik Cluster Information. Pada halaman yang muncul, klik tab Basic Information dan tunggu hingga kluster memasuki status Running, yang menunjukkan bahwa penjadwalan berbasis beban telah diaktifkan.
Langkah 2: Verifikasi penjadwalan berbasis beban
Contoh berikut menggunakan kluster yang memiliki tiga node, masing-masing dengan 4 core dan memori 16 GiB. Contoh ini pertama-tama membuat beban di antara node menjadi tidak seimbang, lalu memeriksa lokasi penjadwalan Pod baru.
Buat file bernama stress-demo.yaml dengan konten berikut.
apiVersion: apps/v1 kind: Deployment metadata: name: stress-demo namespace: default labels: app: stress-demo spec: replicas: 1 selector: matchLabels: app: stress-demo template: metadata: name: stress-demo labels: app: stress-demo spec: containers: - args: - '--vm' - '2' - '--vm-bytes' - '1600M' - '-c' - '2' - '--vm-hang' - '2' command: - stress image: polinux/stress imagePullPolicy: Always name: stress resources: limits: cpu: '2' memory: 4Gi requests: cpu: '2' memory: 4Gi restartPolicy: AlwaysJalankan perintah kubectl berikut untuk membuat Pod. Pod ini meningkatkan beban node tempatnya berada.
kubectl create -f stress-demo.yamldeployment.apps/stress-demo createdJalankan perintah kubectl berikut untuk memeriksa status Pod hingga Pod berjalan.
kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-7fdd89cc6b-g**** 1/1 Running 0 82s 10.XX.XX.112 cn-beijing.10.XX.XX.112 <none> <none>stress-demo-7fdd89cc6b-g****dijadwalkan ke nodecn-beijing.10.XX.XX.112. Tunggu sekitar 3 menit hingga Pod selesai inisialisasi dan beban node meningkat.Jalankan perintah kubectl berikut untuk memeriksa beban setiap node.
kubectl top nodeNAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.10.XX.XX.110 92m 2% 1158Mi 9% cn-beijing.10.XX.XX.111 77m 1% 1162Mi 9% cn-beijing.10.XX.XX.112 2105m 53% 3594Mi 28%cn-beijing.10.XX.XX.111memiliki beban terendah dan nodecn-beijing.10.XX.XX.112memiliki beban tertinggi. Beban di antara node dalam kluster kini tidak seimbang.Buat file bernama nginx-with-loadaware.yaml dengan konten berikut.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-loadaware namespace: default labels: app: nginx spec: replicas: 6 selector: matchLabels: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx resources: limits: cpu: 500m requests: cpu: 500mJalankan perintah kubectl berikut untuk membuat Pod.
kubectl create -f nginx-with-loadaware.yamldeployment/nginx-with-loadawre createdJalankan perintah kubectl berikut untuk melihat detail penjadwalan Pod.
kubectl get pods | grep nginxnginx-with-loadaware-5646666d56-2**** 1/1 Running 0 18s 10.XX.XX.118 cn-beijing.10.XX.XX.110 <none> <none> nginx-with-loadaware-5646666d56-7**** 1/1 Running 0 18s 10.XX.XX.115 cn-beijing.10.XX.XX.110 <none> <none> nginx-with-loadaware-5646666d56-k**** 1/1 Running 0 18s 10.XX.XX.119 cn-beijing.10.XX.XX.110 <none> <none> nginx-with-loadaware-5646666d56-q**** 1/1 Running 0 18s 10.XX.XX.113 cn-beijing.10.XX.XX.111 <none> <none> nginx-with-loadaware-5646666d56-s**** 1/1 Running 0 18s 10.XX.XX.120 cn-beijing.10.XX.XX.111 <none> <none> nginx-with-loadaware-5646666d56-z**** 1/1 Running 0 18s 10.XX.XX.116 cn-beijing.10.XX.XX.111 <none> <none>Output yang diharapkan menunjukkan bahwa setelah penjadwalan berbasis beban diaktifkan, penjadwal mendeteksi beban node dan menggunakan strategi penjadwalan untuk menjadwalkan Pod secara preferensial ke node selain cn-beijing.10.XX.XX.112.
FAQ
Mengapa Pod dalam batch Pod baru yang dibuat tidak semuanya dijadwalkan ke node dengan beban terendah?
Pod baru meningkatkan beban suatu node setelah mulai berjalan. Jika penjadwal menempatkan seluruh batch Pod baru pada node yang saat ini memiliki beban terendah, node tersebut dapat dengan cepat menjadi hotspot beban.
Oleh karena itu, saat plugin penjadwalan berbasis beban memberi skor pada node, skor node yang meng-host Pod baru yang pemanfaatannya belum dilaporkan disesuaikan. Hal ini mencegah penjadwalan berlebihan yang menciptakan hotspot baru.
Selain beban node, apa lagi yang memengaruhi hasil penjadwalan?
Penjadwal Kubernetes terdiri dari banyak plugin, dan banyak di antaranya berkontribusi pada pemberian skor node selama penjadwalan, seperti plugin affinity dan plugin topology spread. Peringkat node akhir mencerminkan semua plugin tersebut, dan Anda dapat menyesuaikan bobot penilaian setiap plugin sesuai kebutuhan.
Setelah penjadwal ditingkatkan ke versi baru, apakah penjadwalan berbasis beban masih berfungsi melalui protokol lama?
Jawabannya bergantung pada versi Kubernetes kluster. Pada versi 1.22, penjadwal ACK tetap kompatibel dengan protokol lama. Untuk versi 1.24, periode kompatibilitas berakhir pada 30 Agustus 2023. Untuk versi 1.26 dan yang lebih baru, protokol anotasi Pod tidak didukung.
Pada versi yang masih mendukung protokol lama, tambahkan anotasi alibabacloud.com/loadAwareScheduleEnabled: "true" ke Pod. Karena penjadwal ACK kompatibel dengan protokol lama, Anda dapat meningkatkan penjadwal ke versi baru secara mulus. Setelah peningkatan, gunakan Parameter kube-scheduler kustom untuk mengaktifkan kebijakan penjadwalan penyeimbangan beban di seluruh kluster, yang mengurangi perubahan yang diperlukan dalam konfigurasi Pod.
Tingkatkan kluster ke versi yang lebih baru dan gunakan metode konfigurasi baru untuk penjadwalan berbasis beban. Untuk informasi lebih lanjut, lihat tingkatkan kluster secara manual.
Tabel berikut menjelaskan dukungan protokol dan persyaratan versi add-on untuk setiap versi:
1.26 dan yang lebih baru
Versi penjadwal ACK | Versi ack-koordinator (ack-slo-manager) yang diperlukan | Protokol anotasi Pod | Sakelar parameter konsol |
Semua versi penjadwal ACK | ≥1.1.1-ack.1 | Tidak didukung | Didukung |
1.24
Versi penjadwal ACK | Versi ack-koordinator (ack-slo-manager) yang diperlukan | Protokol anotasi Pod | Sakelar parameter konsol |
≥v1.24.6-ack-4.0 | ≥1.1.1-ack.1 | Didukung | Didukung |
≥v1.24.6-ack-3.1 dan <v1.24.6-ack-4.0 | ≥0.8.0 | Didukung | Tidak didukung |
Versi penjadwal ACK | Versi ack-koordinator (ack-slo-manager) yang diperlukan | Protokol anotasi Pod | Sakelar parameter konsol |
≥1.22.15-ack-4.0 | ≥1.1.1-ack.1 | Didukung | Didukung |
≥1.22.15-ack-2.0 dan <1.22.15-ack-4.0 | ≥0.8.0 | Didukung | Tidak didukung |
≥v1.20.4-ack-4.0 dan ≤v1.20.4-ack-8.0, atau v1.18-ack-4.0 | ≥0.3.0 dan <0.8.0 | Didukung | Tidak didukung |