Övning – Konfigurera spot-nodpooler med kluster-autoskalning i ett AKS-kluster

Slutförd

Med skalbara användarnodpooler kan du komma åt outnyttjad Azure-beräkningskapacitet till lägre priser med stöd för scenarier med högpresterande databehandling.

I föregående övning skapade du en standardpool för användarnoder, använde autoskalning av kluster för att hantera skapande av noder och skalade antalet noder manuellt.

Nästa steg är att du lägger till en spot-användarnodpool med automatisk skalning för att minska klustrets driftskostnader. Klusteranvändningen varierar beroende på vilka resurser som behövs och är inte förutsägbara, så du konfigurerar regler för att samla in toppar och dalar. Arbetsbelastningen distribueras med nodtillhörighet aktiverad så att podden schemaläggs på noder i nodpoolen för oanvänd kapacitet.

Skapa en spot-nodpool

Du måste skapa en separat nodpool som stöder batchbearbetningstjänsten. Den här nodpoolen är en spot-nodpool som använder principen för borttagning vid vräkning och ett högsta spotpris på -1.

  1. Kör samma az aks nodepool add-kommando som i föregående övning för att lägga till en ny spot nodpool i klustret. Du måste ändra namnet på nodpoolen och lägga till några fler parametrar för att identifiera den här nodpoolen som en spot-nodpool.

    Ange följande värden för att ange nodpoolens parametrar:

    • Namn: batchprocpl2
    • Prioritet: Spot
    • Borttagningsprincip: Delete
    • Maxpris på Spotmarknaden: -1

    Kör följande kommando för att skapa spot-nodpoolen:

    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
    

    Tänk på att den här begäran kan misslyckas på grund av kapacitetsbegränsningar på den plats som du har valt.

  2. Kör kommandot az aks nodepool show för att visa information om den nya spot-nodpoolen för batchbearbetningstjänsten.

    az aks nodepool show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2
    

    Här är ett exempel på utdata från kommandot.

    {
    "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
    }
    

    Några värden i det här resultatet skiljer sig tydligt från vad du har sett i tidigare nodpooler. Nu ska vi gå igenom följande:

    • Egenskapsvärdet enableAutoScaling är inställt på true.

    • Både värdena för maxCount och minCount anges.

    • Egenskapen scaleSetEvictionPolicy är inställd på Delete.

    • Egenskapen scaleSetPriority är inställd på Spot.

    • Egenskapen spotMaxPrice är inställd på -1.

    • nodeLabels och nodeTaints tillämpas på den här nodpoolen. Du använder dessa värden för att schemalägga arbetsbelastningar på noderna i nodpoolen.

Konfigurera ett namnområde

  1. Kör kommandot kubectl create namespace för att skapa ett namnområde med namnet costsavings för programmet. Du använder det här namnområdet för att göra det enklare att välja dina arbetsbelastningar.

    kubectl create namespace costsavings
    

    Här är utdata från föregående kommando:

    namespace/costsavings created
    

Schemalägg en pod med spotnodtillhörighet

Du kan schemalägga en pod att köras på en spotnod genom att lägga till en tolerans och en tillhörighet i podens distributionsmanifestfil. När toleransen och nodtillhörigheten motsvarar de taints och etiketter som är applicerade på dina spot-noder, schemaläggs podden på dessa noder.

Noderna i en spotnodpool tilldelas en taint som är lika med kubernetes.azure.com/scalesetpriority=spot:NoSchedule och en etikett som är lika med kubernetes.azure.com/scalesetpriority=spot. Använd informationen i det här nyckel-/värdeparet i avsnitt tolerations och affinity i YAML-manifestfilen för dina arbetslaster. Med den andra batchbearbetningspoolen konfigurerad som en spot-nodpool kan du nu skapa en distributionsfil för att schemalägga arbetsbelastningar som ska köras på den.

  1. Skapa en manifestfil för Kubernetes-distributionen med namnet spot-node-deployment.yaml med hjälp av den integrerade redigeraren:

    code spot-node-deployment.yaml
    

    Tips

    Cloud Shell innehåller en integrerad filredigerare. Cloud Shell-redigeraren stöder funktioner som språkmarkering, kommandopaletten och en utforskare. Om du vill skapa och redigera filer enkelt startar du redigeraren genom att köra code . i Cloud Shell-terminalen. Den här åtgärden öppnar redigeraren med din aktiva arbetskatalog inställd i terminalen. Om du vill öppna manifestfilen direkt för snabbredigering kör du code spot-node-deployment.yaml. Det här kommandot öppnar redigeraren utan utforskaren.

  2. Klistra in följande text i filen:

    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. Tryck på Ctrl+ S för att spara filen och tryck sedan på Ctrl + Q för att stänga redigeraren.

  4. Kör kommandot kubectl apply för att tillämpa konfigurationen och distribuera programmet i costsavings namnområde:

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

    Här är utdata från föregående kommando:

    pod/nginx created
    
  5. Du kan hämta mer information om podden som körs med hjälp av flaggan -o wide när du kör kommandot kubectl get pods. I det här fallet vill du se vilken nod podden är schemalagd för. Se till att fråga efter poddar i costsavings namnrymd.

    kubectl get pods --namespace costsavings -o wide
    

    Utdata bör likna följande:

    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>
    

    Observera namnet på noden aks-batchprocpl2-25254417-vmss000000. Den här noden är en del av den batchprocpl2 spotnodpool som du skapade tidigare.