Configurare i pool di nodi per il node auto-provisioning (NAP) in Servizio Azure Kubernetes (AKS)

Questo articolo illustra come configurare i pool di nodi per il provisioning automatico dei nodi in Servizio Azure Kubernetes (AKS), inclusi selettori sku, limiti delle risorse e pesi di priorità. Fornisce anche esempi che consentono di iniziare.

Servizio Azure Kubernetes automatico include NAP per impostazione predefinita. Per i cluster AKS Standard, è necessario abilitare NAP prima di configurare i relativi pool di nodi.

Come NAP seleziona le VM per i pool di nodi

NAP utilizza i requisiti delle SKU delle macchine virtuali per decidere le macchine virtuali migliori per i carichi di lavoro pendenti. È possibile configurare:

  • Famiglie di SKU e tipi di istanza specifici.
  • Limiti e priorità delle risorse.
  • Istanze spot o su richiesta.
  • Requisiti di architettura, GPU e altre funzionalità.

La risorsa NodePool imposta vincoli sui nodi che NAP crea e sui pod che vengono eseguiti in tali nodi. Quando si attiva NAP con la configurazione predefinita del pool di nodi impostata su Auto, vengono create risorse NodePool predefinite. È possibile modificare questi pool di nodi o creare pool di nodi aggiuntivi in base ai requisiti del carico di lavoro.

Come NAP valuta e seleziona i pool di nodi

Quando si configura NodePools per Protezione accesso alla rete, tenere presenti i comportamenti seguenti:

  • NAP richiede almeno un NodePool per funzionare.
  • NAP valuta ogni NodePool configurato.
  • Protezione accesso alla rete ignora NodePools che hanno taint non tollerati da un pod.
  • NAP applica i taint di avvio ai nodi di cui è stato effettuato il provisioning, ma non richiede la tolleranza dei pod.
  • NAP funziona al meglio con pool reciprocamente esclusivi NodePools, i cui requisiti non si sovrappongono, in modo che ogni pod corrisponda a un solo pool. Se più NodePools corrispondono, NAP utilizza quello con il peso più alto.

Esaminare la configurazione predefinita del pool di nodi

La configurazione dell'istanza predefinita di Karpenter NodePool denominata default creata da NAP è la seguente:

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 crea anche un pool di nodi system-surge che fornisce capacità Linux AMD64 su richiesta per i componenti aggiuntivi di sistema essenziali. Quando un pod in attesa tollera il taint CriticalAddonsOnly=true:NoSchedule e corrisponde ai requisiti del pool, NAP può eseguire il provisioning di un nodo da questo pool. I nodi creati dal pool hanno l'etichetta kubernetes.azure.com/mode: system .

Controllare i pool di nodi predefiniti

Quando si crea un nuovo cluster AKS abilitato con NAP usando interfaccia della riga di comando di Azure, includere il flag --node-provisioning-default-pools per controllare se AKS crea il valore predefinito NAP NodePools. Puoi anche usare questo flag con az aks update quando abiliti Network Access Protection (NAP) su un cluster esistente.

Il --node-provisioning-default-pools flag accetta i valori seguenti:

  • Auto (impostazione predefinita): crea due standard NodePools per l'uso immediato.
  • None: non crea alcun oggetto NodePools. È necessario definire il proprio.

Avvertimento

Passaggio da Auto a None: se si modifica l'impostazione da Auto a None in un cluster esistente, il valore predefinito NodePools non viene eliminato automaticamente. Prima di eliminarli, definire la capacità di sostituzione appropriata per i componenti aggiuntivi critici del sistema. Se non sono più necessari, è necessario eliminare manualmente il valore predefinito NodePools .

Opzioni di configurazione del pool di nodi

Le sezioni seguenti illustrano varie opzioni di configurazione per NodePools in NAP, tra cui etichette comunemente note e selettori SKU, limiti del pool di nodi, e pesi del pool di nodi.

Etichette conosciute e selettori SKU

Kubernetes definisce etichette note implementate da Azure. È possibile definire queste etichette nella spec.requirements sezione dell'API NodePool . NAP supporta anche etichette specifiche di Azure per una pianificazione più avanzata.

La tabella seguente elenca le etichette che è possibile usare nella sezione dell'API spec.requirements per definire le caratteristiche della NodePool macchina virtuale per i nodi:

Selector Description Example
karpenter.sh/capacity-type Tipo di allocazione della macchina virtuale (spot/su richiesta) Spot (Contante)
karpenter.azure.com/sku-family Famiglia di SKU VM D, F, L, ecc.
karpenter.azure.com/sku-series Serie di SKU VM Dpls_v6
karpenter.azure.com/sku-name Nome dello SKU esplicito Standard_A1_v2
karpenter.azure.com/sku-version Versione SKU (senza "v", può usare 1) 1, 2
karpenter.azure.com/sku-cpu Numero di CPU nella macchina virtuale 16
karpenter.azure.com/sku-memory Memoria nella macchina virtuale in MiB 131072
karpenter.azure.com/sku-gpu-name Nome GPU A100
karpenter.azure.com/sku-gpu-manufacturer Produttore GPU nvidia
karpenter.azure.com/sku-gpu-count Conteggio GPU per macchina virtuale 2
karpenter.azure.com/sku-networking-accelerated Indica se la macchina virtuale ha accelerato la rete [vero, falso]
karpenter.azure.com/sku-storage-premium-capable Indica se la macchina virtuale supporta l'archiviazione I/O Premium [vero, falso]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Limite di dimensioni per il disco del sistema operativo temporaneo in GB 92
kubernetes.azure.com/sku-cpu Numero di CPU nella macchina virtuale 16
kubernetes.azure.com/sku-memory Memoria nella macchina virtuale in MiB 131072
kubernetes.azure.com/cluster Nome del cluster AKS my-cluster
kubernetes.azure.com/mode Modalità pool di nodi [sistema, utente]
kubernetes.azure.com/priority Priorità [spot, regolare]
kubernetes.azure.com/os-sku SKU del sistema operativo [Ubuntu, AzureLinux]
kubernetes.azure.com/fips_enabled Indica se FIPS è abilitato true
topology.kubernetes.io/zone Zone di disponibilità [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Sistema operativo linux
kubernetes.io/arch Architettura della CPU (AMD64 o ARM64) [amd64, arm64]

I valori del selettore di memoria in questa tabella sono i valori MiB segnalati nei nodi creati da Nap. Prima di aggiungere un selettore, esaminare le etichette nei nodi per confermare il valore usato dal cluster.

Esempi di famiglia di SKU

Il karpenter.azure.com/sku-family selettore consente di specificare le famiglie di macchine virtuali specifiche.

Famiglia Description
Serie D Macchine virtuali per utilizzo generico con rapporto cpu-memoria bilanciato
Serie F Macchine virtuali ottimizzate per il calcolo con rapporto elevato tra CPU e memoria
Serie E Macchine virtuali ottimizzate per la memoria per applicazioni a elevato utilizzo di memoria
Serie L Macchine virtuali ottimizzate per l'archiviazione con velocità effettiva elevata del disco
Serie N Macchine virtuali abilitate per GPU per carichi di lavoro a elevato utilizzo di calcolo

Configurazione di esempio con la famiglia di SKU:

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

Esempio di SKU GPU

Per eseguire il provisioning dei nodi GPU NVIDIA con NAP, creare un NodePool che seleziona dimensioni di VM abilitate per GPU. L'esempio seguente consente a Nap di selezionare GLI SKU GPU NVIDIA serie N:

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

Se si desidera che il servizio Azure Kubernetes installi e gestisca il driver GPU NVIDIA, il plug-in del dispositivo, l'esportatore di metriche di Data Center GPU Manager (DCGM) e i segnali di integrità della GPU nei nodi GPU di cui è stato eseguito il provisioning tramite NAP, configurare la GPU gestita nel riferimento AKSNodeClass. Per altre informazioni, vedere Creare un pool di nodi GPU gestito dal servizio Azure Kubernetes.

Esempi di nomi SKU

Il karpenter.azure.com/sku-name selettore consente di specificare il tipo esatto di istanza della macchina virtuale.

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

Esempi di versione SKU

Il karpenter.azure.com/sku-version selettore è destinato a generazioni specifiche di SKU di MACCHINE virtuali.

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

Esempio di zona di disponibilità

Il topology.kubernetes.io/zone selettore consente di specificare le zone di disponibilità per i nodi.

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

Annotazioni

Per elencare le dimensioni delle macchine virtuali che supportano le zone di disponibilità in un'area, usare il az vm list-skus comando con i --location <region> --zone --output table parametri . Verifica che la dimensione della macchina virtuale selezionata supporti le zone indicate nel requisito NodePool.

Esempio di architettura

Il kubernetes.io/arch selettore consente di specificare l'architettura della CPU per i nodi. NAP supporta sia amd64 che arm64 i nodi.

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

Esempio di sistema operativo

Il kubernetes.io/os selettore consente di specificare il sistema operativo per i nodi.

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

Esempio di tipo di capacità

Il karpenter.sh/capacity-type selettore consente di specificare se usare istanze Spot o On demand.

Annotazioni

Protezione accesso alla rete assegna priorità alle istanze spot quando vengono specificate sia le istanze spot sia le istanze su richiesta.

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

Limiti del pool di nodi

Per impostazione predefinita, la Network Allocation Policy (NAP) tenta di pianificare i carichi di lavoro entro la quota disponibile di Azure. Per un pool di nodi dinamico, è possibile specificare limiti aggregati delle risorse in tutti i nodi di cui è stato effettuato il provisioning da tale pool. Nell'esempio seguente, cpu: "1000" limita il pool a 1.000 core vCPU e memory: 1000Gi lo limita a 1.000 gibibyte di memoria:

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

Pesi del pool di nodi

Dopo aver definito più pool di nodi, è possibile impostare una preferenza per la posizione in cui un carico di lavoro deve essere pianificato definendo il peso relativo nelle definizioni del pool di nodi. Il weight campo accetta un numero intero compreso tra 1 e 100 e i valori superiori assegnano una priorità più alta al pool di nodi. Se si omette weight, il relativo valore è effettivamente 0. Per esempio:

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

Pool di nodi statici

I pool di nodi statici mantengono il numero fisso di nodi con provisioning NAP specificato nel campo replicas, indipendentemente dalla richiesta di pod. Per modificare il numero di nodi, eseguire esplicitamente il ridimensionamento di NodePool, ad esempio usando kubectl scale con nodepool static-node-pool --replicas=7. Il valore facoltativo limits.nodes vincola il ridimensionamento esplicito e la capacità temporanea creata durante la sostituzione dei nodi. Per i pool di nodi statici, nodes è l'unico campo supportato in limits. Non è possibile impostare limiti di CPU o memoria.

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

Annotazioni

Per i pool di nodi statici, è possibile impostare solo nodes nel limits campo . Non è possibile impostare i limiti delle risorse o weighte il consolidamento delle interruzioni non si applica. Dopo aver creato un NodePoologgetto , non è possibile spostarlo tra le modalità statiche e dinamiche aggiungendo o rimuovendo il replicas campo.

Passaggi successivi

Per altre informazioni sul provisioning automatico dei nodi in AKS (Azure Kubernetes Service), vedere gli articoli seguenti: