Esercizio - Configurare più nodi e abilitare il ridimensionamento a zero in un cluster del servizio Azure Kubernetes

Completato

Il servizio Azure Kubernetes consente di creare pool di nodi diversi per associare carichi di lavoro specifici ai nodi in esecuzione in ogni pool.

Si ricordi dall'esempio di rilevamento dei droni che il team ha sviluppato un nuovo servizio di modellazione predittiva che elabora le informazioni sul percorso di volo in condizioni meteorologiche estreme e crea itinerari di volo ottimali. Questo servizio richiede il supporto delle macchine virtuali basate su GPU e viene eseguito solo in giorni specifici della settimana. Il team vuole assicurarsi che non vengano usate macchine virtuali quando il servizio non è in esecuzione.

Si procederà alla creazione di un cluster Kubernetes gestito dal servizio Azure Kubernetes (AKS). Successivamente, si configurerà il cluster per supportare più pool di nodi e si consentirà ai cluster di ridimensionare i nodi nei pool di nodi. Si aggiungerà quindi un secondo pool di nodi per supportare i carichi di lavoro utente con un conteggio di nodi dinamico. Infine, si ridurrà il numero di nodi a zero per ridurre il costo dei nodi usati nel cluster del servizio Azure Kubernetes.

Creare un nuovo gruppo di risorse

  1. Accedere ad Azure Cloud Shell usando il proprio account Azure. Selezionare la versione Bash di Cloud Shell.

  2. I valori creati qui verranno riutilizzati in tutti gli esercizi di questo modulo. Salvare l'output per l'utilizzo futuro.

  3. Scegliere un'area in cui ospitare il gruppo di risorse. Le funzionalità degli esercizi successivi non sono disponibili in tutte le aree. Per questo motivo, è consigliabile selezionare Stati Uniti orientali. Se si sceglie di usare un valore diverso, modificare il valore di REGION_NAME.

    Eseguire i comandi seguenti per registrare le variabili:

    REGION_NAME=eastus
    RESOURCE_GROUP=rg-akscostsaving
    AKS_CLUSTER_NAME=akscostsaving-$RANDOM
    

    Suggerimento

    È possibile usare il pulsante Copia per copiare i comandi negli Appunti. Per incollare, fare clic con il pulsante destro del mouse su una nuova riga nel terminale di Cloud Shell e scegliere Incolla oppure usare i tasti di scelta rapida MAIUSC+INS (⌘+V in macOS).

    È possibile controllare ogni valore eseguendo il echo comando , echo $REGION_NAMEad esempio .

  4. Prendere nota del valore di AKS_CLUSTER_NAME. In tutti gli esercizi si userà questo valore in un secondo momento per le impostazioni di pulizia e configurazione per il cluster.

    echo $AKS_CLUSTER_NAME
    
  5. Creare un nuovo gruppo di risorse denominato rg-akscostsaving. Tutte le risorse create in questi esercizi verranno distribuite in questo gruppo di risorse. Un singolo gruppo di risorse semplifica la pulizia delle risorse al termine del modulo.

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

Creare il cluster del servizio Azure Kubernetes

Dopo aver creato il gruppo di risorse, è possibile creare cluster del servizio Azure Kubernetes all'interno del gruppo. Il primo passaggio consiste nel ottenere la versione di Kubernetes nell'area selezionata. Questa versione è impostata per configurare il cluster.

  1. Per ottenere la versione di Kubernetes, eseguire il comando az aks get-versions. La query seguente restituisce una versione kubernetes non di anteprima. Archiviare il valore in una variabile Bash denominata VERSION. Per recuperare e archiviare il numero di versione, eseguire il comando seguente:

    VERSION=$(az aks get-versions \
        --location $REGION_NAME \
        --query "values[?isPreview==null].version | [-1]" \
        --output tsv)
    echo $VERSION
    
  2. Eseguire il az aks create comando per creare il cluster del servizio Azure Kubernetes. Il cluster viene eseguito con due nodi nel pool di nodi di sistema. Il completamento di questo comando può richiedere alcuni minuti.

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME \
        --location $REGION_NAME \
        --kubernetes-version $VERSION \
        --node-count 2 \
        --load-balancer-sku standard \
        --vm-set-type VirtualMachineScaleSets \
        --generate-ssh-keys
    

    Il comando az aks create dispone di diversi parametri che consentono una configurazione precisa del cluster Kubernetes. Esistono due parametri importanti per la configurazione del supporto corretto nel cluster per il ridimensionamento e la presenza di più pool di nodi:

    Parametro e valore Descrizione
    --load-balancer-sku standard Il supporto del servizio di bilanciamento del carico predefinito nel servizio Azure Kubernetes è basic. Il servizio di bilanciamento del carico basic non è supportato quando si usano più pool di nodi. Impostare il valore su standard.
    --vm-set-type VirtualMachineScaleSets Per usare le funzionalità di ridimensionamento nel servizio Azure Kubernetes, sono necessari i set di scalabilità di macchine virtuali. Questo parametro abilita il supporto per i set di scalabilità.

    Si noti che vengono configurati due nodi nel pool di nodi predefinito usando il parametro --node-count 2. Si ricordi da una descrizione precedente che i servizi di sistema essenziali vengono eseguiti in questo pool di nodi di sistema. È importante che i cluster di produzione usino almeno --node-count 3 per garantire l'affidabilità operativa del cluster. In questo esercizio vengono usati solo due nodi per considerazioni sui costi.

  3. Eseguire il comando az aks nodepool list per elencare i pool di nodi nel nuovo cluster:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Ecco un esempio dell'output del comando :

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Si noti che il pool di mode nodi è impostato su System e che l'oggetto name viene assegnato automaticamente.

Aggiungere un pool di nodi

  1. Il cluster ha un singolo pool di nodi. Aggiungere un secondo pool di nodi eseguendo il comando az aks nodepool add. Eseguire il comando in questo passaggio per creare un pool di nodi utente con tre nodi denominato batchprocpl. Tenere presente che i nomi dei pool di nodi devono iniziare con una lettera minuscola e contenere solo caratteri alfanumerici. I nomi dei pool di nodi possono essere costituiti da un massimo di 12 caratteri per i pool di nodi Linux e di sei caratteri per i pool di nodi Windows.

    Esegui questo comando:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl \
        --node-count 2
    
  2. Eseguire il comando az aks nodepool list per elencare il nuovo pool di nodi nel nuovo cluster:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Ecco un esempio dell'output del comando :

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
        "mode": "User",
        "name": "batchprocpl",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": {
          "maxSurge": null
        },
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      },
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Si noti che l'elemento mode del nuovo pool di nodi è impostato su User e che il name è batchprocpl.

Ridimensionare il numero di nodi del pool a zero

Eseguire il az aks nodepool scale comando per ridimensionare manualmente i nodi in un pool di nodi.

Eseguire il comando az aks nodepool scale e usare il parametro --node-count per impostare il valore del numero di nodi su 0.

Di seguito è riportato un esempio del comando:

az aks nodepool scale \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER_NAME \
    --name batchprocpl \
    --node-count 0

Ecco un esempio dell'output del comando :

{
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 0,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "User",
  "name": "batchprocpl",
  "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
  "nodeLabels": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.17.9",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-akscostsaving",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "upgradeSettings": {
    "maxSurge": null
  },
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null
}

Si noti che il valore del parametro count del pool di nodi è impostato su 0 e che il valore enableAutoScaling è impostato su null. Per pianificare i carichi di lavoro, è necessario aumentare manualmente il numero di nodi per questo pool, perché la creazione dei nodi non verrà eseguita automaticamente.

Configurare il contesto di Kubernetes

Nell'output del comando precedente il numero di pool di nodi è impostato su 0. È possibile verificare i nodi disponibili nel cluster eseguendo il comando kubectl get nodes.

  1. Eseguire kubectl per interagire con il server API del cluster. È necessario configurare un contesto del cluster Kubernetes per consentire la connessione di kubectl. Il contesto contiene l'indirizzo del cluster, un utente e uno spazio dei nomi. Eseguire il comando az aks get-credentials per configurare il contesto Kubernetes in Cloud Shell.

    Recuperare le credenziali del cluster eseguendo questo comando:

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME
    

    Di seguito è riportato un esempio di output del comando.

    Merged "akscostsaving-17835" as current context in /home/user/.kube/config
    
  2. Elencare i nodi nei pool di nodi.

    kubectl get nodes
    

    Di seguito è riportato un esempio di output del comando:

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-37990379-vmss000000   Ready    agent   32m   v1.17.9
    aks-nodepool1-37990379-vmss000001   Ready    agent   32m   v1.17.9
    

    Si noti che anche se il comando az aks nodepool list elenca due pool di nodi, sono disponibili solo due nodi nel cluster ed entrambi derivano da nodepool1.

Per ottimizzare i costi sul servizio Azure Kubernetes quando si gestiscono direttamente le richieste di carico di lavoro, una strategia efficace consiste nel:

  • Ridimensionare manualmente il numero di nodi nei pool di nodi.
  • Ridimensionare a zero i pool di nodi utente costosi basati su NV.

Si esaminerà ora una strategia in cui è necessario ridimensionare i nodi, ma non si controlla direttamente la richiesta.