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/