All Products
Search
Document Center

Container Service for Kubernetes:Gunakan penjadwalan berbasis beban

Last Updated:Aug 29, 2026

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.

1

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 loadAwareThreshold. Untuk detailnya, lihat Parameter kube-scheduler kustom.

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 ((1 - pemanfaatan CPU) * bobot CPU + (1 - pemanfaatan memori) * bobot memori) / (bobot CPU + bobot memori), dengan pemanfaatan CPU dan pemanfaatan memori dinyatakan dalam persentase. Untuk menyesuaikan bobot CPU dan bobot memori, atur parameter loadAwareResourceWeight. Untuk detailnya, lihat Parameter kube-scheduler kustom.

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

Penting

Penjadwalan berbasis beban tidak berlaku kecuali add-on ack-koordinator dan penjadwal ACK memenuhi persyaratan versi yang dijelaskan dalam Prasyarat.

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Components and Add-ons .

  3. Temukan kube-scheduler dan klik Configuration.

  4. 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

    loadAwareThreshold

    Daftar yang terdiri dari nama resource resourceName dan ambang batas threshold.

    Ambang batas jenis sumber daya yang sesuai, yang digunakan oleh kebijakan penyaringan node.

    resourceName: cpu dan memory didukung. threshold: [0,100].

    Kosong, artinya node filtering dinonaktifkan.

    resourceName: cpu dan threshold: 80

    loadAwareResourceWeight

    Daftar yang terdiri dari nama resource resourceName dan bobot resourceWeight.

    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: hanya cpu dan memory yang didukung. resourceWeight: bilangan bulat dalam rentang [1,100].

    cpu: 1 dan memory: 1

    resourceName: cpu dan resourceWeight: 1

    loadAwareAggregatedUsageAggragationType

    enum

    Jenis agregasi statistik beban. avg: nilai rata-rata. p50: persentil ke-50, yaitu median. p90, p95, dan p99: persentil ke-90, ke-95, dan ke-99.

    avg, p50, p90, p95, dan p99

    avg

    p90

    Penting

    Jika 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.

  5. 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.

  1. 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: Always
  2. Jalankan perintah kubectl berikut untuk membuat Pod. Pod ini meningkatkan beban node tempatnya berada.

    kubectl create -f stress-demo.yaml
    deployment.apps/stress-demo created
  3. Jalankan perintah kubectl berikut untuk memeriksa status Pod hingga Pod berjalan.

    kubectl get pod -o wide
    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>

    stress-demo-7fdd89cc6b-g**** dijadwalkan ke node cn-beijing.10.XX.XX.112. Tunggu sekitar 3 menit hingga Pod selesai inisialisasi dan beban node meningkat.

  4. Jalankan perintah kubectl berikut untuk memeriksa beban setiap node.

    kubectl top node
    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%

    cn-beijing.10.XX.XX.111 memiliki beban terendah dan node cn-beijing.10.XX.XX.112 memiliki beban tertinggi. Beban di antara node dalam kluster kini tidak seimbang.

  5. 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: 500m
  6. Jalankan perintah kubectl berikut untuk membuat Pod.

    kubectl create -f nginx-with-loadaware.yaml
    deployment/nginx-with-loadawre created
  7. Jalankan perintah kubectl berikut untuk melihat detail penjadwalan Pod.

    kubectl get pods | grep nginx
    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>

    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.

Penting

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