Provisioning automatico dei nodi (anteprima)

Quando si distribuiscono carichi di lavoro nel servizio Azure Kubernetes, è necessario prendere una decisione sulla configurazione del pool di nodi in relazione alle dimensioni della macchina virtuale necessarie. Man mano che i carichi di lavoro diventano più complessi e richiedono l'esecuzione di CPU, memoria e funzionalità diverse, il sovraccarico di dover progettare la configurazione della macchina virtuale per numerose richieste di risorse diventa difficile.

Il provisioning automatico dei nodi (NAP) (anteprima) decide in base ai requisiti delle risorse pod in sospeso la configurazione ottimale della macchina virtuale per eseguire tali carichi di lavoro nel modo più efficiente e conveniente.

NAP si basa sul progetto open source Karpenter e il provider servizio Azure Kubernetes è anche Open Source. Protezione accesso alla rete (NAP) distribuisce e configura e gestisce automaticamente Karpenter nei cluster del servizio Azure Kubernetes.

Importante

Il provisioning automatico dei nodi per il servizio Azure Kubernetes è attualmente in ANTEPRIMA. Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.

Operazioni preliminari

Installare l'estensione dell'interfaccia della riga di comando di aks-preview

  1. Installare l'estensione dell'interfaccia della riga di comando aks-preview usando il comando az extension add.

    az extension add --name aks-preview
    
  2. Aggiornare l'estensione per assicurarsi che sia installata la versione più recente usando il comando az extension update.

    az extension update --name aks-preview
    

Registrare il flag di funzionalità NodeAutoProvisioningPreview

  1. Registrare il flag di funzionalità NodeAutoProvisioningPreview usando il comando az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    

    Sono necessari alcuni minuti per visualizzare lo stato Registered.

  2. Verificare lo stato della registrazione usando il comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. Quando lo stato diventa Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Limiti

  • L'unica configurazione di rete consentita è overlay CNI di Azurecon tecnologia Cilium.
  • Non è possibile abilitare in un cluster in cui il ridimensionamento automatico del cluster è abilitato per i pool di nodi

Funzionalità non supportate

  • Pool di nodi Windows
  • Applicazione della configurazione personalizzata al nodo kubelet
  • Cluster IPv6
  • Entità servizio

    Nota

    È possibile usare un'identità gestita assegnata dal sistema o una assegnata dall’utente.

  • Set di crittografia dischi
  • CustomCATrustCertificates
  • Modalità Start Stop
  • Proxy HTTP
  • Mutazione outboundType. Tutti gli outboundType sono supportati, ma non è possibile modificarli dopo la creazione.

Abilitare il provisioning automatico dei nodi

Abilitare il provisioning automatico dei nodi in un nuovo cluster

  • Abilitare il provisioning automatico dei nodi in un nuovo cluster usando il comando az aks create e impostarli --node-provisioning-mode su Auto. È anche necessario impostare il --network-plugin su azure, --network-plugin-mode su overlaye --network-dataplane su cilium.

    az aks create \
        --name $CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --node-provisioning-mode Auto \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --network-dataplane cilium \
        --generate-ssh-keys
    

Abilitare il provisioning automatico dei nodi in un cluster esistente

  • Abilitare il provisioning automatico dei nodi in un cluster esistente usando il comando az aks update e impostare --node-provisioning-mode su Auto. È anche necessario impostare il --network-plugin su azure, --network-plugin-mode su overlaye --network-dataplane su cilium.

    az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium
    

Pool di nodi

Il provisioning automatico del nodo usa un elenco di SKU di macchine virtuali come punto di partenza per decidere quale sia più adatto per i carichi di lavoro in sospeso. Avere il controllo sullo SKU desiderato nel pool iniziale consente di specificare famiglie di SKU specifiche o tipi di VM e la quantità massima di risorse usate da un provisioner.

Se si dispone di SKU di macchine virtuali specifici che sono istanze riservate, ad esempio, è possibile usare solo tali macchine virtuali come pool iniziale.

È possibile avere più definizioni di pool di nodi in un cluster, ma il servizio Azure Kubernetes distribuisce una definizione del pool di nodi predefinita che è possibile modificare:

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: Never
  template:
    spec:
      nodeClassRef:
        name: default

      # 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

Requisiti del provisioner dei nodi supportati

Selettori SKU con etichette note

Selettore Descrizione Esempio
karpenter.azure.com/sku-family Famiglia SKU D, F, L etc.
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.sh/capacity-type Tipo di allocazione della macchina virtuale (Spot/On Demand) spot o su richiesta
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 CPU 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 [true, false]
karpenter.azure.com/sku-storage-premium-capable Indica se la macchina virtuale supporta l'archiviazione I/O Premium [true, false]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Limite di dimensioni per il disco del sistema operativo temporaneo in Gb 92
topology.kubernetes.io/zone Zone di disponibilità [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Sistema operativo (Linux solo durante l'anteprima) linux
kubernetes.io/arch Architettura della CPU (AMD64 o ARM64) [amd64, arm64]

Per elencare le funzionalità dello SKU della macchina virtuale e i valori consentiti, usare il comando vm list-skus dell'interfaccia della riga di comando di Azure.

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

Limiti del pool di nodi

Per impostazione predefinita, Protezione accesso alla rete tenta di pianificare i carichi di lavoro entro la quota di Azure disponibile. È anche possibile specificare il limite massimo di risorse usate da un pool di nodi, specificando i limiti all'interno della specifica del pool di nodi.

  # Resource limits constrain the total size of the cluster.
  # Limits prevent Karpenter 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 deve essere pianificato un carico di lavoro. Definire il peso relativo nelle definizioni del pool di nodi.

  # 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

Aggiornamenti delle immagini del nodo e Kubernetes

Il servizio Azure Kubernetes con Protezione accesso alla rete gestisce gli aggiornamenti delle versioni di Kubernetes e gli aggiornamenti del disco del sistema operativo della macchina virtuale per impostazione predefinita.

Aggiornamenti di Kubernetes

Gli aggiornamenti di Kubernetes per i pool di nodi NAP seguono la versione kubernetes del piano di controllo. Se si esegue un aggiornamento del cluster, i nodi NAP vengono aggiornati automaticamente per seguire lo stesso controllo delle versioni.

Aggiornamenti dell'immagine del nodo

Per impostazione predefinita, le macchine virtuali del pool di nodi NAP vengono aggiornate automaticamente quando è disponibile una nuova immagine. Se si vuole aggiungere un pool di nodi a una determinata versione dell'immagine del nodo, è possibile impostare imageVersion nella classe del nodo:

kubectl edit aksnodeclass default

Nella definizione della classe del nodo impostare imageVersion su una delle versioni pubblicate elencate nelle note sulla versione del servizio Azure Kubernetes. È anche possibile visualizzare la disponibilità delle immagini nelle aree facendo riferimento allo strumento di rilevamento delle versioni del servizio Azure Kubernetes

ImageVersion è la parte relativa alla data nell'immagine del nodo perché è supportato solo Ubuntu 22.04, ad esempio "AKSUbuntu-2204-202311.07.0" sarà "202311.07.0"

apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
  annotations:
    kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
      nodes
    meta.helm.sh/release-name: aks-managed-karpenter-overlay
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2023-11-16T23:59:06Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
    helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
    helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
  name: default
  resourceVersion: "1792"
  uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
  imageFamily: Ubuntu2204
  imageVersion: 202311.07.0
  osDiskSizeGB: 128

La rimozione della specifica imageVersion ripristina l'aggiornamento del pool di nodi alla versione più recente dell'immagine del nodo.

Interruzione del nodo

Quando i carichi di lavoro nei nodi vengono ridimensionati, Protezione accesso alla rete usa regole di interruzione nella specifica del pool di nodi per decidere quando e come rimuovere tali nodi e potenzialmente riprogrammare i carichi di lavoro in modo che siano più efficienti.

È possibile rimuovere manualmente un nodo usando kubectl delete node, ma Protezione accesso alla rete può anche controllare quando deve ottimizzare i nodi.

  disruption:
    # Describes which types of Nodes NAP should consider for consolidation
    consolidationPolicy: WhenUnderutilized | WhenEmpty
    # 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost

    #  `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time NAP should wait after discovering a consolidation decision
    # This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
    # You can choose to disable consolidation entirely by setting the string value 'Never'
    consolidateAfter: 30s

Monitoraggio degli eventi di selezione

Il provisioning automatico dei nodi genera eventi del cluster che possono essere usati per monitorare le decisioni di distribuzione e pianificazione da prendere. È possibile visualizzare gli eventi tramite il flusso di eventi kubernetes.

kubectl get events -A --field-selector source=karpenter -w