Penjadwalan ulang (descheduling) adalah proses menjadwalkan ulang Pod yang sesuai dengan aturan pengusiran pada suatu node ke node lain. Fitur ini cocok untuk skenario seperti pemanfaatan sumber daya kluster yang tidak merata, node yang sangat padat, dan permintaan terhadap kebijakan penjadwalan baru. Fitur penjadwalan ulang membantu mengoptimalkan penggunaan sumber daya dan meningkatkan kualitas layanan aplikasi. Topik ini menggunakan plugin verifikasi taint node bernama RemovePodsViolatingNodeTaints sebagai contoh untuk menjelaskan cara mengaktifkan fitur penjadwalan ulang berdasarkan komponen ack-koordinator.
Sebelum memulai
Sebelum menerapkan, kami menyarankan Anda memahami fitur, skenario penggunaan, alur kerja, dan konsep dasar penjadwalan ulang.
Topik ini menggunakan plugin verifikasi taint node bernama
RemovePodsViolatingNodeTaintssebagai contoh. Untuk informasi selengkapnya tentang cara penggunaan taint dan toleransi dalam menjadwalkan serta mengusir Pod, seperti NoSchedule, lihat Taints and Tolerations.Jika Anda menggunakan Kubernetes Descheduler dari komunitas, kami menyarankan Anda melihat Koordinator Descheduler dan Kubernetes Descheduler untuk memahami perbedaan antara Koordinator Descheduler dan Kubernetes Descheduler serta menyelesaikan migrasi komponen.
Untuk mempelajari konfigurasi lanjutan untuk penjadwalan ulang detail halus, seperti konfigurasi sistem, konfigurasi templat, konfigurasi plugin kebijakan, dan konfigurasi plugin pengusir, lihat Konfigurasi parameter lanjutan.
Prasyarat
Kluster ACK managed Pro telah dibuat. Untuk informasi selengkapnya, lihat Buat kluster ACK yang dikelola.
Fitur penjadwalan ulang tidak dapat digunakan pada node virtual.
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Dapatkan kubeconfig kluster dan hubungkan ke kluster menggunakan kubectl.
Catatan penggunaan
Koordinator Descheduler hanya mengusir Pod yang sedang berjalan dan tidak membuat ulang atau menjadwalkan kembali Pod yang diusir tersebut. Setelah Pod diusir, Pod tersebut akan dibuat ulang oleh pengontrol beban kerja, seperti Deployment dan StatefulSet. Pod yang dibuat ulang tetap dijadwalkan oleh penjadwal.
Selama proses penjadwalan ulang, Pod lama akan dieviksi dan Pod baru akan dibuat. Pastikan aplikasi Anda memiliki
replicasyang cukup untuk menjaga ketersediaan aplikasi selama eviksi.
Contoh
Topik ini menjelaskan cara mengaktifkan fitur penjadwalan ulang dan menerapkan kebijakan penjadwalan ulang berdasarkan komponen ack-koordinator. Plugin verifikasi taint node RemovePodsViolatingNodeTaints digunakan sebagai contoh.
Secara default, kebijakan RemovePodsViolatingNodeTaints memeriksa Pod pada node yang memiliki taint dengan effect NoSchedule dan mengusir Pod yang tidak dapat mentolerir taint tersebut. Misalnya, sebuah node menjalankan Pod dan administrator menambahkan taint deschedule=not-allow:NoSchedule ke node tersebut. Jika Pod pada node tersebut tidak dikonfigurasi dengan toleransi untuk mentolerir taint tersebut, Pod akan diusir oleh kebijakan penjadwalan ulang. Untuk informasi selengkapnya, lihat RemovePodsViolatingNodeTaints.
Kebijakan RemovePodsViolatingNodeTaints memungkinkan Anda mengatur bidang excludedTaints untuk mengabaikan taint node. Jika key taint atau pasangan kunci-nilai (key=value) cocok dengan taint dalam daftar excludedTaints, taint tersebut akan diabaikan.
Dalam contoh ini, plugin dikonfigurasi untuk memverifikasi taint dengan cara berikut:
effectdiatur keNoSchedulepada node.Pada atribut taint
NoSchedule,keytaint bukandeschedule, danvaluetaint bukannot-allow.
Pada node yang memenuhi kondisi di atas, jika Pod yang berjalan tidak memiliki toleransi yang sesuai, Pod tersebut akan diusir oleh descheduler.
Langkah 1: Instal atau modifikasi komponen ack-koordinator dan aktifkan penjadwalan ulang
Anda dapat mengikuti langkah-langkah dalam bagian ini untuk menginstal komponen ack-koordinator dan menggunakan fitur penjadwalan ulang yang disediakan oleh Koordinator Descheduler. Koordinator Descheduler diterapkan pada node sebagai Deployment.
Jika Anda telah menginstal komponen ack-koordinator, pastikan versi komponen tersebut adalah 1.2.0-ack.2 atau lebih baru.
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi sebelah kiri, klik Add-ons.
Temukan komponen ack-koordinator dan klik Install di pojok kanan bawah. Pada kotak dialog Install, pilih Enable Descheduler for ACK-Koordinator untuk mengaktifkan modul penjadwalan ulang. Lalu, konfigurasikan dan instal komponen sesuai petunjuk.
Langkah 2: Aktifkan plugin penjadwalan ulang RemovePodsViolatingNodeTaints
Gunakan konten YAML berikut untuk membuat file bernama koord-descheduler-config.yaml:
Buat resource ConfigMap koord-descheduler-config.yaml untuk mengaktifkan dan mengonfigurasi plugin penjadwalan ulang
RemovePodsViolatingNodeTaints.# koord-descheduler-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: koord-descheduler-config namespace: kube-system data: koord-descheduler-config: | # Jangan ubah konfigurasi sistem koord-desheduler berikut. apiVersion: descheduler/v1alpha2 kind: DeschedulerConfiguration leaderElection: resourceLock: leases resourceName: koord-descheduler resourceNamespace: kube-system deschedulingInterval: 120s # Interval LowNodeLoad berjalan. Interval diatur menjadi 120 detik dalam contoh ini. dryRun: false # Mode read-only global. Setelah mode ini diaktifkan, koord-descheduler tidak melakukan operasi apa pun. # Konfigurasi di atas adalah konfigurasi sistem. profiles: - name: koord-descheduler plugins: deschedule: enabled: - name: RemovePodsViolatingNodeTaints # Aktifkan plugin verifikasi taint node. pluginConfig: - name: RemovePodsViolatingNodeTaints # Konfigurasi plugin verifikasi taint node. args: excludedTaints: - deschedule=not-allow # Abaikan node yang key taint-nya deschedule dan value taint-nya not-allow. # Konfigurasi berikut diperlukan agar plugin verifikasi taint node berfungsi. Jangan hapus. - name: MigrationController # Konfigurasi parameter migration controller. args: apiVersion: descheduler/v1alpha2 kind: MigrationControllerArgs defaultJobMode: EvictDirectlyJalankan perintah berikut untuk menerapkan file koord-descheduler-config.yaml di kluster:
kubectl apply -f koord-descheduler-config.yamlJalankan perintah berikut untuk me-restart modul descheduler Koordinator Descheduler:
kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0 # Output yang diharapkan # deployment.apps/ack-koord-descheduler scaled kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1 # Output yang diharapkan # deployment.apps/ack-koord-descheduler scaledAtur jumlah replika Deployment
ack-koord-deschedulermenjadi0lalu atur kembali menjadi1. Operasi ini me-restart modul Koordinator Descheduler. Konfigurasi terbaru akan digunakan setelah restart.
Langkah 3: Verifikasi fitur penjadwalan ulang
Sebuah kluster yang terdiri dari tiga node digunakan sebagai contoh.
Gunakan konten YAML berikut untuk membuat file bernama stress-demo.yaml:
Aplikasi contoh didefinisikan dalam file stress-demo.yaml.
Jalankan perintah berikut untuk menerapkan file stress-demo.yaml dan membuat Pod uji:
kubectl create -f stress-demo.yamlJalankan perintah berikut untuk melihat status Pod hingga masuk ke status Running:
kubectl get pod -o wideOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-5f6cddf9-9**** 1/1 Running 0 10s 192.XX.XX.27 cn-beijing.192.XX.XX.247 <none> <none> stress-demo-5f6cddf9-h**** 1/1 Running 0 10s 192.XX.XX.20 cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Running 0 10s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none>Jalankan perintah berikut untuk menambahkan taint
key=value:NoScheduleke node:Tambahkan taint
deschedule=not-allow:NoScheduleke node bernamacn-beijing.192.XX.XX.247:kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoScheduleOutput yang diharapkan:
node/cn-beijing.192.XX.XX.247 taintedTambahkan taint
deschedule=allow:NoScheduleke node bernamacn-beijing.192.XX.XX.248:kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoScheduleOutput yang diharapkan:
node/cn-beijing.192.XX.XX.248 tainted
Jalankan perintah berikut untuk melihat perubahan Pod:
kubectl get pod -o wide -wTunggu modul descheduler memeriksa taint node dan melakukan operasi pengusiran.
Output yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-5f6cddf9-9**** 1/1 Running 0 5m34s 192.XX.XX.27 cn-beijing.192.XX.XX.247 <none> <none> stress-demo-5f6cddf9-h**** 1/1 Running 0 5m34s 192.XX.XX.20 cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Running 0 5m34s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Terminating 0 7m58s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none> stress-demo-5f6cddf9-j**** 0/1 ContainerCreating 0 0s <none> cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-j**** 1/1 Running 0 2s 192.XX.XX.32 cn-beijing.192.XX.XX.249 <none> <none>Output tersebut menunjukkan informasi berikut:
Pod
stress-demo-5f6cddf9-v****pada nodecn-beijing.192.XX.XX.248dengan taintdeschedule=allow:NoSchedulediusir.Pod
stress-demo-5f6cddf9-9****pada nodecn-beijing.192.XX.XX.247dengan taintdeschedule=not-allow:NoScheduletidak diusir.Pod yang diusir
stress-demo-5f6cddf9-v****dijadwalkan ulang ke nodecn-beijing.192.XX.XX.249, yang tidak memiliki taintNoSchedule.
Jalankan perintah berikut untuk melihat event Pod yang diusir:
kubectl get event | grep stress-demo-5f6cddf9-v****Output yang diharapkan:
3m24s Normal Evicting podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798**** Pod "default/stress-demo-5f6cddf9-v****" evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints" 2m51s Normal EvictComplete podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798**** Pod "default/stress-demo-5f6cddf9-v****" has been evicted 3m24s Normal Descheduled pod/stress-demo-5f6cddf9-v**** Pod evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints" 3m24s Normal Killing pod/stress-demo-5f6cddf9-v**** Stopping container stressOutput yang diharapkan menunjukkan catatan migrasi Pod. Pod tersebut tidak dikonfigurasi dengan toleransi yang sesuai untuk mentolerir taint
deschedule=not-allowpada nodecn-beijing.192.XX.XX.248. Akibatnya, Pod tersebut dijadwalkan ulang ke node lain. Hasilnya sesuai harapan.
Konfigurasi parameter lanjutan
Selain operasi di atas, Anda juga dapat menggunakan ConfigMap untuk mengonfigurasi parameter lanjutan untuk Koordinator Descheduler.
Contoh konfigurasi lanjutan
File YAML berikut menunjukkan contoh konfigurasi lanjutan Koordinator Descheduler. Konfigurasi tersebut memodifikasi perilaku Koordinator Descheduler dengan memanggil API DeschedulerConfiguration, mengaktifkan kebijakan verifikasi taint node RemovePodsViolatingNodeTaint, dan menggunakan MigrationController sebagai pengusir Pod.
Untuk informasi selengkapnya tentang parameter dalam konfigurasi contoh, lihat bagian berikut.
Konfigurasi sistem
Anda dapat mengonfigurasi perilaku global tingkat sistem untuk Koordinator Descheduler dalam DeschedulerConfiguration.
Parameter | Tipe | Nilai valid | Deskripsi | Contoh |
| boolean |
| Mode read-only global. Setelah mode ini diaktifkan, Pod tidak dapat dimigrasikan. | false |
| time.Duration | >0s | Interval penjadwalan ulang. | 120s |
| Struktur | N/A | Batasi node yang dapat dijadwalkan ulang. Kebijakan penjadwalan ulang hanya berlaku pada node yang ditentukan oleh selector node. Untuk informasi selengkapnya tentang selector node, lihat Kubernetes labelSelector. | Anda dapat menentukan satu atau beberapa kelompok node saat mengonfigurasi parameter ini.
|
| int | ≥ 0 (Nilai default: 0) | Batasi jumlah maksimum Pod yang dapat diusir secara bersamaan pada satu node. Parameter ini berlaku selama penjadwalan ulang. | 10 |
| int | ≥ 0 (Nilai default: 0) | Batasi jumlah maksimum Pod yang dapat diusir secara bersamaan dalam satu namespace. Parameter ini berlaku selama penjadwalan ulang. | 10 |
Konfigurasi templat
Koordinator Descheduler menggunakan templat penjadwalan ulang untuk mengelola kebijakan penjadwalan ulang dan pengusir Pod. Anda dapat mendefinisikan satu atau beberapa templat penjadwalan ulang dalam field DeschedulerConfiguration profiles. Dalam setiap templat penjadwalan ulang, kebijakan penjadwalan ulang dan pengusir Pod dikonfigurasi sebagai plugin. Templat penjadwalan ulang terdiri dari bagian-bagian berikut:
nameNilainya berupa string. Anda dapat menyesuaikan nama templat penjadwalan ulang.
pluginsKonfigurasikan kebijakan penjadwalan ulang (
deschedule,balance) yang ingin Anda aktifkan atau nonaktifkan, plugin pengusiran Pod (evict), dan kebijakan filter yang akan digunakan sebelum pengusiran Pod (filter). Tabel berikut menjelaskan parameter yang dapat Anda konfigurasi.Parameter
Tipe
Nilai valid
Deskripsi
Contoh
descheduleStruktur dalam format berikut:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }EnableddanDisabledadalah daftar strukturPlugin, yang menunjukkan plugin yang akan diaktifkan dan dinonaktifkan.Semua plugin dinonaktifkan secara default. Anda dapat menentukan kebijakan penjadwalan ulang Deschedule yang akan diaktifkan.
plugins: deschedule: enabled: - name: PodLifeTime - name: RemovePodsViolatingNodeTaintsRemovePodsViolatingInterPodAntiAffinityKebijakan ini mengusir Pod yang tidak sesuai dengan aturan anti-afinitas antar-Pod.
RemovePodsViolatingNodeAffinityKebijakan ini mengusir Pod yang tidak sesuai dengan aturan afinitas node.
RemovePodsViolatingNodeTaintsKebijakan ini mengusir Pod yang tidak dapat mentolerir taint node.
RemovePodsHavingTooManyRestartsKebijakan ini mengusir Pod yang sering restart.
PodLifeTimeKebijakan ini mengusir Pod yang TTL-nya telah kedaluwarsa.
RemoveFailedPodKebijakan ini mengusir Pod yang berada dalam status Failed.
balanceStruktur dalam format berikut:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }EnableddanDisabledadalah daftar strukturPlugin, yang menunjukkan plugin yang akan diaktifkan dan dinonaktifkan.Semua plugin dinonaktifkan secara default. Tentukan kebijakan penjadwalan ulang Balance yang akan diaktifkan.
plugins: balance: enabled: - name: RemoveDuplicates - name: LowNodeLoadRemoveDuplicatesMenyebarkan Pod replikasi.
LowNodeUtilizationMenyebar hotspot berdasarkan alokasi sumber daya node.
HighNodeUtilizationMengagregasi beban berdasarkan alokasi sumber daya node. Pod dimigrasikan dari node dengan pemanfaatan sumber daya rendah ke node dengan pemanfaatan sumber daya tinggi jika kebijakan mengizinkannya.
RemovePodsViolatingTopologySpreadConstraintMengusir Pod yang tidak sesuai dengan batasan distribusi topologi.
LowNodeLoadMenyebar hotspot berdasarkan pemanfaatan sumber daya node.
evictStruktur dalam format berikut:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }Enabled dan Disabled adalah daftar struktur Plugin. Anda dapat mengaktifkan plugin dalam daftar Enabled dan menonaktifkan plugin dalam daftar Disabled.
MigrationControllerDefaultEvictor
Pengusir Pod yang Anda pilih untuk diaktifkan.
MigrationControllerdiaktifkan secara default.Jangan mengaktifkan beberapa plugin
evictsecara bersamaan.plugins: evict: enabled: - name: MigrationControllerfilterStruktur dalam format berikut:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }Enabled dan Disabled adalah daftar struktur Plugin. Anda dapat mengaktifkan plugin dalam daftar Enabled dan menonaktifkan plugin dalam daftar Disabled.
MigrationControllerDefaultEvictor
Pilih kebijakan pemfilteran pengusiran yang akan digunakan sebelum pengusiran Pod.
MigrationControllerdiaktifkan secara default.Jangan mengaktifkan beberapa plugin
filtersecara bersamaan.plugins: filter: enabled: - name: MigrationControllerpluginConfigKonfigurasikan parameter lanjutan untuk setiap plugin. Tentukan nama plugin yang ingin Anda konfigurasi dengan mengatur field
name. Untuk informasi selengkapnya tentang cara mengonfigurasi plugin dalam fieldargs, lihat Konfigurasi plugin kebijakan dan Konfigurasi plugin pengusir.nodeSelectorBatasi cakupan templat penjadwalan ulang. Kebijakan penjadwalan ulang yang dikonfigurasi dalam templat hanya berlaku pada node yang ditentukan oleh selector node. Untuk informasi selengkapnya, lihat Kubernetes labelSelector. Jika field ini tidak ditentukan, templat berlaku pada semua node secara default.
CatatanField
nodeSelectordalam konfigurasi templat hanya didukung pada komponen ack-koordinator versi v1.6.1-ack.1.16 dan yang lebih baru.
Konfigurasi plugin kebijakan
Koordinator Descheduler mendukung enam plugin kebijakan Deschedule dan lima plugin kebijakan Balance. Plugin LowNodeLoad disediakan oleh Koordinator. Untuk informasi selengkapnya, lihat Bekerja dengan penjadwalan ulang hotspot berbasis kesadaran beban. Plugin penjadwalan ulang berikut disediakan oleh Kubernetes Descheduler:
Tipe kebijakan | Fitur kebijakan | Pengaturan kebijakan |
Deschedule | Kebijakan ini mengusir Pod yang tidak sesuai dengan aturan anti-afinitas antar-Pod. | |
Kebijakan ini mengusir Pod yang tidak sesuai dengan aturan afinitas node. | ||
Kebijakan ini mengusir Pod yang tidak dapat mentolerir taint node. | ||
Kebijakan ini mengusir Pod yang sering restart. | ||
Kebijakan ini mengusir Pod yang TTL-nya telah kedaluwarsa. | ||
Kebijakan ini mengusir Pod yang berada dalam status Failed. | ||
Balance | Menyebarkan Pod replikasi. | |
Menyebar hotspot berdasarkan alokasi sumber daya node. | ||
Mengagregasi beban berdasarkan alokasi sumber daya node. | ||
Mengusir Pod yang tidak sesuai dengan batasan distribusi topologi. |
Konfigurasi plugin pengusir
Koordinator Descheduler mendukung kedua plugin pengusir DefaultEvictor dan MigrationController.
MigrationController
Tabel berikut menjelaskan konfigurasi lanjutan plugin pengusir MigrationController.
Parameter | Tipe | Nilai valid | Deskripsi | Contoh |
| boolean |
| Tentukan apakah Pod yang dikonfigurasi dengan emptyDir atau hostPath dapat dijadwalkan ulang. Untuk alasan keamanan, parameter ini dinonaktifkan secara default. | false |
| int64 | ≥ 0 (nilai default: 2) | Jumlah maksimum Pod yang dapat dimigrasikan secara bersamaan pada satu node. Nilai 0 menunjukkan tidak ada batasan. | 2 |
| int64 | ≥ 0 (Nilai default: 0) | Jumlah maksimum Pod yang dapat dimigrasikan secara bersamaan dalam satu namespace. Nilai 0 menunjukkan tidak ada batasan. | 1 |
| intOrString | ≥ 0 (Nilai default: 10%) | Jumlah atau persentase maksimum Pod yang dapat dimigrasikan secara bersamaan dalam satu beban kerja, seperti Deployment. Nilai 0 menunjukkan tidak ada batasan. Jika beban kerja hanya berisi satu Pod replikasi, beban kerja tersebut dikecualikan dari penjadwalan ulang. | 1 atau 10% |
| intOrString | Sama dengan atau lebih besar dari 0 (Nilai default: 10%) dan lebih kecil dari jumlah Pod replikasi beban kerja | Jumlah atau persentase maksimum Pod replikasi yang tidak tersedia yang diizinkan dalam satu beban kerja, seperti Deployment. Nilai 0 menunjukkan tidak ada batasan. | 1 atau 10% |
| Struktur dalam format berikut: |
| Kontrol migrasi Pod spesifik beban kerja.
| Contoh ini menunjukkan bahwa hanya satu Pod replikasi yang dapat dimigrasikan dalam waktu 5 menit dalam satu beban kerja. |
| string | Mode berikut didukung:
|
| Eviction |
DefaultEvictor
Plugin DefaultEvictor disediakan oleh Kubernetes Descheduler. Untuk informasi selengkapnya, lihat DefaultEvictor.
Perbandingan
Tabel berikut membandingkan kemampuan pengusiran Pod antara DefaultEvictor dan MigrationController.
Referensi
Beberapa fitur penjadwalan ulang bergantung pada penjadwal ACK. Untuk informasi selengkapnya, lihat Bekerja dengan penjadwalan ulang hotspot berbasis kesadaran beban.
Anda dapat mengaktifkan fitur Cost Insight untuk memahami penggunaan sumber daya kluster dan distribusi biaya, serta mendapatkan rekomendasi penghematan biaya. Untuk informasi selengkapnya, lihat Cost Insight.
Untuk informasi tentang cara memecahkan masalah yang mungkin Anda temui, lihat FAQ Penjadwalan.
Untuk informasi selengkapnya tentang pengenalan ack-koordinator dan catatan rilis, lihat ack-koordinator (ack-slo-manager).
ack-descheduler tidak lagi digunakan. Kami menyarankan Anda bermigrasi dari ack-descheduler ke Koordinator Descheduler. Untuk informasi selengkapnya, lihat Bagaimana cara bermigrasi dari ack-descheduler ke Koordinator Descheduler?.