CodeBlanks Logo Icon CodeBlanks

kube-scheduler

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:

  1. Filtreleme: pod'u alamayacak node'lar elenir (yetersiz kaynak, taint, nodeSelector, affinity, port çakışması).
  2. 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-2

Yerleş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

terminal
# buraya yaz

Örnek çözüm

terminal
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: api
        topologyKey: kubernetes.io/hostname

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

Soru
              topologyKey: kubernetes.io/____
Cevap
              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

Uzman bölümündeki tüm dersler