全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan penjadwalan berbasis beban

更新时间:Jul 06, 2025

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.

1

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 loadAwareThreshold sesuai kebutuhan. Untuk informasi lebih lanjut, lihat Parameter Kube Scheduler.

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 loadAwareResourceWeight di bagian Parameter Kube Scheduler.

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 kubectl top node memperhitungkan cache halaman. Untuk mendapatkan data penggunaan memori aktual, kami merekomendasikan Anda mengaktifkan Gunakan Managed Service for Prometheus.

Langkah 1: Aktifkan penjadwalan berbasis beban

Penting

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.

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

  2. Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.

  3. Di halaman Add-ons, temukan Kube Scheduler dan klik Configuration di kartu Kube Scheduler.

  4. 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 cpu atau memory.

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

  1. Buat file bernama stress-demo.yaml dan salin kode berikut ke file:

    Show YAML content:

    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 berikut untuk membuat pod: Setelah Anda membuat pod, tingkatkan beban node.

    kubectl create -f stress-demo.yaml
    # Keluaran yang diharapkan
    deployment.apps/stress-demo created
  3. Jalankan perintah berikut dan pantau status pod hingga mencapai status Running:

    kubectl get pod -o wide

    Keluaran 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 node cn-beijing.10.XX.XX.112.

    Tunggu 3 menit. Pastikan bahwa pod telah diinisialisasi dan beban node meningkat.

  4. Jalankan perintah berikut untuk menanyakan beban setiap node:

    kubectl top node

    Keluaran 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.111 memiliki beban terendah di antara semua node. Node cn-beijing.10.XX.XX.112 memiliki beban tertinggi di antara semua node. Hal ini menunjukkan bahwa beban di antara node tidak seimbang.

  5. Buat file bernama nginx-with-loadaware.yaml dan salin kode berikut ke dalam file:

    Show YAML content:

    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 berikut untuk membuat pod:

    kubectl create -f nginx-with-loadaware.yaml
    # Keluaran yang diharapkan
    deployment/nginx-with-loadawre created
  7. Jalankan perintah berikut untuk memeriksa apakah pod telah dijadwalkan:

    kubectl get pods | grep nginx

    Keluaran 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

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

  2. Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.

  3. Di halaman Add-ons, temukan Kube Scheduler dan klik Configuration di kartu Kube Scheduler.

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

  1. Di kotak dialog Kube Scheduler Parameters, hapus centang pada Specifies whether to enable load-aware node scoring during pod scheduling, hapus parameter loadAwareResourceWeight dan loadAwareThreshold, lalu klik OK.

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

Penting

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

  • ≥ 1.20.4-ack-4.0 ≤ 1.20.4-ack-8.0

  • v1.18-ack-4.0

≥ 0.3.0 dan < 0.8.0

Ya

Tidak