kube-scheduler
- Docker & Kubernetes kursu
- Uzman
- Ders 2/47
- 4 dk
kube-scheduler'ın Pod'ları node'lara atadığını öğrenirsin.
kube-scheduler
kube-scheduler, spec.nodeName'i boş olan pod'ları izler ve her biri için bir node seçip pod'a yazar (binding). Seçim iki aşamalıdır:
- Filtreleme: pod'u alamayacak node'lar elenir (yetersiz kaynak, taint, nodeSelector, affinity, port çakışması).
- Puanlama: kalanlar puanlanır (dengeli kaynak kullanımı, image'ın node'da olması, yayılma) ve en yüksek puanlı seçilir.
$ kubectl get events --field-selector reason=Scheduled | tail -1
Normal Scheduled pod/api-7f8c9 Successfully assigned magaza/api-7f8c9 to worker-2Yerleşimi yönlendirmek
Pod spec'i zamanlayıcıya ipuçları verir. podAntiAffinity aynı uygulamanın kopyalarını farklı node'lara dağıtır; topologySpreadConstraints kopyaları bölgeler (zone) arasında dengeler:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels: {app: api}
topologyKey: kubernetes.io/hostname
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels: {app: api}Uygulama Kopyaları ayır
Bir pod şablonunun affinity bölümünü yaz (affinity: ile başlayarak): podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution altında labelSelector.matchLabels app: api ve topologyKey: kubernetes.io/hostname.
Başlangıç kodu
# buraya yazÖrnek çözüm
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: api
topologyKey: kubernetes.io/hostnameBeklenen çıktı
deployment.apps/api configured $ kubectl get pods -l app=api -o wide NAME READY STATUS NODE api-6b5c4-abcde 1/1 Running worker-1 api-6b5c4-fghij 1/1 Running worker-2 api-6b5c4-klmno 1/1 Running worker-3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Filtreleme sonucunda hiç node kalmazsa pod ne olur?
- Rastgele bir node'a yerleşir
- Silinir
- control-plane'e yerleşir
- Pending kalır; FailedScheduling olayı yazılır Doğru cevap
Açıklama: Kaynak açıldığında ya da node eklendiğinde zamanlayıcı yeniden dener.
2 Kopyaları farklı node'lara dağıtacak anahtarı yaz.
topologyKey: kubernetes.io/____
topologyKey: kubernetes.io/hostname
Açıklama: hostname etiketi her node'da farklıdır.
3 Eşleştir.
| Kavram | Anlamı |
|---|---|
filtreleme |
Uygun olmayanları ele |
puanlama |
En iyisini seç |
podAntiAffinity |
Kopyaları ayır |
topologySpreadConstraints |
Bölgelere yay |