Descheduling memindahkan pod yang sedang berjalan dan melanggar aturan eviction ke node lain tanpa menunggu penjadwal (scheduler) mendeteksi ketidakseimbangan. Gunakan fitur ini untuk memperbaiki penempatan pod yang salah setelah taint, aturan afinitas, atau profil beban node berubah.
Topik ini memandu Anda mengaktifkan descheduling melalui komponen ack-koordinator dengan menggunakan plug-in RemovePodsViolatingNodeTaints sebagai contoh.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK managed Pro. Untuk informasi selengkapnya, lihat Buat kluster ACK managed.
-
Klien kubectl yang terhubung ke kluster. Untuk informasi selengkapnya, lihat Dapatkan kubeconfig kluster dan hubungkan ke kluster menggunakan kubectl.
Descheduling tidak didukung pada virtual node.
Catatan penggunaan
-
Koordinator Descheduler hanya meng-evict pod yang sedang berjalan. Fitur ini tidak membuat ulang atau menjadwalkan ulang pod tersebut. Setelah eviction, controller workload (seperti Deployment atau StatefulSet) akan membuat ulang pod, yang kemudian dijadwalkan oleh penjadwal standar.
-
Selama proses descheduling, pod lama dievict sebelum pod baru dibuat. Pastikan aplikasi Anda memiliki jumlah
replicasyang cukup untuk menjaga ketersediaan selama eviction. -
ack-descheduler sudah tidak digunakan lagi. Jika Anda masih menggunakannya, migrasikan ke Koordinator Descheduler. Untuk informasi selengkapnya, lihat Bagaimana cara migrasi dari ack-descheduler ke Koordinator Descheduler?.
Pilih plug-in descheduling
Pilih plug-in berdasarkan masalah yang ingin Anda selesaikan:
| Skenario | Plug-in | 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 berbagai node | RemoveDuplicates |
Balance |
| Node dimanfaatkan secara tidak merata berdasarkan alokasi sumber daya | LowNodeUtilization |
Balance |
| Pod melanggar batasan penyebaran topologi (topology spread constraints) | RemovePodsViolatingTopologySpreadConstraint |
Balance |
| Node kelebihan beban berdasarkan pemanfaatan sumber daya aktual | LowNodeLoad |
Balance |
Topik ini menggunakan RemovePodsViolatingNodeTaints sebagai contoh. Baca konsep descheduling dan Koordinator Descheduler vs. Kubernetes Descheduler sebelum memulai.
Cara kerja
Plug-in RemovePodsViolatingNodeTaints memeriksa setiap node terhadap taint NoSchedule pada interval yang telah dikonfigurasi. Jika pod yang sedang berjalan tidak memiliki toleransi terhadap taint NoSchedule suatu node, plug-in tersebut akan meng-evict pod tersebut. Controller workload kemudian membuat ulang pod, dan penjadwal menempatkannya pada node yang dapat ditoleransi oleh pod tersebut.
Gunakan bidang excludedTaints untuk mengecualikan taint tertentu dari pemeriksaan ini. Jika kunci taint atau pasangan key=value-nya cocok dengan entri dalam excludedTaints, plug-in akan mengabaikan taint tersebut.
Contoh skenario yang digunakan dalam topik ini:
Kluster tiga node memiliki Deployment dengan satu pod di setiap node. Administrator menambahkan taint NoSchedule ke dua node setelah pod sudah berjalan:
-
Node A mendapat taint
deschedule=not-allow:NoSchedule. Karenadeschedule=not-allowada dalamexcludedTaints, taint ini diabaikan — pod tetap berjalan. -
Node B mendapat taint
deschedule=allow:NoSchedule. Taint ini tidak dikecualikan — pod dievict dan dijadwalkan ulang ke Node C (yang tidak memiliki taintNoSchedule).
Langkah 1: Instal ack-koordinator dan aktifkan descheduling
Jika ack-koordinator sudah terinstal, pastikan versinya 1.2.0-ack.2 atau lebih baru sebelum melanjutkan.
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, temukan kluster target dan klik namanya. Di panel navigasi kiri, klik Add-ons.
-
Temukan ack-koordinator dan klik Install di pojok kanan bawah.
-
Di kotak dialog Install, pilih Enable Descheduler for ACK-Koordinator, lalu konfigurasikan dan instal komponen sesuai petunjuk.
Koordinator Descheduler diterapkan sebagai Deployment pada node kluster.
Langkah 2: Aktifkan plug-in RemovePodsViolatingNodeTaints
Konfigurasi plug-in
Buat file bernama koord-descheduler-config.yaml dengan konten berikut. ConfigMap ini mengaktifkan RemovePodsViolatingNodeTaints dan mengonfigurasinya agar mengabaikan 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-desheduler.
apiVersion: descheduler/v1alpha2
kind: DeschedulerConfiguration
leaderElection:
resourceLock: leases
resourceName: koord-descheduler
resourceNamespace: kube-system
deschedulingInterval: 120s # Interval eksekusi descheduler. Diatur ke 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 plug-in verifikasi taint node.
pluginConfig:
- name: RemovePodsViolatingNodeTaints # Konfigurasi plug-in 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 # Konfigurasi migration controller.
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 dievict. |
includePreferNoSchedule |
bool | false | Jika true, juga memeriksa taint dengan efek PreferNoSchedule, bukan hanya NoSchedule. |
namespaces.include |
list(string) | — | Batasi descheduling hanya pada namespace tertentu. Saling eksklusif dengan namespaces.exclude. |
namespaces.exclude |
list(string) | — | Lewati descheduling pada namespace tertentu. Saling eksklusif dengan namespaces.include. |
labelSelector |
map | — | Batasi descheduling hanya pada pod yang sesuai dengan label yang ditentukan. |
Terapkan konfigurasi
-
Terapkan ConfigMap ke kluster:
kubectl apply -f koord-descheduler-config.yaml -
Mulai ulang Koordinator Descheduler agar menerapkan 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
Konfigurasi parameter lanjutan
Gunakan ConfigMap untuk mengonfigurasi perilaku global dan pengaturan templat detail halus untuk Koordinator Descheduler.
Contoh konfigurasi lanjutan
Contoh berikut menunjukkan ConfigMap Koordinator Descheduler yang telah dikonfigurasi lengkap. Konfigurasi ini menggunakan DeschedulerConfiguration untuk pengaturan global, mengaktifkan RemovePodsViolatingNodeTaints sebagai kebijakan descheduling, dan menggunakan MigrationController sebagai evictor.
# 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-desheduler.
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 ke 120 detik dalam contoh ini.
nodeSelector: # Node yang terlibat dalam descheduling. Secara bawaan, semua node ikut dalam descheduling.
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # Sesuaikan berdasarkan kebutuhan Anda.
maxNoOfPodsToEvictPerNode: 10 # Jumlah maksimum pod yang dapat dievict dari satu node. Batas ini berlaku secara global. Secara bawaan, tidak ada batas.
maxNoOfPodsToEvictPerNamespace: 10 # Jumlah maksimum pod yang dapat dievict dari satu namespace. Batas ini berlaku secara global. Secara bawaan, tidak ada batas.
# Konfigurasi di atas adalah konfigurasi sistem.
# Daftar templat.
profiles:
- name: koord-descheduler # Nama templat.
# Cakupan: terapkan templat ini hanya pada node tertentu.
# Metode 1: Pilih node dalam satu kelompok node.
nodeSelector:
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # Sesuaikan berdasarkan 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 plug-in dinonaktifkan secara bawaan. Tentukan yang ingin diaktifkan.
enabled:
- name: RemovePodsViolatingNodeTaints # Aktifkan plug-in verifikasi taint node.
balance: # Semua plug-in dinonaktifkan secara bawaan.
disabled:
- name: "*" # Nonaktifkan semua plug-in Balance.
evict:
enabled:
- name: MigrationController # MigrationController diaktifkan secara bawaan.
filter:
enabled:
- name: MigrationController # Gunakan kebijakan penyaringan MigrationController secara bawaan.
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 descheduling hanya pada namespace berikut.
- "namespace1"
- "namespace2"
# exclude: # Atau, kecualikan namespace berikut.
# - "namespace1"
# - "namespace2"
labelSelector: # Hanya deschedule pod yang sesuai dengan 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 dideschedule.
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 dalam satu workload.
objectLimiters:
workload: # Pembatasan laju migrasi tingkat workload. Bawaan: hanya 1 pod per workload dalam 5 menit.
duration: 5m
maxMigrating: 1
evictionPolicy: Eviction # Gunakan API Eviction secara bawaan.
Konfigurasi sistem
Konfigurasikan perilaku tingkat sistem global dalam DeschedulerConfiguration.
| Parameter | Tipe | Nilai valid | Deskripsi | Contoh |
|---|---|---|---|---|
dryRun |
boolean | true / false (bawaan: 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 descheduling. Mendukung matchLabels (satu kelompok node) atau matchExpressions (beberapa kelompok node). Lihat Kubernetes labelSelector. |
Lihat contoh YAML di atas |
maxNoOfPodsToEvictPerNode |
int | ≥0 (bawaan: 0) | Maksimum pod yang dievict dari satu node per siklus descheduling. Nilai 0 berarti tidak ada batas. | 10 |
maxNoOfPodsToEvictPerNamespace |
int | ≥0 (bawaan: 0) | Maksimum pod yang dievict dari satu namespace per siklus descheduling. Nilai 0 berarti tidak ada batas. | 10 |
Konfigurasi templat
Koordinator Descheduler menggunakan templat (profiles) untuk mengelompokkan kebijakan descheduling dan evictor. Setiap templat memiliki bidang berikut:
-
`name`: Pengenal string untuk templat.
-
`plugins`: Mengaktifkan atau menonaktifkan kebijakan descheduling (
deschedule,balance), evictor (evict), dan filter pra-eviction (filter). -
`pluginConfig`: Argumen lanjutan per plug-in. Atur bidang
nameagar sesuai dengan nama plug-in dan konfigurasikanargs. Lihat Konfigurasi plug-in kebijakan dan Konfigurasi plug-in evictor. -
`nodeSelector`: Membatasi cakupan templat hanya pada node tertentu. Jika tidak diatur, templat berlaku untuk semua node.
Bidang nodeSelector dalam konfigurasi templat memerlukan ack-koordinator v1.6.1-ack.1.16 atau lebih baru.
Referensi bidang `plugins`:
| Bidang | Plug-in yang didukung | Deskripsi |
|---|---|---|
deschedule |
RemovePodsViolatingNodeTaints, RemovePodsViolatingInterPodAntiAffinity, RemovePodsViolatingNodeAffinity, RemovePodsHavingTooManyRestarts, PodLifeTime, RemoveFailedPod |
Semua dinonaktifkan secara bawaan. Tentukan plug-in yang ingin diaktifkan. |
balance |
RemoveDuplicates, LowNodeUtilization, HighNodeUtilization, RemovePodsViolatingTopologySpreadConstraint, LowNodeLoad |
Semua dinonaktifkan secara bawaan. Tentukan plug-in yang ingin diaktifkan. |
evict |
MigrationController, DefaultEvictor |
Evictor pod. MigrationController diaktifkan secara bawaan. Jangan aktifkan beberapa plug-in evict secara bersamaan. |
filter |
MigrationController, DefaultEvictor |
Kebijakan penyaringan pra-eviction. MigrationController diaktifkan secara bawaan. Jangan aktifkan beberapa plug-in filter secara bersamaan. |
Konfigurasi plug-in kebijakan
Koordinator Descheduler mendukung enam plug-in Deschedule dan lima plug-in Balance dari Kubernetes Descheduler. Plug-in LowNodeLoad disediakan oleh Koordinator. Untuk informasi selengkapnya, lihat Bekerja dengan descheduling hotspot berbasis beban.
| Jenis kebijakan | Plug-in | Deskripsi |
|---|---|---|
| Deschedule | RemovePodsViolatingInterPodAntiAffinity | Meng-evict pod yang melanggar aturan anti-afinitas antar-pod. |
| Deschedule | RemovePodsViolatingNodeAffinity | Meng-evict pod yang tidak lagi memenuhi aturan afinitas node. |
| Deschedule | RemovePodsViolatingNodeTaints | Meng-evict pod yang tidak dapat mentoleransi taint node. |
| Deschedule | RemovePodsHavingTooManyRestarts | Meng-evict pod yang sering restart. |
| Deschedule | PodLifeTime | Meng-evict pod yang TTL-nya telah kedaluwarsa. |
| Deschedule | RemoveFailedPod | Meng-evict pod dalam status Failed. |
| Balance | RemoveDuplicates | Menyebarluaskan pod replikasi secara merata di berbagai node. |
| Balance | LowNodeUtilization | Mendistribusikan ulang pod berdasarkan alokasi sumber daya node. |
| Balance | HighNodeUtilization | Mengkonsolidasi pod dari node yang kurang dimanfaatkan ke node yang lebih dimanfaatkan. |
| Balance | RemovePodsViolatingTopologySpreadConstraint | Meng-evict pod yang melanggar batasan penyebaran topologi. |
Konfigurasi plug-in evictor
Koordinator Descheduler mendukung dua plug-in evictor: DefaultEvictor dan MigrationController.
MigrationController
MigrationController menyediakan kontrol eviction detail halus dan observabilitas melalui job migrasi.
| Parameter | Tipe | Nilai valid | Deskripsi | Contoh |
|---|---|---|---|---|
evictLocalStoragePods |
boolean | true / false (bawaan: false) | Jika false, pod yang menggunakan emptyDir atau hostPath tidak dideschedule. |
false |
maxMigratingPerNode |
int64 | ≥0 (bawaan: 2) | Maksimum pod yang dimigrasikan secara bersamaan pada satu node. Nilai 0 berarti tidak ada batas. | 2 |
maxMigratingPerNamespace |
int64 | ≥0 (bawaan: 0) | Maksimum pod yang dimigrasikan secara bersamaan dalam satu namespace. Nilai 0 berarti tidak ada batas. | 1 |
maxMigratingPerWorkload |
intOrString | ≥0 (bawaan: 10%) | Maksimum pod atau persentase yang dimigrasikan secara bersamaan dalam satu workload. Nilai 0 berarti tidak ada batas. Jika workload hanya memiliki satu pod, maka dikecualikan dari descheduling. | 1 atau 10% |
maxUnavailablePerWorkload |
intOrString | ≥0 dan < jumlah replica (bawaan: 10%) | Maksimum pod replikasi yang tidak tersedia dalam satu workload. Nilai 0 berarti tidak ada batas. | 1 atau 10% |
objectLimiters.workload |
Struktur | Duration >0 (bawaan: 5m); MaxMigrating ≥0 (bawaan: 10%) |
Membatasi laju migrasi tingkat workload dalam jendela waktu tertentu. Duration menentukan panjang jendela. MaxMigrating menentukan maksimum pod yang dimigrasikan dalam jendela tersebut. |
duration: 5m maxMigrating: 1 |
evictionPolicy |
string | Eviction (bawaan), Delete, Soft |
Mengontrol cara pod dievict. Eviction: memanggil API Eviction untuk eviction yang graceful. Delete: memanggil API Delete. Soft: menambahkan anotasi scheduling.koordinator.sh/soft-eviction untuk penanganan khusus di downstream. |
Eviction |
DefaultEvictor
DefaultEvictor adalah evictor standar Kubernetes Descheduler. Untuk detail konfigurasi, lihat DefaultEvictor.
MigrationController vs. DefaultEvictor
| Kemampuan | DefaultEvictor | MigrationController |
|---|---|---|
| Metode eviction | Hanya API Eviction | API Eviction, API Delete, atau anotasi Soft |
| Batas eviction per node | Didukung | Didukung |
| Batas eviction per namespace | Didukung | Didukung |
| Batas eviction per workload | Tidak didukung | Didukung |
| Batas ketidaktersediaan per workload | Tidak didukung | Didukung |
| Pembatasan laju eviction | Tidak didukung | Pembatasan berbasis jendela waktu per workload |
| Observabilitas eviction | Hanya log komponen | Log komponen dan event Kubernetes dengan status migrasi per pod |
Langkah selanjutnya
-
Untuk memahami konsep, fitur, dan alur kerja descheduling, lihat Descheduling.
-
Jika Anda menggunakan Kubernetes Descheduler komunitas, lihat Koordinator Descheduler dan Kubernetes Descheduler untuk memahami perbedaan dan menyelesaikan migrasi komponen.
-
Untuk mengonfigurasi descheduling hotspot berbasis beban menggunakan
LowNodeLoad, lihat Bekerja dengan descheduling hotspot berbasis beban. -
Untuk memahami penggunaan sumber daya kluster dan mendapatkan rekomendasi penghematan biaya, lihat Cost Insight.
-
Untuk troubleshooting, lihat FAQ Penjadwalan.
-
Untuk catatan rilis ack-koordinator dan ikhtisar komponen, lihat ack-koordinator (ack-slo-manager).