Konfigurowanie pul węzłów na potrzeby automatycznej aprowizacji węzłów (NAP) w Azure Kubernetes Service (AKS)

W tym artykule wyjaśniono, jak skonfigurować pule węzłów na potrzeby automatycznej aprowizacji węzłów (NAP) w Azure Kubernetes Service (AKS), w tym selektory jednostek SKU, limity zasobów i wagi priorytetów. Zawiera również przykłady ułatwiające rozpoczęcie pracy.

AKS Automatic domyślnie obejmuje funkcję NAP. W przypadku klastrów AKS w warstwie Standard należy włączyć NAP, zanim skonfigurujesz ich pule węzłów.

Jak NAP wybiera maszyny wirtualne dla pul węzłów

NAP używa wymagań SKU maszyn wirtualnych, aby wybrać najlepsze maszyny wirtualne dla oczekujących obciążeń. Można skonfigurować:

  • Rodziny jednostek SKU i określone typy wystąpień.
  • Limity zasobów i priorytety.
  • Wystąpienia typu spot lub na żądanie.
  • Architektura, procesor GPU i inne wymagania dotyczące możliwości.

Zasób NodePool ustawia ograniczenia dotyczące węzłów tworzonych przez NAP oraz zasobników (pods) uruchamianych na tych węzłach. Po włączeniu NAP przy domyślnej konfiguracji puli węzłów ustawionej na Auto tworzone są zasoby default NodePool. Możesz zmodyfikować te pule węzłów lub utworzyć dodatkowe pule węzłów zgodnie z wymaganiami dotyczącymi obciążenia.

Jak NAP ocenia i wybiera pule węzłów

Podczas konfigurowania NodePools dla NAP, należy pamiętać o następujących zachowaniach:

  • System NAP wymaga co najmniej jednego NodePool do działania.
  • NAP ocenia każdą skonfigurowaną NodePool.
  • NAP pomija NodePools z skażeniami, które nie są akceptowane przez zasobnik.
  • Funkcjonalność NAP stosuje startowe 'tainty' do zaaprowizowanych węzłów, ale nie wymaga 'toleracji' dla podów.
  • NAP działa najlepiej z wzajemnie wykluczającymi się NodePools, których wymagania nie nakładają się na siebie, dzięki czemu każdy pod pasuje tylko do jednej puli. Gdy pasuje wiele elementów NodePools, NAP używa tego o najwyższej wadze.

Przejrzyj domyślną konfigurację puli węzłów

Konfiguracja domyślnego Karpentera NodePool o nazwie default utworzonej przez NAP jest następująca:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    spec:
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: default
      expireAfter: Never
      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D

NAP tworzy również pulę węzłów system-surge, która zapewnia zasoby Linux AMD64 dostępne na żądanie dla krytycznych dodatków systemowych. Jeśli oczekujący pod toleruje skażenie CriticalAddonsOnly=true:NoSchedule i spełnia wymagania puli, NAP może utworzyć węzeł z tej puli. Węzły utworzone przez pulę mają etykietę kubernetes.azure.com/mode: system .

Kontrolowanie domyślnych pul węzłów

Podczas tworzenia nowego klastra AKS z włączoną funkcją NAP za pomocą interfejsu wiersza polecenia Azure CLI uwzględnij flagę --node-provisioning-default-pools, aby określić, czy usługa AKS tworzy domyślny NodePools NAP. Możesz również użyć tej flagi wraz z az aks update, gdy włączasz NAP w istniejącym klastrze.

Flaga --node-provisioning-default-pools akceptuje następujące wartości:

  • Auto (ustawienie domyślne): tworzy dwa standardy NodePools do natychmiastowego użycia.
  • None: nie tworzy żadnego elementu NodePools. Musisz zdefiniować własne.

Ostrzeżenie

Zmiana wartości z Auto na None: jeśli zmienisz ustawienie z Auto na None w istniejącym klastrze, domyślne NodePools nie zostaną automatycznie usunięte. Przed ich usunięciem zdefiniuj odpowiednią pojemność zastępczą dla krytycznych dodatków systemu. Jeśli nie są już potrzebne, musisz usunąć wartość domyślną NodePools ręcznie.

Opcje konfiguracji puli węzłów

W poniższych sekcjach opisano różne opcje konfiguracji dla NodePools w NAP, w tym powszechnie znane etykiety i selektory SKU, a także limity puli węzłów i wagi puli węzłów.

Dobrze znane etykiety i selektory SKU

Kubernetes określa dobrze znane etykiety, które Azure implementuje. Te etykiety można zdefiniować w spec.requirements sekcji interfejsu NodePool API. NAP obsługuje również etykiety specyficzne dla Azure w celu bardziej zaawansowanego planowania.

W poniższej tabeli wymieniono etykiety, których można użyć w spec.requirements sekcji interfejsu NodePool API, aby zdefiniować charakterystyki VM dla węzłów:

Selector Description Example
karpenter.sh/capacity-type Typ alokacji maszyny wirtualnej (spot/na żądanie) Punkt
karpenter.azure.com/sku-family Rodzina jednostek SKU maszyny wirtualnej D, F, L itp.
karpenter.azure.com/sku-series Seria SKU VM Dpls_v6
karpenter.azure.com/sku-name Jawna nazwa jednostki SKU Standard_A1_v2
karpenter.azure.com/sku-version Wersja SKU (bez użycia "v", można użyć 1) 1, 2
karpenter.azure.com/sku-cpu Liczba procesorów w maszynie wirtualnej 16
karpenter.azure.com/sku-memory Pamięć w maszynie wirtualnej w MiB 131072
karpenter.azure.com/sku-gpu-name Nazwa procesora GPU A100
karpenter.azure.com/sku-gpu-manufacturer Producent procesora GPU nvidia
karpenter.azure.com/sku-gpu-count Liczba procesorów GPU na maszynę wirtualną 2
karpenter.azure.com/sku-networking-accelerated Czy maszyna wirtualna ma przyspieszoną sieć [prawda, fałsz]
karpenter.azure.com/sku-storage-premium-capable Czy maszyna wirtualna obsługuje magazyn I/O Premium [prawda, fałsz]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Limit rozmiaru dysku efemerycznego systemu operacyjnego (OS) w GB 92
kubernetes.azure.com/sku-cpu Liczba procesorów w maszynie wirtualnej 16
kubernetes.azure.com/sku-memory Pamięć w maszynie wirtualnej w MiB 131072
kubernetes.azure.com/cluster Nazwa klastra usługi AKS mój klaster
kubernetes.azure.com/mode Tryb puli węzłów [system, użytkownik]
kubernetes.azure.com/priority Priorytet punktowy, standardowy
kubernetes.azure.com/os-sku Jednostka SKU systemu operacyjnego [Ubuntu, AzureLinux]
kubernetes.azure.com/fips_enabled Czy włączono standard FIPS prawda
topology.kubernetes.io/zone Strefy dostępności [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os System operacyjny linux
kubernetes.io/arch Architektura procesora CPU (AMD64 lub ARM64) [amd64, arm64]

Wartości selektora pamięci w tej tabeli to wartości w MiB raportowane dla węzłów utworzonych przez NAP. Przed dodaniem selektora sprawdź etykiety w węzłach, aby potwierdzić wartość używaną przez klaster.

Przykłady rodziny jednostek SKU

Selektor karpenter.azure.com/sku-family umożliwia kierowanie określonych rodzin maszyn wirtualnych.

Rodzina Description
Seria D Maszyny wirtualne ogólnego przeznaczenia ze zrównoważonym współczynnikiem użycia procesora CPU do pamięci
Seria F Maszyny wirtualne zoptymalizowane pod kątem obliczeń z wysokim współczynnikiem użycia procesora CPU do pamięci
Seria E Maszyny wirtualne zoptymalizowane pod kątem pamięci dla aplikacji intensywnie korzystających z pamięci
Seria L Maszyny wirtualne zoptymalizowane do przechowywania z wysoką przepustowością dysku
Seria N Maszyny wirtualne z obsługą procesora GPU na potrzeby obciążeń intensywnie korzystających z obliczeń

Przykładowa konfiguracja przy użyciu rodziny jednostek SKU:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - D
  - F

Przykład jednostki SKU procesora GPU

Aby udostępnić węzły GPU NVIDIA przy użyciu NAP, utwórz obiekt NodePool, który wybiera rozmiary maszyn wirtualnych z obsługą GPU. Poniższy przykład umożliwia usłudze NAP wybór jednostek SKU procesorów graficznych NVIDIA z serii N:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - N
- key: karpenter.azure.com/sku-gpu-manufacturer
  operator: In
  values:
  - nvidia

Jeśli chcesz, aby usługa AKS instalowała i zarządzała sterownikiem GPU NVIDIA, wtyczką urządzenia, eksporterem metryk Data Center GPU Manager (DCGM) oraz sygnałami kondycji GPU na węzłach GPU aprowizowanych przez NAP, skonfiguruj zarządzany GPU w przywołanym elemencie AKSNodeClass. Aby uzyskać więcej informacji, zobacz Tworzenie puli węzłów procesora GPU zarządzanego przez usługę AKS.

Przykłady nazw SKU

Selektor karpenter.azure.com/sku-name pozwala określić dokładny typ maszyny wirtualnej.

requirements:
- key: karpenter.azure.com/sku-name
  operator: In
  values:
  - Standard_D4s_v3
  - Standard_F8s_v2

Przykłady wersji jednostki SKU

Selektor karpenter.azure.com/sku-version jest przeznaczony dla określonych generacji jednostek SKU maszyny wirtualnej.

requirements:
- key: karpenter.azure.com/sku-version
  operator: In
  values:
  - "3"  # v3 generation
  - "5"  # v5 generation

Przykład strefy dostępności

Selektor topology.kubernetes.io/zone umożliwia określenie stref dostępności dla węzłów.

requirements:
- key: topology.kubernetes.io/zone
  operator: In
  values:
  - eastus-1
  - eastus-2

Uwaga / Notatka

Aby wyświetlić listę rozmiarów maszyn wirtualnych obsługujących strefy dostępności w regionie, użyj az vm list-skus polecenia z parametrami --location <region> --zone --output table . Upewnij się, że wybrany rozmiar maszyny wirtualnej obsługuje strefy zgodnie z NodePool wymaganiami.

Przykład architektury

Selektor kubernetes.io/arch umożliwia określenie architektury CPU w węzłach. NAP obsługuje zarówno węzły amd64 i arm64.

requirements:
- key: kubernetes.io/arch
  operator: In
  values:
  - amd64
  - arm64

Przykład systemu operacyjnego

Selektor kubernetes.io/os umożliwia określenie systemu operacyjnego dla węzłów.

requirements:
- key: kubernetes.io/os
  operator: In
  values:
  - linux

Przykład typu pojemności

Selektor karpenter.sh/capacity-type umożliwia określenie, czy mają być używane instancje typu Spot czy On-demand.

Uwaga / Notatka

NAP nadaje priorytet instancjom Spot, gdy określono zarówno instancje Spot, jak i na żądanie.

requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values:
  - spot
  - on-demand

Limity puli węzłów

Domyślnie NAP próbuje zaplanować twoje obciążenia w ramach dostępnego limitu przydziału Azure. W przypadku dynamicznej puli węzłów można określić zagregowane limity zasobów dla wszystkich węzłów udostępnionych przez tę pulę. W poniższym przykładzie cpu: "1000" ogranicza pulę do 1000 rdzeni procesorów wirtualnych i memory: 1000Gi ogranicza ją do 1000 gibajtów pamięci:

spec:
  # Resource limits constrain the total size of the node pool.
  # Limits prevent Node Auto Provisioning from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

Wagi puli węzłów

Jeśli zdefiniowano wiele pul węzłów, można ustawić preferencję miejsca, w którym ma być zaplanowane obciążenie, definiując względną wagę w definicjach puli węzłów. Pole weight akceptuje liczbę całkowitą z zakresu od 1 do 100, a wyższe wartości dają puli węzłów wyższy priorytet. Jeśli pominiesz weight, jego wartość jest efektywnie równa 0. Przykład:

spec:
  # Priority given to the node pool when the scheduler considers which to select. 
  # Higher weights indicate higher priority when comparing node pools.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10

Pule węzłów statycznych

Statyczne pule węzłów utrzymują stałą liczbę węzłów udostępnionych przez NAP, określoną w polu replicas, niezależnie od zapotrzebowania na pody. Aby zmienić liczbę węzłów, jawnie zmień skalę NodePool, na przykład przy użyciu kubectl scale z nodepool static-node-pool --replicas=7. Opcjonalna wartość limits.nodes ogranicza jawne skalowanie i tymczasową pojemność utworzoną podczas wymiany węzła. W przypadku statycznych pul węzłów tylko pole nodes jest obsługiwane w sekcji limits; nie można ustawić limitów CPU ani pamięci.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-node-pool
spec:
  replicas: 5
  template:
    spec:
      requirements:
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
          - Standard_D4s_v3
          - Standard_F8s_v2
      - key: topology.kubernetes.io/zone
        operator: In
        values:
          - eastus-1
          - eastus-2
          - eastus-3
  limits:
    nodes: 10

Uwaga / Notatka

W przypadku pul węzłów statycznych można ustawić tylko nodes w limits polu. Nie można ustawić limitów zasobów ani weight, a konsolidacja zakłóceń nie ma zastosowania. Po utworzeniu elementu NodePoolnie można przełączać go między trybami statycznym i dynamicznym przez dodanie lub usunięcie replicas pola.

Dalsze kroki

Aby uzyskać więcej informacji o automatycznym aprowizowaniu węzłów w AKS, zobacz następujące artykuły: