Übung: Konfigurieren von Spot-Knotenpools mit der automatischen Clusterskalierung für einen AKS-Cluster
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.
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.
- Name:
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 auftrue
festgelegt.Die Werte
maxCount
undminCount
sind beide festgelegt.Die
scaleSetEvictionPolicy
-Eigenschaft ist aufDelete
festgelegt.Die
scaleSetPriority
-Eigenschaft ist aufSpot
festgelegt.Die
spotMaxPrice
-Eigenschaft ist auf-1
festgelegt.nodeLabels
undnodeTaints
wurden auf diesen Knotenpool angewendet. Sie verwenden diese Werte, um Workloads auf den Knoten im Knotenpool zu planen.
Konfigurieren eines Namespaces
Führen Sie den Befehl
kubectl create namespace
aus, um ein Namespace namenscostsavings
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.
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 Siecode 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.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"
Drücken Sie STRG+S, um die Datei zu speichern, und anschließend STRG+Q, um den Editor zu schließen.
Führen Sie den Befehl
kubectl apply
aus, um die Konfiguration anzuwenden und die Anwendung imcostsavings
-Namespace bereitzustellen:kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
Dies ist die Ausgabe des vorherigen Befehls:
pod/nginx created
Sie können weitere Informationen zum ausgeführten Pod abrufen, indem Sie beim Ausführen des
-o wide
-Befehls das Flagkubectl get pods
verwenden. In diesem Fall möchten Sie ermitteln, auf welchem Knoten der Pod geplant ist. Stellen Sie sicher, dass Sie die Pods imcostsavings
-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 erstelltenbatchprocpl2
-Spot-Knotenpools.