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
- È necessaria una sottoscrizione di Azure. Se non hai una sottoscrizione Azure, crea un account gratuito.
- È necessario che l'interfaccia della riga di comando di Azure sia installata.
- Installare l'estensione dell'interfaccia della riga di comando di Azure
aks-preview
. Versione minima 0.5.170. - Registrare il flag NodeAutoProvisioningPreviewfeature.
Installare l'estensione dell'interfaccia della riga di comando di aks-preview
Installare l'estensione dell'interfaccia della riga di comando
aks-preview
usando il comandoaz extension add
.az extension add --name aks-preview
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
Registrare il flag di funzionalità
NodeAutoProvisioningPreview
usando il comandoaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
Sono necessari alcuni minuti per visualizzare lo stato Registered.
Verificare lo stato della registrazione usando il comando
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
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
suAuto
. È anche necessario impostare il--network-plugin
suazure
,--network-plugin-mode
suoverlay
e--network-dataplane
sucilium
.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
suAuto
. È anche necessario impostare il--network-plugin
suazure
,--network-plugin-mode
suoverlay
e--network-dataplane
sucilium
.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
Azure Kubernetes Service