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.

Omówienie pul węzłów w NAP

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.
  • Wymagania dotyczące architektury i 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. Podczas pierwszej instalacji NAP zostanie utworzone domyślne NodePool ustawienie. Tę pulę węzłów można zmodyfikować lub utworzyć dodatkowe pule węzłów zgodnie z wymaganiami dotyczącymi obciążenia.

Kluczowe zachowania NodePools w ramach NAP

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.
  • Ochrona dostępu do sieci działa najlepiej z wzajemnie wykluczającymi się NodePools. Kiedy występuje wiele dopasowań NodePools, wykorzystuje to z największą wagą.

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:
        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

Tworzy również pulę węzłów system-surge, która ułatwia automatyczne skalowanie węzłów puli systemowej.

Kontrolowanie konfiguracji domyślnej puli węzłów podczas tworzenia klastra

Podczas tworzenia nowego klastra AKS z włączonym NAP przy użyciu Azure CLI, można dołączyć flagę --node-provisioning-default-pools, aby kontrolować konfigurację domyślnego NAP NodePool.

Flaga --node-provisioning-default-pools steruje domyślną konfiguracją NAP NodePool i 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. Należy je usunąć ręcznie, jeśli nie są już potrzebne.

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 [spot, regular]
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]

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ł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

Dostępne strefy dla regionu można znaleźć za pomocą polecenia az account list-locations --output table Azure CLI.

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. Można również określić górny limit zasobów używanych przez pulę węzłów, określając limity w ramach specyfikacji puli węzłów. Na przykład:

spec:
  # Resource limits constrain the total size of the cluster.
  # 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ę, w której ma być zaplanowane obciążenie, definiując względną wagę w definicjach puli węzłów. 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

Pule węzłów statycznych umożliwiają utworzenie stałej liczby węzłów przy użyciu replicas pola. W przypadku statycznych pul węzłów liczba węzłów zawsze będzie wynosić co najmniej wartość w polu replicas, niezależnie od oczekującego obciążenia zasobników. Można również ustawić maksymalną liczbę węzłów, do których ta pula węzłów może być zwiększana, ustawiając nodes w polu limits.

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  # Maximum number of nodes this node pool can scale up to

Uwaga / Notatka

W przypadku używania limits pola ze statycznymi pulami węzłów można dostosować tylko nodes: pole. Nie można ustawić zasobów.

Dalsze kroki

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