Kubernetes Pod'u Belirli Node'da Çalıştırmak: Node Affinity

Kubernetes'te bir Pod'u belirli bir node'da çalıştırmak gerekebilir. Örneğin GPU gerektiren uygulamalar, yüksek bellek ihtiyacı olan servisler veya özel donanımlı makineler. Node Affinity bu sorunu çözer.

Node Affinity iki türde çalışır: requiredDuringSchedulingIgnoredDuringExecution (zorunlu) ve preferredDuringSchedulingIgnoredDuringExecution (tercih). İlki Pod'u sadece uygun node'da başlatır, ikincisi uygun node varsa oraya koyar ama zorlama yapmaz.

Önce node'larınıza etiket ekleyin:

1kubectl label nodes node-1 disktype=ssd gpu=true
2kubectl label nodes node-2 disktype=hdd

Etiketleri doğrulayın:

1kubectl get nodes --show-labels

Şimdi Pod manifestini yazın. GPU'lu node'da çalışması gereken bir uygulamayı konumlandıralım:

1apiVersion: v1
2kind: Pod
3metadata:
4name: gpu-app
5spec:
6affinity:
7nodeAffinity:
8requiredDuringSchedulingIgnoredDuringExecution:
9nodeSelectorTerms:
10- matchExpressions:
11- key: gpu
12operator: In
13values:
14- "true"
15containers:
16- name: app
17image: nvidia/cuda:11.0-base
18resources:
19limits:
20nvidia.com/gpu: 1

Pod'u oluşturun:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1kubectl apply -f gpu-pod.yaml
2kubectl get pods -o wide

Beklenen çıktı: Pod, gpu=true etiketine sahip node-1'de çalışır.

Tercih temelli bir örnek (preferred):

1apiVersion: v1
2kind: Pod
3metadata:
4name: standard-app
5spec:
6affinity:
7nodeAffinity:
8preferredDuringSchedulingIgnoredDuringExecution:
9- weight: 100
10preference:
11matchExpressions:
12- key: disktype
13operator: In
14values:
15- ssd
16containers:
17- name: app
18image: nginx:latest

Bu Pod SSD'li node'u tercih eder ama gerekirse HDD'li node'da da çalışır.

Sık hata: operator alanını yanlış yazma. Geçerli değerler: In, NotIn, Exists, DoesNotExist, Gt, Lt. Typo yaparsanız Pod başlamaz.

Node Affinity ile Pod yerleşimini tam kontrol altına alırsınız. bknz: Kubernetes CronJob ile Periyodik Yedekleme Otomatikleştirme

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • biriktirdiklerim

    ay bu node affinity işi aslında çok pratik ben de daha önce kuberneteste podları rastgele nodelara dağıtıp sonra kafam karışıyordu gpu olan makineye normal bir pod gidiyordu mesela şu required ve preferred ayrımı

  • adlı kullanıcıya yanıt verdi
    geceyarisi

    evet işte required kullanırsan pod o nodeda başlamazsa hiç başlamaz preferredda ise uğraşmaz sadece varsa git der gpu örneğinde required gerekli

  • adlı kullanıcıya yanıt verdi
    biriktirdiklerim

    ayy doğru ya mesela benim bir projemde gpu nodeu bakım için kapatıldığında required kullanmıştım o pod hiç başlamadı beklemesi hoş olmamıştı sonra preferrede geçtim en azından normal nodeda çalışabiliyor

  • adlı kullanıcıya yanıt verdi
    geceyarisi

    işte tam da bu yüzden preferred daha akıllıca oluyor çoğu zaman failover mekanizması gibi

  • adlı kullanıcıya yanıt verdi
    biriktirdiklerim

    evet ama bazen ikisini birleştirmek de işe yarıyor bence mesela critical olan podlar için required diğerleri için preferred koysam daha dengeli olur öyle herşey gpu nodunda beklemez ama önemli şeyler gidebiliyorum