Hinzufügen eines Azure Spot-Knotenpools zu einem Azure Kubernetes Service-Cluster (AKS)

In diesem Artikel fügen Sie einem vorhandenen Azure Kubernetes Service-Cluster (AKS) einen sekundären Spot-Knotenpool hinzu.

Ein Spot-Knotenpool ist ein Knotenpool, der von einer Azure-Spot-VM-Skalierungsgruppe unterstützt wird. Mit Spot-VMs in Ihrem AKS-Cluster können Sie ungenutzte Azure-Kapazitäten mit erheblichen Kosteneinsparungen nutzen. Die Menge der verfügbaren, nicht genutzten Kapazität hängt von vielen Faktoren ab, z. B. Größe, Region und Tageszeit des Knotens.

Wenn Sie einen Spot-Knotenpool bereitstellen, ordnet Azure die Spot-Knoten zu, wenn Kapazität verfügbar ist, und stellt eine Spot-Skalierungsgruppe bereit, die den Spot-Knotenpool in einer einzelnen Standarddomäne sichert. Es gibt keine SLA für die Spot-Knoten. Es gibt keine Garantien hinsichtlich der Hochverfügbarkeit. Wenn Azure die Kapazität wieder benötigt, entfernt die Azure-Infrastruktur die Spot-Knoten.

Spot-Knotenpunkte eignen sich hervorragend für Workloads, die mit Unterbrechungen, vorzeitigen Beendigungen oder Entfernungen umgehen können. Workloads wie Batchverarbeitungsaufträge, Entwicklungs- und Testumgebungen sowie große Computeworkloads können beispielsweise gute Kandidaten für die Planung in Ihrem Spot-Knotenpool sein.

Voraussetzungen

  • Für diesen Artikel werden Grundkenntnisse im Zusammenhang mit Kubernetes und Azure Load Balancer vorausgesetzt. Weitere Informationen finden Sie unter Grundlegende Kubernetes-Konzepte für Azure Kubernetes Service (AKS).
  • Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
  • Wenn Sie einen Cluster für die Verwendung eines Spot-Knotenpools erstellen, muss der Cluster VM-Skalierungsgruppen für Knotenpools und den Lastenausgleich mit Standard-SKU verwenden. Sie müssen außerdem einen weiteren Knotenpool hinzufügen, nachdem Sie Ihren Cluster erstellt haben. Dies wird in diesem Tutorial behandelt.
  • Der Artikel setzt voraus, dass Sie mindestens Version 2.14 der Azure-Befehlszeilenschnittstelle (Azure CLI) ausführen. Führen Sie az --version aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.

Einschränkungen

Für das Erstellen und Verwalten von AKS-Clustern mit einem Spot-Knotenpool gelten die folgenden Einschränkungen:

  • Ein Spot-Knotenpool kann kein Standardknotenpool sein, er kann nur als sekundärer Pool verwendet werden.
  • Sie können die Steuerungsebene und Knotenpools nicht gleichzeitig upgraden. Sie müssen das Upgrade separat durchführen oder den Spot-Knotenpool entfernen, um die Steuerungsebene und die übrigen Knotenpools gleichzeitig zu aktualisieren.
  • Ein Spot-Knotenpool muss VM-Skalierungsgruppen verwenden.
  • Sie können ScaleSetPriority oder SpotMaxPrice nach der Erstellung nicht mehr ändern.
  • Beim Festlegen von SpotMaxPrice muss der Wert -1 oder ein positiver Wert mit bis zu fünf Dezimalstellen sein.
  • Ein Spot-Knotenpool umfasst die kubernetes.azure.com/scalesetpriority:spot-Bezeichnung und den kubernetes.azure.com/scalesetpriority=spot:NoSchedule-Taint. Die Systempods weisen eine Antiaffinität auf.
  • Sie müssen eine entsprechende Toleranz und Affinität hinzufügen, um Workloads auf einem Spot-Knotenpool zu planen.

Hinzufügen eines Spot-Knotenpools zu einem AKS-Cluster

Beim Hinzufügen eines Spot-Knotenpools zu einem vorhandenen Cluster muss es sich um einen Cluster mit mehreren aktivierten Knotenpools handeln. Wenn Sie einen AKS-Cluster mit mehreren aktivierten Knotenpools erstellen, erstellen Sie standardmäßig einen Knotenpool mit einer priority von Regular. Um einen Spot-Knotenpool hinzuzufügen, müssen Sie als Wert für priority entsprechend Spot angeben. Weitere Details zum Erstellen eines AKS-Clusters mit mehreren Knotenpools finden Sie unter Verwenden mehrerer Knotenpools.

  • Erstellen Sie mithilfe des Befehls az aks nodepool add einen Knotenpool mit der prioritySpot.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name spotnodepool \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3 \
        --no-wait
    

Im vorherigen Befehl macht die priority von Spot den Knotenpool zu einem Spot-Knotenpool. Der eviction-policy-Parameter ist auf Delete festgelegt, was der Standardwert ist. Wenn Sie die Entfernungsrichtlinie auf Delete festlegen, werden Knoten in der zugrunde liegenden Skalierungsgruppe des Knotenpools bei der Entfernung gelöscht.

Sie können die Richtlinie für das Entfernen auch auf Deallocate festlegen, was bedeutet, dass die Knoten in der zugrunde liegenden Skalierungsgruppe beim Entfernen in den Zustand Beendet (Zuordnung aufgehoben) versetzt werden. Knoten im Zustand Beendet (Zuordnung aufgehoben) werden auf Ihr Computekontingent angerechnet und können Probleme bei der Skalierung oder dem Upgrade von Clustern verursachen. Die Werte für priority und eviction-policy (Entfernungsrichtlinie) können nur während der Erstellung des Knotenpools festgelegt werden. Diese Werte können später nicht mehr aktualisiert werden.

Der vorherige Befehl aktiviert auch die automatische Clusterskalierung, für die wir empfehlen, sie mit Spot-Knotenpools zu verwenden. Basierend auf den Workloads, die in Ihrem Cluster ausgeführt werden, skaliert die automatische Clusterskalierung die Anzahl der Knoten hoch und herunter. Bei Spot-Knotenpools skaliert die automatische Clusterskalierung die Anzahl von Knoten nach einer Entfernung hoch, falls mehr Knoten benötigt werden. Wenn Sie die maximale Anzahl von Knoten ändern, die ein Knotenpool aufweisen kann, müssen Sie auch den mit der automatischen Clusterskalierung verbundenen maxCount-Wert anpassen. Wenn Sie keine automatische Clusterskalierung verwenden, wird der Spot-Pool nach der Entfernung schließlich auf 0 sinken und eine manuelle Bedienung erfordern, um weitere Spot-Knoten zu erhalten.

Wichtig

Planen Sie Workloads nur für Spot-Knotenpools, die Unterbrechungen verarbeiten können, z. B. Batchverarbeitungsaufträge und Testumgebungen. Es wird empfohlen, dass Sie in Ihrem Spot-Knotenpool Taints und Toleranzen einrichten, um sicherzustellen, dass in einem Spot-Knotenpool nur Workloads geplant werden, die mit Knotenentfernungen umgehen können. Beispielsweise fügt der obige Befehl einen Taint von kubernetes.azure.com/scalesetpriority=spot:NoSchedule hinzu, sodass nur Pods mit einer entsprechenden Toleranz auf diesem Knoten geplant werden.

Überprüfen des Spot-Knotenpools

  • Überprüfen Sie mit dem Befehl az aks nodepool show, ob Ihr Knotenpool hinzugefügt wurde, und stellen Sie sicher, dass die scaleSetPrioritySpot entspricht.

    az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool
    

Planen einer Podausführung auf dem Spot-Knoten

Um einen Pod für die Ausführung auf einem Spot-Knoten zu planen, können Sie eine Toleranz und Knotenaffinität hinzufügen, die dem auf Ihren Spot-Knoten angewendeten Taint entspricht.

Das folgende Beispiel zeigt einen Auszug der YAML-Datei, die eine Toleranz, die dem Taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule entspricht, und eine Knotenaffinität definiert, die der im vorherigen Schritt mit den Knotenaffinitätsregeln requiredDuringSchedulingIgnoredDuringExecution und preferredDuringSchedulingIgnoredDuringExecution verwendeten Bezeichnung kubernetes.azure.com/scalesetpriority=spot entspricht.

spec:
  containers:
  - name: spot-example
  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"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Wenn Sie einen Pod mit dieser Toleranz und Knotenaffinität bereitstellen, plant Kubernetes den Pod erfolgreich auf den Knoten, wobei der Taint und die Bezeichnung angewendet werden. In diesem Beispiel gelten die folgenden Regeln:

  • Der Knoten muss über eine Bezeichnung mit dem Schlüssel kubernetes.azure.com/scalesetpriority verfügen, und der Wert dieser Bezeichnung mussspot sein.
  • Der Knoten weist vorzugsweise eine Bezeichnung mit dem Schlüssel another-node-label-key auf, und der Wert dieser Bezeichnung mussanother-node-label-value sein.

Weitere Informationen finden Sie unter Zuweisen von Pods zu Knoten.

Upgrade eines Spot-Knotenpools

Wenn Sie ein Upgrade für einen Spot-Knotenpool durchführen, gibt AKS intern einen Hinweis auf eine Sperrung und Entfernung aus, aber es findet kein Ausgleich statt. Für Upgrades von Spot-Knotenpools sind keine Surge-Knoten verfügbar. Abgesehen von diesen Änderungen entspricht das Verhalten beim Upgrade von Spot-Knotenpools dem anderer Knotenpooltypen.

Weitere Informationen zum Durchführen eines Upgrades finden Sie unter Aktualisieren eines AKS-Clusters.

Maximaler Preis für einen Spot-Pool

Die Preise für Spot-Instanzen variieren abhängig von Region und SKU. Weitere Informationen finden Sie in den Preisinformationen für Linux und Windows.

Bei der variablen Preisgestaltung können Sie einen maximalen Preis in US-Dollar (USD) mit bis zu fünf Dezimalstellen festlegen. Der Wert 0,98765 würde beispielsweise einem maximalen Preis von 0,98765 US-Dollar pro Stunde entsprechen. Wenn Sie den maximalen Preis auf -1 festlegen, wird die Instanz nicht basierend auf dem Preis entfernt. Solange Kapazität und Kontingent verfügbar sind, ist der Preis für die Instanz der niedrigere Preis des aktuellen Preises für eine Spot-Instanz oder für eine Standardinstanz.

Nächste Schritte

In diesem Artikel haben Sie erfahren, wie Sie einen Spot-Knotenpool zu einem AKS-Cluster hinzufügen können. Weitere Informationen zum knotenpoolübergreifenden Steuern von Pods finden Sie unter Best Practices für erweiterte Scheduler-Funktionen in Azure Kubernetes Service (AKS).