Aktifkan Koordinator Descheduler untuk secara otomatis mengusir dan menyeimbangkan kembali Pod saat taint node, aturan afinitas, atau profil beban berubah.
Prosedur berikut menggunakan Plugin RemovePodsViolatingNodeTaints sebagai contoh.
Prasyarat
Pastikan Anda telah:
-
Membuat kluster ACK managed Pro.
-
kubectl telah terhubung ke kluster.
Penjadwalan ulang tidak didukung pada node virtual.
Catatan penggunaan
-
Koordinator Descheduler hanya mengusir Pod — tidak membuat ulang. Kontroler workload (seperti Deployment atau StatefulSet) membuat ulang Pod yang diusir, dan penjadwal standar menempatkannya.
-
Pod lama diusir sebelum Pod baru dibuat. Pastikan aplikasi Anda memiliki jumlah
replicayang cukup untuk menjaga ketersediaan selama pengusiran. -
ack-descheduler sudah tidak digunakan lagi. Jika Anda masih menggunakannya, lihat Bagaimana cara migrasi dari ack-descheduler ke Koordinator Descheduler?
Pilih plugin penjadwalan ulang
Pilih plugin sesuai skenario Anda:
| Skenario | Plugin | Jenis kebijakan |
|---|---|---|
Pod tetap berada di node yang mendapatkan taint NoSchedule setelah penjadwalan |
RemovePodsViolatingNodeTaints |
Deschedule |
| Pod melanggar aturan anti-afinitas antar-Pod | RemovePodsViolatingInterPodAntiAffinity |
Deschedule |
| Pod tidak lagi memenuhi aturan afinitas node | RemovePodsViolatingNodeAffinity |
Deschedule |
| Pod sering restart | RemovePodsHavingTooManyRestarts |
Deschedule |
| Pod melebihi time-to-live-nya | PodLifeTime |
Deschedule |
| Pod berada dalam status Failed | RemoveFailedPod |
Deschedule |
| Pod replikasi tersebar tidak merata di seluruh node | RemoveDuplicates |
Balance |
| Node dimanfaatkan secara tidak merata berdasarkan alokasi sumber daya | LowNodeUtilization |
Balance |
| Pod melanggar batasan penyebaran topologi | RemovePodsViolatingTopologySpreadConstraint |
Balance |
| Node kelebihan beban berdasarkan pemanfaatan sumber daya aktual | LowNodeLoad |
Balance |
Contoh di bawah ini menggunakan RemovePodsViolatingNodeTaints. Baca konsep penjadwalan ulang dan Koordinator Descheduler vs. Kubernetes Descheduler sebelum memulai.
Cara kerja
RemovePodsViolatingNodeTaints memeriksa setiap node terhadap taint NoSchedule pada interval yang dikonfigurasi. Jika Pod yang sedang berjalan tidak memiliki toleransi terhadap taint NoSchedule suatu node, plugin tersebut akan mengusirnya. Kontroler workload membuat ulang Pod tersebut, dan penjadwal menempatkannya di node yang dapat ditoleransi.
Gunakan excludedTaints untuk mengecualikan taint tertentu. Jika kunci taint atau pasangan key=value cocok dengan entri dalam excludedTaints, plugin tersebut mengabaikannya.
Contoh skenario:
Kluster tiga node menjalankan Deployment dengan satu Pod per node. Administrator menambahkan taint NoSchedule ke dua node setelah deployment:
-
Node A mendapat
deschedule=not-allow:NoSchedule. Karenadeschedule=not-allowada dalamexcludedTaints, taint ini diabaikan — Pod tetap berjalan. -
Node B mendapat
deschedule=allow:NoSchedule. Taint ini tidak dikecualikan — Pod diusir dan dijadwalkan ulang ke Node C (yang tidak memiliki taintNoSchedule).
Langkah 1: Instal ack-koordinator dan aktifkan penjadwalan ulang
Jika ack-koordinator sudah terinstal, pastikan versinya 1.2.0-ack.2 atau lebih baru.
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster target. Di panel navigasi kiri, klik Add-ons.
-
Temukan ack-koordinator dan klik Install.
-
Di kotak dialog Install, pilih Enable Descheduler for ACK-Koordinator dan selesaikan instalasi.
Koordinator Descheduler diterapkan sebagai Deployment pada node kluster.
Langkah 2: Aktifkan plugin RemovePodsViolatingNodeTaints
Konfigurasikan plugin
Buat file bernama koord-descheduler-config.yaml. ConfigMap ini mengaktifkan RemovePodsViolatingNodeTaints dan mengecualikan taint deschedule=not-allow.
# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: koord-descheduler-config
namespace: kube-system
data:
koord-descheduler-config: |
# Jangan ubah konfigurasi sistem berikut untuk koord-descheduler.
apiVersion: descheduler/v1alpha2
kind: DeschedulerConfiguration
leaderElection:
resourceLock: leases
resourceName: koord-descheduler
resourceNamespace: kube-system
deschedulingInterval: 120s # Interval eksekusi descheduler. Diatur menjadi 120 detik di sini.
dryRun: false # Mode read-only global. Setelah 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 # Konfigurasikan plugin verifikasi taint node.
args:
excludedTaints:
- deschedule=not-allow # Abaikan node yang kunci taint-nya deschedule dan nilai taint-nya not-allow.
# Diperlukan agar RemovePodsViolatingNodeTaints berfungsi. Jangan hapus.
- name: MigrationController # Konfigurasikan kontroler migrasi.
args:
apiVersion: descheduler/v1alpha2
kind: MigrationControllerArgs
defaultJobMode: EvictDirectly
Parameter RemovePodsViolatingNodeTaints:
| Parameter | Tipe | Bawaan | Deskripsi |
|---|---|---|---|
excludedTaints |
list(string) | — | Kunci taint atau pasangan key=value yang diabaikan. Pod pada node dengan taint ini tidak diusir. |
includePreferNoSchedule |
bool | false | Jika true, juga memeriksa taint dengan efek PreferNoSchedule, bukan hanya NoSchedule. |
namespaces.include |
list(string) | — | Batasi penjadwalan ulang hanya pada namespace tertentu. Saling eksklusif dengan namespaces.exclude. |
namespaces.exclude |
list(string) | — | Lewati penjadwalan ulang di namespace tertentu. Saling eksklusif dengan namespaces.include. |
labelSelector |
map | — | Batasi penjadwalan ulang hanya pada Pod yang sesuai label yang ditentukan. |
Terapkan konfigurasi
-
Terapkan ConfigMap ke kluster:
kubectl apply -f koord-descheduler-config.yaml -
Mulai ulang Koordinator Descheduler agar memuat konfigurasi baru:
kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0 # Expected output: # deployment.apps/ack-koord-descheduler scaled kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1 # Expected output: # deployment.apps/ack-koord-descheduler scaled
Konfigurasikan parameter lanjutan
Konfigurasikan perilaku global dan pengaturan templat menggunakan ConfigMap.
Contoh konfigurasi lanjutan
ConfigMap ini menggunakan DeschedulerConfiguration untuk pengaturan global, mengaktifkan RemovePodsViolatingNodeTaints sebagai kebijakan penjadwalan ulang, dan menggunakan MigrationController sebagai pengusir.
# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: koord-descheduler-config
namespace: kube-system
data:
koord-descheduler-config: |
# Jangan ubah konfigurasi sistem berikut untuk koord-descheduler.
apiVersion: descheduler/v1alpha2
kind: DeschedulerConfiguration
leaderElection:
resourceLock: leases
resourceName: koord-descheduler
resourceNamespace: kube-system
dryRun: false # Mode read-only global. Setelah diaktifkan, koord-descheduler tidak melakukan operasi apa pun.
deschedulingInterval: 120s # Interval eksekusi descheduler. Diatur menjadi 120 detik di sini.
nodeSelector: # Node yang terlibat dalam penjadwalan ulang. Secara default, semua node dijadwalkan ulang.
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # Konfigurasikan sesuai kebutuhan Anda.
maxNoOfPodsToEvictPerNode: 10 # Jumlah maksimum Pod yang dapat diusir dari satu node. Batas ini berlaku secara global. Secara default, tidak ada batas.
maxNoOfPodsToEvictPerNamespace: 10 # Jumlah maksimum Pod yang dapat diusir dari satu namespace. Batas ini berlaku secara global. Secara default, tidak ada batas.
# Konfigurasi di atas adalah konfigurasi sistem.
# Daftar templat.
profiles:
- name: koord-descheduler # Nama templat.
# Cakupan: terapkan templat ini hanya pada node yang ditentukan.
# Metode 1: Pilih node dalam satu kelompok node.
nodeSelector:
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # Konfigurasikan sesuai kebutuhan Anda
# Metode 2: Pilih node dalam beberapa kelompok node.
# nodeSelector:
# matchExpressions:
# - key: alibabacloud.com/nodepool-id
# operator: In
# values:
# - nodepool-1
# - nodepool-2
plugins:
deschedule: # Semua plugin dinonaktifkan secara default. Tentukan plugin yang akan diaktifkan.
enabled:
- name: RemovePodsViolatingNodeTaints # Aktifkan plugin verifikasi taint node.
balance: # Semua plugin dinonaktifkan secara default.
disabled:
- name: "*" # Nonaktifkan semua plugin Balance.
evict:
enabled:
- name: MigrationController # MigrationController diaktifkan secara default.
filter:
enabled:
- name: MigrationController # Gunakan kebijakan penyaringan MigrationController secara default.
pluginConfig:
- name: RemovePodsViolatingNodeTaints
args:
excludedTaints:
- deschedule=not-allow # Abaikan node yang kunci taint-nya deschedule dan nilai taint-nya not-allow.
- reserved # Abaikan node yang kunci taint-nya reserved.
includePreferNoSchedule: false # Jika false, hanya memeriksa taint NoSchedule.
namespaces:
include: # Batasi penjadwalan ulang hanya pada namespace berikut.
- "namespace1"
- "namespace2"
# exclude: # Atau, kecualikan namespace berikut.
# - "namespace1"
# - "namespace2"
labelSelector: # Hanya jadwalkan ulang Pod yang sesuai label berikut.
accelerator: nvidia-tesla-p100
- name: MigrationController
args:
apiVersion: descheduler/v1alpha2
kind: MigrationControllerArgs
defaultJobMode: EvictDirectly
evictLocalStoragePods: false # Jika false, Pod yang menggunakan emptyDir atau hostPath tidak dijadwalkan ulang.
maxMigratingPerNode: 1 # Maksimum Pod yang dimigrasikan secara bersamaan pada satu node.
maxMigratingPerNamespace: 1 # Maksimum Pod yang dimigrasikan secara bersamaan dalam satu namespace.
maxMigratingPerWorkload: 1 # Maksimum Pod yang dimigrasikan secara bersamaan dalam satu workload.
maxUnavailablePerWorkload: 2 # Maksimum Pod replikasi yang tidak tersedia yang diizinkan dalam satu workload.
objectLimiters:
workload: # Pembatasan kecepatan migrasi tingkat workload. Default: hanya 1 Pod per workload dalam 5 menit.
duration: 5m
maxMigrating: 1
evictionPolicy: Eviction # Gunakan API Eviction secara default.
Konfigurasi sistem
Konfigurasikan perilaku global tingkat sistem dalam DeschedulerConfiguration.
| Parameter | Tipe | Nilai valid | Deskripsi | Contoh |
|---|---|---|---|---|
dryRun |
boolean | true / false (default: false) | Mode read-only. Jika diaktifkan, tidak ada Pod yang dimigrasikan. | false |
deschedulingInterval |
time.Duration | >0s | Frekuensi eksekusi descheduler. | 120s |
nodeSelector |
Struktur | — | Batasi node mana saja yang memenuhi syarat untuk penjadwalan ulang. Menerima matchLabels (satu kelompok node) atau matchExpressions (beberapa kelompok node). Lihat Kubernetes labelSelector. |
Lihat contoh YAML di atas |
maxNoOfPodsToEvictPerNode |
int | ≥0 (default: 0) | Maksimum Pod yang diusir dari satu node per siklus penjadwalan ulang. 0 berarti tanpa batas. | 10 |
maxNoOfPodsToEvictPerNamespace |
int | ≥0 (default: 0) | Maksimum Pod yang diusir dari satu namespace per siklus penjadwalan ulang. 0 berarti tanpa batas. | 10 |
Konfigurasi templat
Setiap templat (profiles) mengelompokkan kebijakan penjadwalan ulang dan pengusir dengan bidang berikut:
-
`name`: Pengidentifikasi templat.
-
`plugins`: Mengaktifkan atau menonaktifkan kebijakan penjadwalan ulang (
deschedule,balance), pengusir (evict), dan filter pra-pengusiran (filter). -
`pluginConfig`: Argumen per-plugin. Cocokkan bidang
namedengan nama plugin dan konfigurasikanargs. Lihat Konfigurasikan plugin kebijakan dan Konfigurasikan plugin pengusir. -
`nodeSelector`: Membatasi templat hanya pada node tertentu. Jika tidak diatur, berlaku untuk semua node.
nodeSelector tingkat templat memerlukan ack-koordinator v1.6.1-ack.1.16 atau lebih baru.
Referensi bidang `plugins`:
| Bidang | Plugin yang didukung | Deskripsi |
|---|---|---|
deschedule |
RemovePodsViolatingNodeTaints, RemovePodsViolatingInterPodAntiAffinity, RemovePodsViolatingNodeAffinity, RemovePodsHavingTooManyRestarts, PodLifeTime, RemoveFailedPod |
Semua dinonaktifkan secara default. Tentukan plugin yang akan diaktifkan. |
balance |
RemoveDuplicates, LowNodeUtilization, HighNodeUtilization, RemovePodsViolatingTopologySpreadConstraint, LowNodeLoad |
Semua dinonaktifkan secara default. Tentukan plugin yang akan diaktifkan. |
evict |
MigrationController, DefaultEvictor |
Pengusir Pod. MigrationController diaktifkan secara default. Jangan aktifkan beberapa plugin evict secara bersamaan. |
filter |
MigrationController, DefaultEvictor |
Kebijakan penyaringan pra-pengusiran. MigrationController diaktifkan secara default. Jangan aktifkan beberapa plugin filter secara bersamaan. |
Konfigurasikan plugin kebijakan
Koordinator Descheduler mendukung enam plugin Deschedule dan lima plugin Balance dari Kubernetes Descheduler. LowNodeLoad disediakan oleh Koordinator. Lihat Bekerja dengan penjadwalan ulang hotspot berbasis beban.
| Jenis kebijakan | Plugin | Deskripsi |
|---|---|---|
| Deschedule | RemovePodsViolatingInterPodAntiAffinity | Mengusir Pod yang melanggar aturan anti-afinitas antar-Pod. |
| Deschedule | RemovePodsViolatingNodeAffinity | Mengusir Pod yang tidak lagi memenuhi aturan afinitas node. |
| Deschedule | RemovePodsViolatingNodeTaints | Mengusir Pod yang tidak dapat mentoleransi taint node. |
| Deschedule | RemovePodsHavingTooManyRestarts | Mengusir Pod yang sering restart. |
| Deschedule | PodLifeTime | Mengusir Pod yang TTL-nya telah kedaluwarsa. |
| Deschedule | RemoveFailedPod | Mengusir Pod dalam status Failed. |
| Balance | RemoveDuplicates | Menyebarluaskan Pod replikasi secara merata di seluruh node. |
| Balance | LowNodeUtilization | Mendistribusikan ulang Pod berdasarkan alokasi sumber daya node. |
| Balance | HighNodeUtilization | Mengkonsolidasikan Pod dari node yang kurang dimanfaatkan ke node yang lebih dimanfaatkan. |
| Balance | RemovePodsViolatingTopologySpreadConstraint | Mengusir Pod yang melanggar batasan penyebaran topologi. |
Konfigurasikan plugin pengusir
Koordinator Descheduler mendukung dua plugin pengusir: DefaultEvictor dan MigrationController.
MigrationController
MigrationController menyediakan kontrol pengusiran detail halus dan observabilitas melalui pekerjaan migrasi.
| Parameter | Tipe | Nilai valid | Deskripsi | Contoh |
|---|---|---|---|---|
evictLocalStoragePods |
boolean | true / false (default: false) | Jika false, Pod yang menggunakan emptyDir atau hostPath tidak dijadwalkan ulang. |
false |
maxMigratingPerNode |
int64 | ≥0 (default: 2) | Maksimum Pod yang dimigrasikan secara bersamaan pada satu node. 0 berarti tanpa batas. | 2 |
maxMigratingPerNamespace |
int64 | ≥0 (default: 0) | Maksimum Pod yang dimigrasikan secara bersamaan dalam satu namespace. 0 berarti tanpa batas. | 1 |
maxMigratingPerWorkload |
intOrString | ≥0 (default: 10%) | Maksimum Pod atau persentase yang dimigrasikan secara bersamaan dalam satu workload. 0 berarti tanpa batas. Jika workload hanya memiliki satu Pod, maka dikecualikan dari penjadwalan ulang. | 1 atau 10% |
maxUnavailablePerWorkload |
intOrString | ≥0 dan < jumlah replica (default: 10%) | Maksimum Pod replikasi yang tidak tersedia yang diizinkan dalam satu workload. 0 berarti tanpa batas. | 1 atau 10% |
objectLimiters.workload |
Struktur | Duration >0 (default: 5m); MaxMigrating ≥0 (default: 10%) |
Membatasi kecepatan migrasi tingkat workload dalam jendela waktu. Duration menetapkan panjang jendela. MaxMigrating menetapkan maksimum Pod yang dimigrasikan dalam jendela tersebut. |
duration: 5m maxMigrating: 1 |
evictionPolicy |
string | Eviction (default), Delete, Soft |
Mengontrol cara Pod diusir. Eviction: memanggil API Eviction untuk pengusiran graceful. Delete: memanggil API Delete. Soft: menambahkan anotasi scheduling.koordinator.sh/soft-eviction untuk penanganan khusus downstream. |
Eviction |
DefaultEvictor
DefaultEvictor adalah pengusir standar Kubernetes Descheduler. Lihat DefaultEvictor untuk konfigurasi.
MigrationController vs. DefaultEvictor
| Kemampuan | DefaultEvictor | MigrationController |
|---|---|---|
| Metode pengusiran | Hanya API Eviction | API Eviction, API Delete, atau anotasi Soft |
| Batas pengusiran per node | Didukung | Didukung |
| Batas pengusiran per namespace | Didukung | Didukung |
| Batas pengusiran per workload | Tidak didukung | Didukung |
| Batas ketidaktersediaan per workload | Tidak didukung | Didukung |
| Pembatasan kecepatan pengusiran | Tidak didukung | Pembatasan kecepatan berbasis jendela waktu per workload |
| Observabilitas pengusiran | Hanya log komponen | Log komponen dan event Kubernetes dengan status migrasi per Pod |
Langkah selanjutnya
-
Penjadwalan ulang — konsep, fitur, dan alur kerja.
-
Menggunakan Kubernetes Descheduler komunitas? Lihat Koordinator Descheduler dan Kubernetes Descheduler untuk perbedaan dan migrasi.
-
Konfigurasikan penjadwalan ulang berbasis beban dengan
LowNodeLoad: Bekerja dengan penjadwalan ulang hotspot berbasis beban. -
Analisis penggunaan sumber daya kluster dan dapatkan rekomendasi penghematan biaya: Cost Insight.
-
Pemecahan masalah: FAQ Penjadwalan.
-
Catatan rilis dan ikhtisar komponen: ack-koordinator (ack-slo-manager).