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