Esercizio - Configurare pool di nodi spot con l'utilità di scalabilità automatica dei cluster in un cluster del servizio Azure Kubernetes
I pool di nodi utente spot consentono di accedere alla capacità di calcolo di Azure inutilizzata a prezzi inferiori, ma supportano comunque scenari di calcolo con prestazioni elevate.
Nell'esercizio precedente è stato creato un pool di nodi utente standard, è stato usato il componente di scalabilità automatica del cluster per gestire la creazione dei nodi e il numero di nodi è stato ridimensionato manualmente.
Il passaggio successivo consiste nell'aggiungere un pool di nodi utente spot con scalabilità automatica per ridurre i costi operativi del cluster. L'utilizzo del cluster varia in base alle risorse necessarie e non è prevedibile, quindi è possibile configurare le regole per acquisire i picchi e le immersioni. Il carico di lavoro viene distribuito con l'affinità dei nodi abilitata affinché il pod venga pianificato nei nodi del pool di nodi spot.
Creare un pool di nodi spot
È necessario creare un pool di nodi separato che supporti il servizio di elaborazione batch. Questo pool di nodi è un pool di nodi spot che usa il criterio di rimozione Elimina e un prezzo massimo per le istanze spot pari a -1.
Eseguire lo stesso comando
az aks nodepool add
usato nell'esercizio precedente per aggiungere un nuovo pool di nodi spot al cluster. È necessario modificare il nome del pool di nodi e aggiungere alcuni parametri per identificare il pool come pool di nodi spot.Immettere i valori seguenti per impostare i parametri del pool di nodi:
- Nome:
batchprocpl2
- Priorità:
Spot
- Criterio di rimozione:
Delete
- Prezzo massimo per le istanze spot:
-1
Eseguire il comando seguente per creare il pool di nodi spot:
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl2 \ --enable-cluster-autoscaler \ --max-count 3 \ --min-count 1 \ --priority Spot \ --eviction-policy Delete \ --spot-max-price -1 \ --node-vm-size Standard_DS2_v2 \ --no-wait
Tenere presente che questa richiesta potrebbe non riuscire a causa delle restrizioni di capacità nella posizione selezionata.
- Nome:
Eseguire il comando
az aks nodepool show
per visualizzare i dettagli del nuovo pool di nodi spot per il servizio di elaborazione batch:az aks nodepool show \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl2
Di seguito è riportato un esempio di output del comando.
{ "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 3, "enableAutoScaling": true, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2", "maxCount": 3, "maxPods": 110, "minCount": 1, "mode": "User", "name": "batchprocpl2", "nodeImageVersion": "AKSUbuntu-1604-2020.06.10", "nodeLabels": { "kubernetes.azure.com/scalesetpriority": "spot" }, "nodeTaints": [ "kubernetes.azure.com/scalesetpriority=spot:NoSchedule" ], "orchestratorVersion": "1.17.9", "osDiskSizeGb": 128, "osType": "Linux", "provisioningState": "Creating", "proximityPlacementGroupId": null, "resourceGroup": "akscostsavinggrp", "scaleSetEvictionPolicy": "Delete", "scaleSetPriority": "Spot", "spotMaxPrice": -1.0, "tags": null, "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": { "maxSurge": null }, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null }
Alcuni valori di questo risultato sono notevolmente diversi rispetto a quelli visualizzati nei pool di nodi precedenti. Gli elementi diversi sono descritti di seguito:
Il valore della proprietà
enableAutoScaling
è impostato sutrue
.Sono impostati entrambi i valori
maxCount
eminCount
.La proprietà
scaleSetEvictionPolicy
è impostata suDelete
.La proprietà
scaleSetPriority
è impostata suSpot
.La proprietà
spotMaxPrice
è impostata su-1
.I
nodeLabels
enodeTaints
vengono applicati al pool di nodi. È possibile usare questi valori per pianificare i carichi di lavoro nei nodi del pool.
Configurare uno spazio dei nomi
Eseguire il comando
kubectl create namespace
per creare uno spazio dei nomi denominatocostsavings
per l'applicazione. Questo spazio dei nomi verrà usato per semplificare la selezione dei carichi di lavoro.kubectl create namespace costsavings
Ecco l'output del comando precedente:
namespace/costsavings created
Pianificare un pod con affinità dei nodi spot
È possibile pianificare l'esecuzione di un pod in un nodo spot aggiungendo la tolleranza e l'affinità al file manifesto della distribuzione del pod. Quando la tolleranza e l'affinità del nodo corrispondono al taint e all'etichetta applicati ai nodi spot, il pod viene pianificato in questi nodi.
Ai nodi in un pool di nodi spot viene assegnato un taint equivalente a kubernetes.azure.com/scalesetpriority=spot:NoSchedule
e un'etichetta equivalente a kubernetes.azure.com/scalesetpriority=spot
. Usare le informazioni in questa coppia chiave-valore nella sezione tolerations
e affinity
del file manifesto YAML dei carichi di lavoro. Con il secondo pool di elaborazione batch configurato come pool di nodi spot, è ora possibile creare un file di distribuzione per pianificare i carichi di lavoro da eseguire al suo interno.
Creare un file manifesto per la distribuzione Kubernetes denominato
spot-node-deployment.yaml
usando l'editor integrato:code spot-node-deployment.yaml
Suggerimento
Cloud Shell include un editor di file integrato. L'editor Cloud Shell supporta funzionalità quali l'evidenziazione del linguaggio, il riquadro comandi e uno strumento per l'esplorazione dei file. Per la creazione e la modifica di file semplici, avviare l'editor eseguendo
code .
nel terminale di Cloud Shell. Questa azione consente di aprire l'editor con la directory di lavoro attiva impostata nel terminale. Per aprire direttamente il file manifesto per la modifica rapida, eseguirecode spot-node-deployment.yaml
. Questo comando apre l'editor senza Esplora file.Incollare il testo seguente nel file:
apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent tolerations: - key: "kubernetes.azure.com/scalesetpriority" operator: "Equal" value: "spot" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "kubernetes.azure.com/scalesetpriority" operator: In values: - "spot"
Premere CTRL+S per salvare il file, quindi premere CTRL+Q per chiudere l'editor.
Eseguire il comando
kubectl apply
per applicare la configurazione e distribuire l'applicazione nello spazio dei nomicostsavings
:kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
Ecco l'output del comando precedente:
pod/nginx created
È possibile recuperare altre informazioni sul pod in esecuzione usando il flag
-o wide
quando si esegue il comandokubectl get pods
. In questo caso si vuole vedere in quale nodo è pianificato il pod. Assicurarsi di eseguire una query per i pod nello spazio dei nomicostsavings
.kubectl get pods --namespace costsavings -o wide
L'output sarà simile al seguente:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 43s 10.244.3.3 aks-batchprocpl2-25254417-vmss000000 <none> <none>
Osservare il nome del nodo,
aks-batchprocpl2-25254417-vmss000000
. Questo nodo fa parte del pool di nodi spotbatchprocpl2
creato in precedenza.