Kube-scheduler kullanarak Azure Kubernetes Service'teki (AKS) gelişmiş zamanlayıcı özellikleri için en iyi yöntemler

AKS gelişmiş zamanlayıcı özelliklerine yönelik en iyi yöntemler; düğümleri ayırmak için taint ve toleration kullanmayı, pod yerleşimini denetlemek için düğüm seçicileri ve düğüm yakınlığını kullanmayı ve iş yükü dağıtımını kümenizde yönetmek için podlar arası yakınlık/karşıt yakınlık kullanmayı içerir. Azure Kubernetes Service'te (AKS) kümeleri yönetirken genellikle ekipleri ve iş yüklerini yalıtmalısınız. Kubernetes zamanlayıcı tarafından sağlanan gelişmiş özellikler şunları denetlemenizi sağlar:

  • Hangi podların belirli düğümlerde zamanlanabileceği.
  • Çok podlu uygulamaların küme genelinde uygun şekilde nasıl dağıtılabildiği.

Bu en iyi yöntemler makalesi, küme operatörleri için gelişmiş Kubernetes zamanlama özelliklerine odaklanır. Bu makalede şunları öğreneceksiniz:

  • Düğümlerde hangi pod'ların zamanlanabileceğini sınırlamak için taint'ler ve tolere etme kullanın.
  • Belirli düğümlerde, düğüm seçicileri veya düğüm yakınlığı ile çalıştırılacak podları tercih edin.
  • Podlar arasındaki yakınlık veya karşıtlık durumlarına göre podları ayırın veya bir araya getirin.
  • GPU gerektiren iş yüklerinin zamanlamasını yalnızca zamanlanabilir GPU'lara sahip düğümlerde kısıtlayın.

Toplu iş yüklerini zamanlamak ve kuyruğa almak için ek özellikler veya ML çerçeveleri gerekiyorsa AKS kümelerinde verimli, ilke temelli zamanlama sağlamak için AKS'ye Kueue yükleyebilir ve yapılandırabilirsiniz .

Podların ve işlerin belirli düğümlere, depolama kaynaklarına, topolojiye ve daha fazlasına öncelik verme şeklini iyileştirmek için ayrıntılı zamanlayıcı yapılandırması gerekiyorsa AKS'de bir zamanlayıcı yapılandırabilirsiniz.

Zamanlama özelliklerinin karşılaştırması

Feature Kullanım örneği Zamanlama davranışı Ne zaman seçileceği
Kirlilikler ve hoşgörüler Belirli iş yükleri (örn. GPU düğümleri) için düğümler ayırma Sabit kısıtlama: Eşleşen toleransı olmayan podlar, bozuk düğümlerde zamanlanamaz Katı düğüm yalıtımına ihtiyacınız olduğunda ve yetkisiz iş yüklerini önlemek istediğinizde
Düğüm seçicileri Basit etiket tabanlı pod yerleşimi Yumuşak kısıtlama: pod'lar eşleşen etiketlere sahip olmalıdır, ancak etiketsiz pod'lar yine de etiketlenmiş düğümlere atanabilir Basit etiket eşleştirme ile temel zamanlama denetimine ihtiyacınız olduğunda
Düğüm benzitesi Geri dönüş seçenekleriyle esnek düğüm hedefleme Yapılandırılabilir: Hem gerekli (sabit) hem de tercih edilen (yumuşak) eşleştirme kurallarını destekler Gelişmiş ifadelere ihtiyacınız olduğunda veya geri dönüş davranışıyla zamanlama tercihleri istediğinizde
Podlar arası benzeşim/benzeşimsizlik Pod’ları mevcut pod yerleşimine göre birlikte veya ayrı yerleştirme Düğümler üzerindeki diğer podlara göre pod dağılımını kontrol eder Podlar arası ilişkilerin önemli olduğu durumlarda (ör. uygulama ile önbelleği aynı düğümde konumlandırma veya replikaları dağıtma)

Lekeler ve toleranslar nedir?

Taint’ler ve toleration’lar, pod’lar düğüm üzerindeki taint’i açıkça tolere etmediği sürece düğümlerin pod’ları reddetmesine olanak tanıyan ve ayrılmış iş yükleri için katı yalıtım sağlayan bir Kubernetes mekanizmasıdır.

En İyi Yöntem: GPU düğümlerini ayırmak için renk tonlarını ve toleransları kullanma Giriş denetleyicileri gibi yoğun kaynak kullanımlı uygulamalar için erişimi belirli düğümlerle sınırlayın. Düğüm kaynaklarını gerektiren iş yükleri için kullanılabilir durumda tutun ve düğümlerde diğer iş yüklerinin zamanlanmasına izin vermeyin.

AKS kümenizi oluştururken GPU desteği veya çok sayıda güçlü CPU ile düğüm dağıtabilirsiniz. Daha fazla bilgi için bkz . AKS'de GPU'ları kullanma. Bu düğümleri makine öğrenmesi (ML) veya yapay zeka (AI) gibi büyük veri işleme iş yükleri için kullanabilirsiniz.

Bu düğüm kaynak donanımının dağıtılması genellikle pahalı olduğundan, bu düğümlerde zamanlanabilir iş yüklerini sınırlayın. Bunun yerine, giriş hizmetlerini çalıştırmak ve diğer iş yüklerini önlemek için kümedeki bazı düğümleri ayırın.

Farklı düğümler için bu destek, birden çok düğüm havuzu kullanılarak sağlanır. AKS kümesi bir veya daha fazla düğüm havuzunu destekler.

Kubernetes zamanlayıcı, düğümlerde hangi iş yüklerinin çalışabileceğini sınırlandırmak amacıyla leke ve toleranslar kullanır.

  • Bir düğüme yalnızca belirli podların üzerinde çalışabileceğini göstermek için bir taint uygulayın.
  • Ardından bir poda toleransı uygulayarak bir düğümün lekelerini tolere etmelerini sağlayın.

AKS kümesine bir pod dağıttığınızda, Kubernetes yalnızca tolerasyonla uyumlu lekelere sahip olan düğümlerde pod'ları zamanlayabilir. Bozulmalar ve toleranslar, podların uygun olmayan düğümlere zamanlanmadığından emin olmak için birlikte çalışır. Bir veya daha fazla leke bir düğüme uygulanır, düğüm bu lekeleri tolere etmeyen bağlanımları kabul etmeyecek şekilde işaretlenir.

AKS'de taint ve toleration'ları nasıl uygulayabilirim?

Örneğin, GPU desteğine sahip düğümler için AKS kümenize bir düğüm havuzu eklediğinizi varsayalım. Gpu gibi bir ad ve ardından zamanlama için bir değer tanımlarsınız. Bu değerin NoSchedule olarak ayarlanması, Kubernetes zamanlayıcısının düğümde tanımsız tolerans ile podları zamanlamasını kısıtlar.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name taintnp \
    --node-taints sku=gpu:NoSchedule \
    --no-wait

Düğüm havuzundaki düğümlere uygulanan bir taint ile, pod belirtiminde düğümlerde zamanlamaya izin veren bir tolerans tanımlarsınız. Önceki adımda düğüm havuzuna uygulanan taint'i tolere etmek için sku: gpu ve effect: NoSchedule'yi tanımlayan aşağıdaki örnek:

kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
  - name: app
    image: <your-workload>:gpu
    resources:
      requests:
        cpu: 0.5
        memory: 2Gi
      limits:
        cpu: 4.0
        memory: 16Gi
  tolerations:
  - key: "sku"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"

Bu pod kubectl apply -f gpu-toleration.yaml kullanılarak dağıtıldığında, Kubernetes taint uygulanmış düğümlerde podu başarıyla zamanlayabilir. Bu mantıksal yalıtım, küme içindeki kaynaklara erişimi denetlemenize olanak tanır.

Düğüm havuzlarını birden çok uygulama için ayırın

Farklı uygulamalara ayrı düğümler ayırmak için benzersiz bir taint ve eşleşen etikete sahip her uygulama için bir düğüm havuzu oluşturun. Taint, diğer pod'ların düğüm havuzuna zamanlanmasını engellerken etiket ise bir uygulamanın yalnızca kendisine ayrılmış düğüm havuzunda çalışmasını zorunlu kılmanızı sağlar.

Aşağıdaki örnek, ön uç ve arka uç uygulamaları için ayrı düğüm havuzları oluşturur:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name frontpool \
    --node-count 1 \
    --labels workload=frontend \
    --node-taints workload=frontend:NoSchedule

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name backpool \
    --node-count 1 \
    --labels workload=backend \
    --node-taints workload=backend:NoSchedule

adlı dedicated-apps.yaml bir dosya oluşturun ve aşağıdaki pod tanımlarını ekleyin. Her pod, düğüm havuzunun taint değeriyle eşleşen bir toleransa ve karşılık gelen düğüm havuzu etiketine ihtiyaç duyan bir nodeSelector toleransa sahiptir:

apiVersion: v1
kind: Pod
metadata:
  name: frontend
  labels:
    app: frontend
spec:
  nodeSelector:
    workload: frontend
  tolerations:
  - key: "workload"
    operator: "Equal"
    value: "frontend"
    effect: "NoSchedule"
  containers:
  - name: frontend
    image: mcr.microsoft.com/oss/nginx/nginx:1.25.5
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 250m
        memory: 256Mi
---
apiVersion: v1
kind: Pod
metadata:
  name: backend
  labels:
    app: backend
spec:
  nodeSelector:
    workload: backend
  tolerations:
  - key: "workload"
    operator: "Equal"
    value: "backend"
    effect: "NoSchedule"
  containers:
  - name: backend
    image: mcr.microsoft.com/oss/nginx/nginx:1.25.5
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 250m
        memory: 256Mi

Bildirimi uygulayın:

kubectl apply -f dedicated-apps.yaml

Her podunun beklenen iş yükü etiketine sahip bir düğümde çalıştığını doğrulayın:

kubectl get pods -o wide
kubectl get nodes -L workload

frontend pod’u, workload=frontend etiketiyle işaretlenmiş bir düğümde zamanlanmıştır ve backend pod’u, workload=backend etiketiyle işaretlenmiş bir düğümde zamanlanmıştır. Tek başına tolerans, bir pod'un bozuk bir düğüm kullanmasına izin verir, ancak bu düğümde yerleştirme gerektirmez. nodeSelector bu gereksinimi sağlar.

Artık ihtiyacınız kalmadığında örnek kaynakları silin:

kubectl delete -f dedicated-apps.yaml

az aks nodepool delete \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name frontpool

az aks nodepool delete \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name backpool

Renk tonları uyguladığınızda, uygulama geliştiricileriniz ve sahiplerinizle birlikte çalışarak dağıtımlarında gerekli toleransları tanımlamalarına izin verin.

AKS'de birden çok düğüm havuzu kullanma hakkında daha fazla bilgi için bkz . AKS'de bir küme için birden çok düğüm havuzu oluşturma.

AKS'de renk tonlarının ve toleransların davranışı

AKS'de bir düğüm havuzunu yükselttiğinizde, lekeler ve tolerasyonlar, yeni düğümlere uygulandığında belirli bir düzene göre takip edilir.

Azure Sanal Makine Ölçek Kümeleri kullanan varsayılan kümeler

AKS API'sini kullanarak bir düğüm havuzuna leke uygulayarak, yeni ölçeklenen düğümlerin API tarafından belirlenen lekeleme ayarlarını almasını sağlayabilirsiniz.

Şöyle düşünelim:

  1. İki düğümlü bir kümeyle başlarsınız: node1 ve node2.
  2. Düğüm havuzunu yükseltin.
  3. İki düğüm daha oluşturulur: node3 ve node4.
  4. Kusurlar sırasıyla geçirilir.
  5. Özgün düğüm1 ve düğüm2 silinir.

Sanal Makine Ölçek Kümeleri desteği olmayan kümeler

Yine şunu varsayalım:

  1. İki düğümlü bir kümeniz var: node1 ve node2.
  2. Düğüm havuzunu yükseltin.
  3. Ek bir düğüm oluşturulur: node3.
  4. node1'den gelen taintler node3'e uygulanır.
  5. node1 silindi.
  6. Özgün düğüm1'in yerini alacak yeni bir düğüm1 oluşturulur.
  7. Node2 renk tonları yeni node1'e uygulanır.
  8. node2 silindi.

Özünde, node1node3 olur ve node2 yeni node1 olur.

AKS'de bir düğüm havuzunu ölçeklendirdiğinizde, taint'ler ve toleranslar tasarım gereği otomatik olarak aktarılmaz.

Düğüm seçicileri ve düğüm benzitesi nedir?

Düğüm seçicileri ve düğüm benzitesi, podların düğüm etiketlerine göre hangi düğümler üzerinde çalışacakları tercihlerini belirtmesine olanak tanıyan Kubernetes özellikleridir.

En İyi Yöntem: Pod yerleşimini donanım türüne göre denetlemek için düğüm seçicileri ve benzimliği kullanma Düğüm seçicileri, düğüm benzitesini veya podlar arası benziteyi kullanarak düğümlerdeki podların zamanlamasını denetleyin. Bu ayarlar Kubernetes zamanlayıcısının düğümdeki donanım gibi iş yüklerini mantıksal olarak yalıtmasına olanak sağlar.

Taints ve tolerations, kaynakları keskin bir sınır ile mantıksal olarak yalıtır. Pod bir düğümün taint'ini tolere etmiyorsa, düğümde zamanlanmaz.

Alternatif olarak düğüm seçicileri de kullanabilirsiniz. Örneğin, düğümleri yerel olarak bağlı SSD depolama alanını veya büyük miktarda belleği gösterecek şekilde etiketleyip pod belirtiminde bir düğüm seçici tanımlarsınız. Kubernetes bu podları uygun bir düğümde planlar.

Toleranslardan farklı olarak, eşleşen düğüm seçicisi olmayan podlar etiketlenmiş düğümlerde zamanlanabilir. Bu davranış, düğümlerdeki kullanılmayan kaynakların kullanmasına izin verir, ancak eşleşen düğüm seçiciyi tanımlayan podlara öncelik verir.

Şimdi yüksek miktarda belleğe sahip düğüm örneklerine göz atalım. Bu düğümler, yüksek miktarda bellek isteyen podların önceliğini belirler. Kaynakların boşta kalmadığından emin olmak için diğer podların çalışmasına da izin verir. Aşağıdaki örnek komut, myResourceGroup içindeki myAKSCluster öğesine hardware=highmem etiketine sahip bir düğüm havuzu ekler. Bu düğüm havuzundaki tüm düğümler bu etikete sahiptir.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name labelnp \
    --node-count 1 \
    --labels hardware=highmem \
    --no-wait

Pod belirtimi, bir düğüme atanan etiket kümesiyle eşleşen bir düğüm seçici belirlemek için nodeSelector özelliğini ekler.

kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
  - name: app
    image: <your-workload>:gpu
    resources:
      requests:
        cpu: 0.5
        memory: 2Gi
      limits:
        cpu: 4.0
        memory: 16Gi
  nodeSelector:
      hardware: highmem

Bu zamanlayıcı seçeneklerini kullandığınızda, pod belirtimlerini doğru şekilde tanımlamalarına izin vermek için uygulama geliştiricilerinizle ve sahiplerinizle birlikte çalışın.

Daha fazla bilgi için bkz Düğümlere Pod Atama düğüm seçicileri kullanma.

Düğüm benzitesi nedir?

Düğüm seçici, belirli bir düğüme pod atamaya yönelik temel bir çözümdür. Düğüm bağlamı, poddun bir düğümle eşleştirilememesi durumunda ne olacağını tanımlamanıza olanak sağlayarak daha fazla esneklik sunar. Şunları yapabilirsiniz:

  • Kubernetes zamanlayıcısının bir podu etiketli bir konak ile eşleştirmesini gerektir. Veya
  • Eşleşmeye öncelik verin, ancak eşleşme yoksa pod'un farklı bir konakta zamanlanmasına izin verin.

Aşağıdaki örnek, düğüm bağlılığını requiredDuringSchedulingIgnoredDuringExecution olarak ayarlar. Bu yakınlık, Kubernetes zamanlayıcının eşleşen etikete sahip bir düğüm kullanmasını gerektirir. Kullanılabilir düğüm yoksa pod, zamanlamanın devam etmesi için beklemesi gerekir. Podun farklı bir düğüme zamanlanabilmesi için bunun yerine değeri preferredDuringSchedulingIgnoreDuringExecution olarak ayarlayabilirsiniz:

kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
  - name: app
    image: <your-workload>:gpu
    resources:
      requests:
        cpu: 0.5
        memory: 2Gi
      limits:
        cpu: 4.0
        memory: 16Gi
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: hardware
            operator: In
            values:
            - highmem

Ayarın IgnoredDuringExecution bölümü, düğüm etiketleri değişirse podun düğümden çıkarılmaması gerektiğini gösterir. Kubernetes zamanlayıcı, yalnızca yeni zamanlanan podlar için güncellenmiş düğüm etiketlerini kullanır, düğümlerde zaten zamanlanmış olan podlar için kullanmaz.

Daha fazla bilgi için bkz Benzeşim ve karşıt-benzeşim.

Podlar arası yakınlık ve karşıt yakınlık nedir?

Kubernetes zamanlayıcısının iş yüklerini mantıksal olarak yalıtmaya yönelik son yaklaşımlarından biri podlar arası benzeşim veya benzeşimsizlik kullanmaktır. Bu ayarlar, podların mevcut eşleşen podu olan bir düğümde zamanlanmamasıveya zamanlanması gerektiğini tanımlar. Varsayılan olarak Kubernetes zamanlayıcı, düğümler arasında bir çoğaltma kümesinde birden çok pod zamanlamaya çalışır. Bu davranışla ilgili daha belirli kurallar tanımlayabilirsiniz.

Örneğin, Azure Yönetilen Redis kaynağını da kullanan bir web uygulamanız vardır.

  • Kubernetes zamanlayıcısının kopyaları düğümler arasında dağıtmasını istemek için pod anti-affinity kurallarını kullanırsınız.
  • Her bir web uygulaması bileşeninin ilgili önbellekle aynı konakta zamanlandığından emin olmak için bağıntı kurallarını kullanırsınız.

Podların düğümler arasındaki dağılımı, aşağıdaki örnekte gösterildiği gibidir.

Düğüm 1 Düğüm 2 Düğüm 3
webapp-1 webapp-2 webapp-3
önbellek-1 önbellek-2 önbellek-3

Podlar arası benzeşim ve zıt benzeşim, düğüm seçicilerinden veya düğüm benzeşiminden daha karmaşık bir dağıtım sağlar. Dağıtım ile kaynakları mantıksal olarak yalıtıp Kubernetes'in düğümlerdeki podları nasıl zamanlamasını denetlersiniz.

Azure Yönetilen Redis ile bu web uygulamasının tam bir örneği için bkz. Aynı düğümdeki podları birlikte yerleştirme.

Sonraki adımlar

Bu makale, gelişmiş Kubernetes zamanlayıcı özelliklerine odaklanmıştır. AKS'deki küme işlemleri hakkında daha fazla bilgi için aşağıdaki en iyi yöntemlere bakın: