Übung: Konfigurieren von Spot-Knotenpools mit der automatischen Clusterskalierung für einen AKS-Cluster

Abgeschlossen

Spot-Benutzer-Knotenpools ermöglichen Ihnen den Zugriff auf ungenutzte Azure Compute-Kapazität zu niedrigeren Preisen mit Unterstützung für High-Performance Computing-Szenarien.

In der vorherigen Übung haben Sie einen Standardbenutzerknotenpool mit Cluster-Autoskalierung erstellt, um die Erstellung von Knoten zu verwalten, und die Knotenanzahl manuell skaliert.

Im nächsten Schritt fügen Sie einen Spot-Benutzer-Knotenpool mit automatischer Skalierung hinzu, um die Betriebskosten Ihres Clusters zu senken. Die Nutzung von Clustern schwankt je nach den benötigten Ressourcen und ist nicht vorhersehbar. Richten Sie daher Regeln ein, um die Spitzenwerte und Einbrüche zu erfassen. Der Workload wird mit aktivierter Knotenaffinität bereitgestellt, so dass der Pod auf Knoten im Spot-Knotenpool eingeplant wird.

Erstellen eines Spot-Knotenpools

Sie müssen einen separaten Knotenpool erstellen, der den Batchverarbeitungsdienst unterstützt. Dieser Knotenpool ist ein Spot-Knotenpool, der die Entfernungsrichtlinie „Löschen“ und einen maximalen Spot-Preis von -1 verwendet.

  1. Führen Sie denselben az aks nodepool add-Befehl wie in der vorherigen Übung aus, um dem Cluster einen neuen Spot-Knotenpool hinzuzufügen. Sie müssen den Namen des Knotenpools ändern und ein paar weitere Parameter hinzufügen, um diesen Knotenpool als Spot-Knotenpool zu identifizieren.

    Geben Sie die folgenden Werte ein, um die folgenden Parameter für den Knotenpool festzulegen:

    • Name: batchprocpl2
    • Priorität: Spot
    • Entfernungsrichtlinie: Delete
    • Maximaler Spot-Preis: -1

    Führen Sie den folgenden Befehl aus, um den Spot-Knotenpool zu erstellen:

    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
    

    Beachten Sie, dass diese Anforderung aufgrund von Kapazitätsbeschränkungen an dem von Ihnen ausgewählten Standort möglicherweise fehlschlägt.

  2. Führen Sie den Befehl az aks nodepool show aus, um die Details zum neuen Spot-Knotenpool für den Batchverarbeitungsdienst anzuzeigen:

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

    Das folgende Beispiel zeigt eine Ausgabe des Befehls.

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

    In diesem Ergebnis gibt es einige Werte, die sich deutlich von denen in früheren Knotenpools unterscheiden. Sehen Sie sich diese Elemente nun an:

    • Der Eigenschaftswert enableAutoScaling ist auf true festgelegt.

    • Die Werte maxCount und minCount sind beide festgelegt.

    • Die scaleSetEvictionPolicy-Eigenschaft ist auf Delete festgelegt.

    • Die scaleSetPriority-Eigenschaft ist auf Spot festgelegt.

    • Die spotMaxPrice-Eigenschaft ist auf -1 festgelegt.

    • nodeLabels und nodeTaints wurden auf diesen Knotenpool angewendet. Sie verwenden diese Werte, um Workloads auf den Knoten im Knotenpool zu planen.

Konfigurieren eines Namespaces

  1. Führen Sie den Befehl kubectl create namespace aus, um ein Namespace namens costsavings für die Anwendung zu erstellen. Sie verwenden diesen Namespace, um die Auswahl ihrer Workloads zu vereinfachen.

    kubectl create namespace costsavings
    

    Dies ist die Ausgabe des vorherigen Befehls:

    namespace/costsavings created
    

Planen eines Pods mit der Affinität des Spot-Knotens

Sie können festlegen, dass ein Pod auf einem Spot-Knoten ausgeführt werden soll, indem Sie der Bereitstellungsmanifestdatei des Pods eine Toleranz und Affinität hinzufügen. Wenn die Toleranz und Knotenaffinität dem Taint und der Bezeichnung entsprechen, die auf Ihre Spot-Knoten angewendet werden, wird der Pod auf diesen Knoten geplant.

Den Knoten in einem Spot-Knotenpool wird ein Taint zugewiesen, der kubernetes.azure.com/scalesetpriority=spot:NoSchedule entspricht, und eine Bezeichnung, die kubernetes.azure.com/scalesetpriority=spot entspricht. Sie verwenden die Informationen in diesem Schlüssel-Wert-Paar in den Abschnitten tolerations und affinity der YAML-Manifestdatei der Workloads. Wenn der zweite Batchverarbeitungspool als Spot-Knotenpool konfiguriert ist, können Sie jetzt eine Bereitstellungsdatei erstellen, um die Ausführung von Workloads zu planen.

  1. Erstellen Sie mithilfe des integrierten Editors für die Kubernetes-Bereitstellung eine Manifestdatei mit dem Namen spot-node-deployment.yaml:

    code spot-node-deployment.yaml
    

    Tipp

    Cloud Shell enthält einen integrierten Datei-Editor. Der Cloud Shell-Editor unterstützt Features wie die Sprachhervorhebung, die Befehlspalette und einen Datei-Explorer. Starten Sie den Editor für die einfache Dateierstellung und -bearbeitung, indem Sie code . im Cloud Shell-Terminal ausführen. Mit dieser Aktion wird der Editor mit dem aktiven Arbeitsverzeichnis geöffnet, das im Terminal festgelegt ist. Führen Sie code spot-node-deployment.yaml aus, um Ihre Manifestdatei direkt für die schnelle Bearbeitung zu öffnen. Mit diesem Befehl wird der Editor ohne den Datei-Explorer geöffnet.

  2. Fügen Sie den folgenden Text in die Datei ein:

    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. Drücken Sie STRG+S, um die Datei zu speichern, und anschließend STRG+Q, um den Editor zu schließen.

  4. Führen Sie den Befehl kubectl apply aus, um die Konfiguration anzuwenden und die Anwendung im costsavings-Namespace bereitzustellen:

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

    Dies ist die Ausgabe des vorherigen Befehls:

    pod/nginx created
    
  5. Sie können weitere Informationen zum ausgeführten Pod abrufen, indem Sie beim Ausführen des -o wide-Befehls das Flag kubectl get pods verwenden. In diesem Fall möchten Sie ermitteln, auf welchem Knoten der Pod geplant ist. Stellen Sie sicher, dass Sie die Pods im costsavings-Namespace abfragen.

    kubectl get pods --namespace costsavings -o wide
    

    Die Ausgabe sollte wie folgt aussehen:

    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>
    

    Beachten Sie den Namen des Knotens: aks-batchprocpl2-25254417-vmss000000. Dieser Knoten ist Teil des zuvor erstellten batchprocpl2-Spot-Knotenpools.