9 Haziran 2020

Kubernetes Scheduler Nedir? - Bölüm 2

Bu yazı Kubernetes Scheduler Nedir? - Bölüm 1 'in devamıdır.

Kubernetes pod'ları düğümlere belli koşullara göre dağıtmayı sağlayan birkaç özelliğe sahiptir.

Node Selectors

Kubernetes'teki her nesne ilişkili bir etiket kümesidir. Etiketler Kubernetes nesneleri için tanımlayıcı meta veriler sağlarken, etiket seçiciler (label selectors) genellikle çeşitli işlemler için API nesne kümelerini dinamik olarak tanımlamak için kullanılır. Örneğin, etiketler ve etiket seçiciler, bir Kubernetes LoadBalancer'ın arkasındaki trafiğe hizmet veren pod gruplarını tanımlamak için kullanılır.

Bir pod tanımlamasında spec.nodeSelector değeri eklenerek belirli bir düğüm kümesine veya tek bir düğüme dağıtılması istenir.

Örnek olarak, SSD gibi yüksek performanslı depolama alanına sahip bir makineye, belirli Pod'lar dağıtılmak istenebilir. Bu özelliğe sahip her makineye aşağıdaki gibi ekstra bir etiket verilecektir:

kind: Node
metadata:
  - labels:
      ssd: true
 ...

Her zaman SSD'ye sahip bir makineye dağıtılacak bir Pod oluşturmak için Pod'un nodeSelector değeri düğümdeki etikete uyacak şekilde ayarlanır:

kind: Pod
spec:
  nodeSelector:
    ssd: true

Kubernetes, varsa, her düğümün nodeSelector etiket sorgusuyla eşleşmesini gerektiren varsayılan bir predicate'e sahiptir. Böylece, ssd etiketine sahip her Pod her zaman uygun donanıma sahip bir düğüme dağıtılacaktır.

Önceki yazıda bahsedildiği gibi, nodeSelector yalnızca planlama sırasında değerlendirilir. Düğümler aktif olarak eklenir ve çıkarılırsa, pod çalıştığında, nodeSelector artık belirtilen düğümle eşleşmeyebilir.

Node Affinity

nodeSelector, bir pod'un belirli bir düğüme dağıtıldığını garanti etmenin basit bir yoludur, ancak esnek değildir. Özellikle, daha karmaşık mantıksal ifadeleri belirtemezler (örneğin, etiket City A yada B ise) veya antiaffinity de belirtemez (örneğin, etiket City A, ancak etiket Disk C değilse).

kind: Pod
---
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              # City == A or B
              - key: City
                operator: In
                values:
                  - A
                  - B

Antiaffinity örneği için, City etiketinin A değerine sahip olduğunu ve Disk etiketinin C'ye eşit olmadığını düşünün:

kind: Pod
---
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              # City == A
              - key: City
                operator: In
                values:
                  - A
              # Disk != C
              - key: Disk
                operator: NotIn
                values:
                  - C

Bir düğüm yerine bir gereksinim (veya bir gereksinime ek olarak) için bir öncelik belirtmek istenirse, preferDuringSchedulingIgnoredDuringExecution öğesi kullanılabilie. Örneğin, City etiketinin A veya B olmasını istediğimiz önceki örneğimizi kullanarak, A etiketli düğümlere zamanlama için bir tercih de ifade edelim. Tercih yapısındaki weight terimi, bir tercihin ne kadar önemli olduğunu ayarlamamızı sağlar.

kind: Pod
---
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              # City == A or B
              - key: City
                operator: In
                values:
                  - A
                  - B
      preferredDuringSchedulingIgnoredDuringExecution:
        preference:
          - weight: 1
            matchExpressions:
              # City == A
              - key: City
                operator: In
                values:
                  - A

requiredDuringSchedulingIgnoredDuringExecution ile verilen koşullar sağlanmalıdır. preferredDuringSchedulingIgnoredDuringExecution ile verilenler ise eğer şartlar sağlanmıyorsa yok sayılarak devam edilir.

Operator olarak kullanılabilecek tüm değerler: In, NotIn, Exists, DoesNotExist, Gt, Lt

Taints and Tolerations

Bazen, uygulamaların davranışlarını değiştirmelerini gerektirmeden pod dağıtımı değiştirilmek istenebilir.

Örneğin, kümeye eklenen yeni düğümler eskilerinden daha yüksek özelliklere sahip olmaya başladı. Bu durumda önceden eklenen düşük güce sahip düğümlere pod dağıtımı yapılması istenmeyebilir. Eski düğümleri işaretleyerek artık onlara dağıtım yapılması engellenebilir.

Tolerations pod'lara uygulanır ve pod'ların eşleşen taints'lere sahip düğümler üzerinde dağıtılmasına izin verir (ancak zorunlu değildir).

Aşağıdaki şekilde node1 düğümüne dağıtım yapılmasını engelleyebilirsiniz.

kubectl taint nodes node1 key=value:NoSchedule

Bu, herhangi bir pod'un, uygun bir toleransa sahip olmadığı sürece node1'e dağıtılamayacığı anlamına gelir.

Kaldırmak için:

kubectl taint nodes node1 key:NoSchedule-

Kaynaklar

  • https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
  • https://itnext.io/kubernetes-node-affinity-placing-pods-on-specific-nodes-8ea918dda9b9
  • https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/

Kubernetes Scheduler Nedir? - Bölüm 1

Vue.js Unit ve e2e Testler