Secara default, Container Service for Kubernetes (ACK) menyaring node berdasarkan apakah mereka memenuhi permintaan sumber daya pod saat menjadwalkan pod. Penjadwal di ACK Pro cluster mendukung fitur penjadwalan berbasis beban. Kami merekomendasikan Anda menggunakan fitur ini untuk memantau beban node dan menjadwalkan pod ke node dengan beban lebih rendah guna menerapkan keseimbangan beban serta menghindari kelebihan beban pada node.
Prasyarat
Versi ack-koordinator 1.1.1-ack.1 atau yang lebih baru telah terpasang. Untuk informasi lebih lanjut, lihat ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager).
Versi ACK scheduler kube-scheduler yang terpasang sesuai dengan versi Kubernetes dari klaster. Pemetaan versi berikut diperlukan untuk mengaktifkan penjadwalan berbasis beban.
Versi Kubernetes
Versi ACK scheduler
≥ 1.26
Semua versi
1.24
≥ 1.24.6-ack-4.0
1.22
≥ 1.22.15-ack-4.0
Penagihan
Tidak ada biaya yang dikenakan saat Anda menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin dikenakan dalam skenario berikut:
ack-koordinator adalah komponen non-managed yang menggunakan sumber daya node pekerja setelah diinstal. Anda dapat menentukan jumlah sumber daya yang diminta oleh setiap modul saat menginstal komponen.
Secara default, ack-koordinator mengekspos metrik pemantauan fitur seperti profil sumber daya dan penjadwalan granular sebagai metrik Prometheus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini dianggap sebagai metrik kustom, dan biaya akan dikenakan untuk metrik tersebut. Biaya bergantung pada faktor-faktor seperti ukuran klaster Anda dan jumlah aplikasi. Sebelum mengaktifkan metrik Prometheus, kami merekomendasikan Anda membaca topik Penagihan dari Managed Service for Prometheus untuk mempelajari tentang kuota gratis dan aturan penagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau dan mengelola penggunaan sumber daya, lihat Kueri jumlah data observabel dan tagihan.
Batasan
Hanya ACK Pro cluster yang mendukung penjadwalan berbasis beban. Untuk informasi lebih lanjut, lihat Buat ACK Pro cluster.
Pengenalan penjadwalan berbasis beban
Fitur penjadwalan berbasis beban dari ACK scheduler kube-scheduler dirancang berdasarkan kerangka penjadwalan Kubernetes. Penjadwal Kubernetes menjadwalkan pod ke node berdasarkan alokasi sumber daya. ACK scheduler menjadwalkan pod ke node berdasarkan beban node. Setelah penjadwalan berbasis beban diaktifkan, sistem meninjau statistik historis beban node. Kemudian, sistem menjadwalkan pod ke node dengan beban lebih rendah untuk menerapkan keseimbangan beban. Ini mencegah crash aplikasi atau node yang disebabkan oleh node yang kelebihan beban.
Gambar berikut menunjukkan perbedaan antara penjadwal Kubernetes dan penjadwal ACK saat menjadwalkan pod. Requested menunjukkan sumber daya yang diminta oleh pod pada node, dan Usage menunjukkan sumber daya yang digunakan oleh pod pada node. Hanya sumber daya yang digunakan yang diperhitungkan saat sistem menghitung beban node. Dalam hal ini, penjadwal ACK menjadwalkan pod ke Node B karena Node B memiliki beban lebih rendah.

Seiring waktu, lingkungan klaster, lalu lintas, atau permintaan terhadap workload pada node berubah, distribusi beban di antara node mungkin menjadi tidak seimbang. Untuk mencegah masalah ini, ack-koordinator menyediakan fitur descheduling hotspot berbasis beban. Anda dapat menggunakan penjadwalan berbasis beban bersamaan dengan descheduling hotspot untuk mencapai keseimbangan beban optimal di antara node. Untuk informasi lebih lanjut tentang fitur descheduling hotspot berbasis beban, lihat Bekerja dengan descheduling hotspot berbasis beban.
Cara kerjanya
Penjadwalan berbasis beban diimplementasikan dengan menggunakan kube-scheduler bersamaan dengan ack-koordinator. ack-koordinator bertanggung jawab untuk mengumpulkan dan melaporkan metrik pemanfaatan sumber daya node. Penjadwal ACK bertanggung jawab untuk menghitung skor node berdasarkan pemanfaatan sumber daya dan mengurutkan node berdasarkan skor node. Penjadwal ACK secara prioritas menjadwalkan pod baru ke node dengan beban lebih rendah. Untuk informasi lebih lanjut tentang arsitektur ack-koordinator, lihat arsitektur ack-koordinator.
Kebijakan penjadwalan
Kebijakan | Deskripsi |
Penyaringan node | Setelah Anda mengaktifkan penyaringan node, penjadwal menyaring node berdasarkan beban node selama penjadwalan pod. Jika beban node melebihi ambang batas yang Anda konfigurasikan, penjadwal menyaring node tersebut. Secara default, penyaringan node dinonaktifkan. Anda dapat menyesuaikan konfigurasi penjadwal dan memodifikasi parameter Penting Jika peningkatan otomatis node sudah diaktifkan untuk klaster, aktivitas peningkatan otomatis yang tidak terduga mungkin dipicu setelah Anda menentukan ambang batas untuk penyaringan node berbasis beban. Hal ini karena aktivitas peningkatan otomatis dipicu ketika pod tetap tertunda dan aktivitas penurunan otomatis dipicu ketika pemanfaatan sumber daya node turun di bawah ambang batas penurunan. Jika Anda ingin mengaktifkan peningkatan otomatis node dan penyaringan node berbasis beban, kami merekomendasikan Anda mengonfigurasi parameter terkait berdasarkan kapasitas dan pemanfaatan sumber daya klaster. Untuk informasi lebih lanjut, lihat Aktifkan peningkatan otomatis node. |
Pengurutan node | Penjadwal ACK menghitung skor node berdasarkan pemanfaatan CPU dan memori. Penjadwal ACK menggunakan penilaian berbobot dan memilih node dengan skor lebih tinggi untuk penjadwalan pod. Setelah Anda memilih Specifies whether to enable load-aware node scoring during pod scheduling saat Anda menyesuaikan konfigurasi penjadwal di konsol ACK, Anda dapat menentukan bobot CPU kustom dan bobot memori kustom. Untuk informasi lebih lanjut, lihat parameter Skor node dihitung berdasarkan rumus berikut: Skor node = [((1 - Pemanfaatan CPU) × Bobot CPU + (1 - Pemanfaatan Memori) × Bobot Memori)/(Bobot CPU + Bobot Memori)]. Pemanfaatan CPU dan memori diukur dalam persentase. |
Perhitungan pemanfaatan sumber daya | Anda dapat mengonfigurasi cara menghitung rata-rata pemanfaatan sumber daya dan persentase data yang dihitung. Secara default, rata-rata pemanfaatan sumber daya dalam 5 menit terakhir dihitung. Untuk informasi lebih lanjut, lihat Parameter Kube Scheduler. Cache halaman dikecualikan dari penggunaan memori karena cache halaman dapat diklaim kembali oleh OS node. Perhatikan bahwa pemanfaatan memori yang dikembalikan oleh perintah |
Langkah 1: Aktifkan penjadwalan berbasis beban
Sebelum Anda mengaktifkan penjadwalan berbasis beban, pastikan bahwa ack-koordinator versi 1.1.1-ack.1 atau yang lebih baru telah terinstal di klaster Anda.
Masuk ke konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.
Di halaman Add-ons, temukan Kube Scheduler dan klik Configuration di kartu Kube Scheduler.
Di kotak dialog Kube Scheduler Parameters, konfigurasikan parameter seperti yang dijelaskan dalam tabel berikut, dan klik OK.
Tabel berikut menjelaskan parameter utama. Untuk informasi lebih lanjut tentang parameter lainnya dan versi komponen yang diperlukan oleh parameter, lihat kube-scheduler dan Parameter kustom kube-scheduler.
Parameter
Tipe
Deskripsi
Nilai valid
Contoh
loadAwareThreshold
Nilainya terdiri dari bidang resourceName dan resourceWeight.
Parameter ini menentukan ambang batas untuk penyaringan node.
resourceName: Nilai valid adalah cpu dan memory.
threshold: Nilai valid berkisar dari 0 hingga 100.
Secara default, parameter ini dibiarkan kosong, yang menonaktifkan penyaringan node.
resourceName: cpu
threshold: 80
loadAwareResourceWeight
Nilainya terdiri dari bidang resourceName dan resourceWeight.
Parameter ini menentukan bobot sumber daya yang digunakan untuk menghitung skor node untuk pengurutan node. Parameter ini tersedia setelah Anda memilih Specifies whether to enable load-aware node scoring during pod scheduling.
resourceName: Skema parameter resourceName diverifikasi. Nilai hanya bisa
cpuataumemory.resourceWeight: Nilai valid adalah bilangan bulat mulai dari 1 hingga 100.
Nilai default: cpu=1, memory=1.
resourceName: cpu
resourceWeight: 1
loadAwareAggregatedUsageAggregationType
enum
Parameter ini menentukan tipe agregasi data untuk statistik. Nilai valid:
avg: menghitung nilai rata-rata.
p50: menghitung 50% dari statistik.
p90, p95, dan p99: menghitung 90% dari statistik, menghitung 95% dari statistik, dan menghitung 99% dari statistik.
avg
p50
p90
p95
p99
Nilai default: avg.
p90
Di panel navigasi kiri halaman detail klaster, klik Cluster Information. Jika status klaster di tab Basic Information berubah menjadi Running, penjadwalan berbasis beban diaktifkan.
Langkah 2: Uji penjadwalan berbasis beban
Dalam contoh berikut, sebuah klaster yang berisi tiga node digunakan. Setiap node memiliki 4 Core dan 16 GiB memori.
Buat file bernama stress-demo.yaml dan salin kode berikut ke file:
Jalankan perintah berikut untuk membuat pod: Setelah Anda membuat pod, tingkatkan beban node.
kubectl create -f stress-demo.yaml # Keluaran yang diharapkan deployment.apps/stress-demo createdJalankan perintah berikut dan pantau status pod hingga mencapai status Running:
kubectl get pod -o wideKeluaran yang diharapkan:
NAME 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>Pod
stress-demo-7fdd89cc6b-g****dijadwalkan ke nodecn-beijing.10.XX.XX.112.Tunggu 3 menit. Pastikan bahwa pod telah diinisialisasi dan beban node meningkat.
Jalankan perintah berikut untuk menanyakan beban setiap node:
kubectl top nodeKeluaran yang diharapkan:
NAME 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%Node
cn-beijing.10.XX.XX.111memiliki beban terendah di antara semua node. Nodecn-beijing.10.XX.XX.112memiliki beban tertinggi di antara semua node. Hal ini menunjukkan bahwa beban di antara node tidak seimbang.Buat file bernama nginx-with-loadaware.yaml dan salin kode berikut ke dalam file:
Jalankan perintah berikut untuk membuat pod:
kubectl create -f nginx-with-loadaware.yaml # Keluaran yang diharapkan deployment/nginx-with-loadawre createdJalankan perintah berikut untuk memeriksa apakah pod telah dijadwalkan:
kubectl get pods | grep nginxKeluaran yang diharapkan:
nginx-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>Keluaran di atas menunjukkan bahwa setelah penjadwalan berbasis beban diaktifkan untuk klaster, klaster dapat memantau beban node dan menggunakan kebijakan penjadwalan untuk menjadwalkan pod ke node selain node
cn-beijing.10.XX.XX.112.
Apa yang harus dilakukan selanjutnya
Ubah konfigurasi penjadwalan berbasis beban
Masuk ke konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.
Di halaman Add-ons, temukan Kube Scheduler dan klik Configuration di kartu Kube Scheduler.
Di kotak dialog Kube Scheduler Parameters, ubah parameter terkait penjadwalan berbasis beban dan klik OK.
Di panel navigasi kiri halaman detail klaster, klik Cluster Information. Jika status klaster di tab Basic Information berubah menjadi Running, konfigurasi penjadwalan berbasis beban telah dimodifikasi.
Nonaktifkan penjadwalan berbasis beban
Di kotak dialog Kube Scheduler Parameters, hapus centang pada Specifies whether to enable load-aware node scoring during pod scheduling, hapus parameter
loadAwareResourceWeightdanloadAwareThreshold, lalu klik OK.Di panel navigasi kiri halaman detail klaster, klik Cluster Information. Jika status klaster di tab Basic Information berubah menjadi Running, penjadwalan berbasis beban dinonaktifkan.
Tanya Jawab Umum
Setelah saya membuat sekelompok pod, mengapa tidak ada pod yang dijadwalkan ke node dengan beban terendah?
Jika penjadwal menjadwalkan semua pod ke node dengan beban terendah, node tersebut menjadi node hotspot.
Untuk mencegah masalah ini, jika sebuah node memiliki pod baru yang data pemanfaatan sumber dayanya belum dilaporkan, plugin penjadwalan berbasis beban melakukan penyesuaian yang sesuai pada skor node.
Selain beban node, faktor apa lagi yang mungkin memengaruhi hasil penjadwalan berbasis beban?
Penjadwal Kubernetes terdiri dari beberapa plugin. Beberapa plugin, seperti plugin afinitas dan plugin topologi, bertanggung jawab atas penilaian dan pengurutan node. Node diurutkan secara kolektif oleh plugin-plugin tersebut. Anda dapat menyesuaikan bobot skor yang diberikan oleh plugin yang berbeda berdasarkan kebutuhan bisnis Anda.
Apakah fitur penjadwalan berbasis beban yang diaktifkan berdasarkan versi protokol penjadwal sebelumnya didukung setelah saya memperbarui versi penjadwal?
Untuk menggunakan fitur penjadwalan berbasis beban dari versi protokol penjadwal sebelumnya, tambahkan anotasi alibabacloud.com/loadAwareScheduleEnabled: "true" ke konfigurasi pod.
Penjadwal ACK kompatibel dengan versi protokol penjadwal sebelumnya. Anda dapat memperbarui penjadwal ACK ke versi yang lebih baru secara mulus. Setelah pembaruan, kami merekomendasikan Anda melakukan Langkah 1: Aktifkan penjadwalan berbasis beban untuk mengaktifkan keseimbangan beban pada klaster. Ini menghilangkan kebutuhan untuk memodifikasi konfigurasi pod guna menyeimbangkan beban di antara node dalam klaster.
Pada Kubernetes 1.22, penjadwal ACK kompatibel dengan versi protokol penjadwal sebelumnya. Namun, pada Kubernetes 1.24, penjadwal ACK hanya kompatibel dengan versi protokol penjadwal sebelumnya hingga 30 Agustus 2023. Kami merekomendasikan Anda memperbarui versi Kubernetes klaster Anda dan menggunakan metode konfigurasi terbaru untuk penjadwalan berbasis beban. Untuk informasi lebih lanjut tentang cara memperbarui klaster, lihat Peningkatan manual klaster ACK.
Tabel berikut menjelaskan kompatibilitas antara versi protokol yang berbeda dan versi komponen.
Kubernetes 1.26 and later
Versi ACK scheduler | Versi ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager) | Protokol anotasi pod | Apakah dapat diaktifkan/dinonaktifkan di konsol |
Semua versi | ≥ 1.1.1-ack.1 | Tidak | Ya |
Kubernetes 1.24
Versi ACK scheduler | Versi ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager) | Protokol anotasi pod | Apakah dapat diaktifkan/dinonaktifkan di konsol |
≥ 1.24.6-ack-4.0 | ≥ 1.1.1-ack.1 | Ya | Ya |
≥ 1.24.6-ack-3.1 dan < 1.24.6-ack-4.0 | ≥ 0.8.0 | Ya | Tidak |
Kubernetes 1.22 and earlier
Versi ACK scheduler | Versi ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager) | Protokol anotasi pod | Apakah dapat diaktifkan/dinonaktifkan di konsol |
≥ 1.22.15-ack-4.0 | ≥ 1.1.1-ack.1 | Ya | Ya |
≥ 1.22.15-ack-2.0 dan < 1.22.15-ack-4.0 | ≥ 0.8.0 | Ya | Tidak |
| ≥ 0.3.0 dan < 0.8.0 | Ya | Tidak |