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=true2kubectl label nodes node-2 disktype=hddEtiketleri 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: v12kind: Pod3metadata:4name: gpu-app5spec:6affinity:7nodeAffinity:8requiredDuringSchedulingIgnoredDuringExecution:9nodeSelectorTerms:10- matchExpressions:11- key: gpu12operator: In13values:14- "true"15containers:16- name: app17image: nvidia/cuda:11.0-base18resources:19limits:20nvidia.com/gpu: 1Pod'u oluşturun:
1kubectl apply -f gpu-pod.yaml2kubectl get pods -o wideBeklenen çıktı: Pod, gpu=true etiketine sahip node-1'de çalışır.
Tercih temelli bir örnek (preferred):
1apiVersion: v12kind: Pod3metadata:4name: standard-app5spec:6affinity:7nodeAffinity:8preferredDuringSchedulingIgnoredDuringExecution:9- weight: 10010preference:11matchExpressions:12- key: disktype13operator: In14values:15- ssd16containers:17- name: app18image: nginx:latestBu 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
5 yorum
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ı
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
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
işte tam da bu yüzden preferred daha akıllıca oluyor çoğu zaman failover mekanizması gibi
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