Esercizio - Configurare pool di nodi spot con l'utilità di scalabilità automatica dei cluster in un cluster del servizio Azure Kubernetes

Completato

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.

  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.

  2. 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 su true.

    • Sono impostati entrambi i valori maxCount e minCount.

    • La proprietà scaleSetEvictionPolicy è impostata su Delete.

    • La proprietà scaleSetPriority è impostata su Spot.

    • La proprietà spotMaxPrice è impostata su -1.

    • I nodeLabels e nodeTaints 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

  1. Eseguire il comando kubectl create namespace per creare uno spazio dei nomi denominato costsavings 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.

  1. 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, eseguire code spot-node-deployment.yaml. Questo comando apre l'editor senza Esplora file.

  2. 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"
    
  3. Premere CTRL+S per salvare il file, quindi premere CTRL+Q per chiudere l'editor.

  4. Eseguire il comando kubectl apply per applicare la configurazione e distribuire l'applicazione nello spazio dei nomi costsavings:

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    Ecco l'output del comando precedente:

    pod/nginx created
    
  5. È possibile recuperare altre informazioni sul pod in esecuzione usando il flag -o wide quando si esegue il comando kubectl 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 nomi costsavings.

    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 spot batchprocpl2 creato in precedenza.