Lab 09 / 09Kubernetes scheduler simülatörü

Pod Tetris

kube-scheduler’ın pod’ları filtreleyip puanlayarak node’lara düşen bloklar gibi yerleştirişini izle — taint’ler, affinity, ölen bir node ve imdada yetişen cluster autoscaler ile. Ya da pod’ları kendin sürükle.

  • Kubernetes
  • Scheduling
  • Cluster autoscaler
Pod ekle
Puanlama
Scheduler

Otomatik oynatma · kontrolü almak için herhangi bir ayara dokunun

Çalışan
0
Bekleyen
0
Node
3
CPU req.
0%
Bellek req.
0%

    Sadeleştirilmiş kube-scheduler: NodeAffinity → TaintToleration → NodeResourcesFit filtreleri, ardından LeastAllocated (dağıt) ya da MostAllocated (sıkıştır) puanlama · node’lar: 4 CPU / 8Gi · scheduling gerçek kullanıma değil request’lere bakar · worker’lar biten Job’lar · autoscaler genel havuza node ekler (en fazla 5)

    Melih Kızmaz yaptı · tamamen tarayıcında çalışır

    Burada ne görüyorsunuz

    Her node’un iki kuyusu var: CPU ve bellek. Bir pod’un kuyulardan ne kadar yer kaplayacağını gerçek kullanımı değilrequest’leri belirliyor — gerçek scheduler da tam olarak böyle düşünüyor. Bekleyen her pod için kube-scheduler önce onu alamayacak node’ları eleyen filter eklentilerini çalıştırıyor (hazır değil, label uymuyor, tolere edilmeyen bir taint var, yer yetmiyor), sonra kalanları sıralayan score eklentilerini, en sonda da pod’u kazanana bind ediyor. Node’ların üstündeki rozetler her adımı gösteriyor; alttaki olay günlüğü kubectl describe pod ile aynı ifadeleri kullanıyor.

    Taint, toleration ve affinity

    gpu-1 üzerinde nvidia.com/gpu:NoSchedule taint’i var, yani sıradan pod’lar ondan uzak tutuluyor. ml pod’u bu taint’i tolere ediyor ve node affinity ile accelerator=gpuistiyor — toleration bir pod’un o node’a gitmesine sadece izin verir, onu oraya çekmez. postgresdisk=ssd istiyor; bu yüzden yalnızca node-b’ye yerleşebiliyor ve o node doluysa diğerleri ne kadar boş olursa olsun Pending kalıyor.

    Arızalar ve autoscaler

    Bir node heartbeat göndermeyi kestiğinde NotReady oluyor ve bir bekleme süresinden sonra pod’ları çıkarılıyor; controller’ları yerlerine yenilerini oluşturuyor ve onlar kuyruğa geri dönüyor. Hiçbir şey sığmazsa pod’lar bir FailedScheduling olayıyla Pending kalıyor — cluster autoscaler tam olarak bunu izliyor, bir node grubundan gelecek yeni bir node’un işe yarayıp yaramayacağını simüle ediyor ve ancak o zaman node ekliyor. Kısıtlarını hiçbir node grubunun karşılayamadığı bir pod’a yardım etmiyor ve yeterince uzun süre boş kalan node’ları kaldırıyor.

    Dağıtan puanlama (LeastAllocated) her node’da pay bırakıyor; sıkıştıran puanlama (MostAllocated) önce node’ları dolduruyor ki autoscaler boş kalanları kaldırabilsin — daha ucuz, ama tek bir arıza daha fazla pod’u yerinden ediyor. Buradaki süreler dakikalardan saniyelere sıkıştırıldı.