Konfigurieren mehrerer Knotenpools mithilfe von AKS-Spot-Knotenpools mit automatischer Clusterskalierung

Abgeschlossen

Azure bietet mit Azure Virtual Machine-Instanzen Skalierbarkeit bei geringeren Kosten. Sie sind daher ideal für Workloads, die unterbrochen werden können. Diese virtuellen Computer (VMs) greifen zwar zu niedrigeren Preisen auf nicht genutzte Azure-Computekapazität zu, unterstützen jedoch weiterhin High-Performance-Computing-Szenarios.

Die Lösung für das Drohnentracking in Ihrem Unternehmen wird wie viele containerisierte Anwendungen und Dienste in Azure Kubernetes Service (AKS) bereitgestellt. Bei einem dieser Dienste handelt es sich um einen Batchverarbeitungsdienst, der Drohnenflugrouten plant. Bei einem plötzlichen Wachstum Ihres Kundenstamms wird der Batchverarbeitungsdienst mit Anforderungen überflutet, und es entsteht ein Lieferrückstand. Diese Situation führt zu Verzögerungen und Kundenfrust.

Das automatische Skalieren der Anzahl von Dienstreplikaten für die Batchverarbeitung ermöglicht die rechtzeitige Auftragsverarbeitung. Es ist jedoch auch erforderlich, dass Sie weitere Knoten bereitstellen, um die Anforderungen an die Computerressourcen zu erfüllen. Wenn Sie Nutzungstrends in Azure Monitor analysieren, stellen Sie fest, dass diese Knoten nur zu bestimmten Zeiten und nicht kosteneffektiv verwendet werden. Der Batchverarbeitungsdienst ist zustandslos und speichert keine Clientsitzungsdaten. Sie werden feststellen, dass Sie wie folgt Geld sparen können:

  • Verwenden kostengünstigerer Knoteninstanzen
  • automatisches Skalieren der Knotenanzahl im Knotenpool, der für die Batchverarbeitung konfiguriert ist

Sehen Sie sich die Infrastruktur an, die dieser kostensparenden Lösung in AKS zugrunde liegt.

Was ist ein virtueller Spotcomputer (Spot-VM) in Azure?

Bei einem virtuellen Spot-Computer handelt es sich um eine VM, die Ihnen Zugriff auf ungenutzte Azure-Computekapazität mit hohen Rabatten ermöglicht. Spot-VMs ersetzen die vorhandenen VMs mit niedriger Priorität in Azure. Sie können Spot-VMs zum Ausführen von Workloads verwenden, die Folgendes umfassen:

  • High-Performance-Computing-Szenarios, Batchverarbeitung oder visuelle Renderinganwendungen

  • umfangreiche zustandslose Anwendungen

  • Entwickler-/Testumgebungen, einschließlich CI- (Continuous Integration) und CD-Workloads (Continuous Delivery)

Verfügbarkeit von Spot-VMs

Die Verfügbarkeit von Spot-VMs hängt von Faktoren wie Kapazität, Größe, Region und Tageszeit ab. Azure weist VMs nur zu, wenn Kapazität verfügbar ist. Demzufolge gibt es keine Vereinbarung zum Servicelevel (SLA) für diese Typen von VMs, und sie bieten keine Garantie für Hochverfügbarkeit.

Spot-VM-Entfernungsrichtlinie

Die Standardentfernungsrichtlinie für die Spot-VM-Entfernung ist Zuordnung aufheben. Azure räumt Spot-VMs mit einer Vorankündigung von 30 Sekunden, wenn die Kapazität in einer Region begrenzt wird. Eine VM, die mit der Richtlinie Zuordnung aufheben festgelegt ist, wechselt bei der Entfernung in den Zustand „stopped-deallocated“. Sie können eine entfernte VM erneut bereitstellen, wenn die Spot-Kapazität wieder verfügbar wird. Eine VM, deren Zuordnung aufgehoben wird, zählt weiterhin zu Ihrem Spot-vCPU-Kontingent, und es fallen weiterhin Gebühren für die zugrunde liegenden zugeordneten Datenträger an.

Was ist eine Spot-VM-Skalierungsgruppe?

Eine Spot-VM-Skalierungsgruppe ist eine VM-Skalierungsgruppe, die Azure-Spot-VMs unterstützt. Diese VMs weisen dasselbe Verhalten wie normale Spot-VMs auf, jedoch mit einem Unterschied: Wenn Sie VM-Skalierungsgruppenunterstützung für Spot-VMs in Azure verwenden, müssen Sie sich zwischen zwei Entfernungsrichtlinien entscheiden:

  • Zuordnung aufheben: Die Richtlinie „Zuordnung aufheben“ funktioniert genau wie zuvor beschrieben.

  • Löschen: Mit der Richtlinie „Löschen“ können Sie Kosten für Datenträger und das Erreichen von Kontingentgrenzen vermeiden. Mit der Entfernungsrichtlinie „Löschen“ werden entfernte VMs zusammen mit den zugrunde liegenden Datenträgern gelöscht. Das Feature für die automatische Skalierung der Skalierungsgruppe kann nun automatisch versuchen, das Entfernen von VMs auszugleichen, indem neue VMs erstellt werden. Obwohl die Erstellung von VMs nicht garantiert wird, werden die entfernten VMs nicht in Bezug auf das vCPU-Kontingent angerechnet, noch entstehen Kosten für die zugrunde liegenden Datenträger.

    Als Best Practice gilt, das Feature für automatische Skalierung nur dann zu verwenden, wenn Sie die Entfernungsrichtlinie für die Skalierungsgruppe auf Löschen festlegen.

Was ist ein Spot-Knotenpool in Azure Kubernetes Service (AKS)?

Ein Spot-Knotenpool ist ein Benutzerknotenpool, der eine Spot-VM-Skalierungsgruppe verwendet. AKS unterstützt Spot-VMs in folgenden Fällen:

  • Sie müssen Benutzerknotenpools erstellen.
  • Sie möchten von den von der VM-Skalierungsgruppenunterstützung für Spot-VMs in Azure gebotenen Vorteilen profitieren.

Sie können Spot-Knotenpools für Folgendes verwenden:

  • Nutzen von nicht verwendeter Kapazität in Azure
  • Verwenden von Skalierungsgruppenfeatures mit der Entfernungsrichtlinie „Löschen“
  • Definieren des maximalen Preises, den Sie pro Stunde zahlen möchten
  • Aktivieren der empfohlenen automatischen AKS-Kubernetes-Clusterskalierung bei Verwendung von Spot-Knotenpools

Um beispielsweise den Batchverarbeitungsdienst der Drohnennachverfolgungsanwendung zu unterstützen, können Sie einen Spot-Benutzerknotenpool erstellen und die automatische Clusterskalierung aktivieren. Anschließend können Sie die horizontale Podskalierung so konfigurieren, dass sie je nach Ressourcenbedarf mehr Batchverarbeitungsdienste bereitstellt.

Wenn der Bedarf an Knoten zunimmt, kann die automatische Clusterskalierung die Anzahl der Knoten im Spot-Knotenpool hoch- oder herunterskalieren. Wenn Knoten entfernt werden, versucht der automatische Cluster-Skalierer weiterhin, die Anzahl der Knoten zu erhöhen, falls noch zusätzliche Knoten benötigt werden.

Einschränkungen für Spot-Knotenpools

Beachten Sie die folgenden Einschränkungen, bevor Sie dem AKS-Cluster einen Spot-Benutzerknotenpool hinzufügen:

  • Die zugrunde liegende Spot-Skalierungsgruppe wird nur in einer einzelnen Fehlerdomäne bereitgestellt und bietet keine Garantien für Hochverfügbarkeit.
  • Für den AKS-Cluster muss Unterstützung mehrerer Knotenpools aktiviert werden.
  • Sie können Spot-Knotenpools nur als Benutzerknotenpools verwenden.
  • Spot-Knotenpools können nicht aktualisiert werden.
  • Die Erstellung von Spot-VMs wird nicht garantiert. Die Erstellung von Spot-Knoten hängt von der Kapazität- und Kontingentverfügbarkeit in der bereitgestellten Azure-Region des Clusters ab.

Beachten Sie, dass Spot-Knotenpools nur für Workloads verwendet werden sollten, die unterbrochen werden können.

Wichtig

In einigen Abonnements (z. B. Sponsoringabonnements) ist die Möglichkeit zum Erstellen von Spot-VMs und Spot-Knotenpools eingeschränkt. Möglicherweise können Sie keinen Spot-Knotenpool für Ihren Cluster erstellen.

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

Ein Spot-Knotenpool kann kein Systemknotenpool für einen AKS-Cluster sein. Zunächst müssen Sie Ihren Cluster erstellen und dann mit dem Befehl az aks nodepool add einen neuen Benutzerknotenpool hinzufügen.

Sie legen mehrere Parameter für einen neuen Knotenpool fest, um ihn als einen Spot-Knotenpool zu konfigurieren.

Priorität

Der --priority-Parameter ist für einen neuen Knotenpool standardmäßig auf Regular festgelegt. Legen Sie den Wert auf Spot fest, um anzugeben, dass es sich beim neuen Pool, den Sie erstellen, um einen Spot-Knotenpool handelt. Dieser Wert kann nach der Erstellung nicht mehr geändert werden.

Entfernungsrichtlinie

Ein Spot-Knotenpool muss eine VM-Skalierungsgruppe verwenden. Denken Sie daran, dass der Spot-Knotenpool eine Spot-Skalierungsgruppe verwendet. Legen Sie --eviction-policy auf Delete fest, damit die Skalierungsgruppe den Knoten und den zugrunde liegenden zugeordneten Datenträger entfernt, der vom Knoten verwendet wird. Sie können diesen Wert nach der Erstellung nicht mehr ändern.

Sie können die Entfernungsrichtlinie auf Deallocate festlegen. Wenn diese Knoten jedoch entfernt werden, werden sie immer noch auf Ihr Computekontingent für die Skalierung oder das Upgrade des Clusters angerechnet.

Maximaler Preis für Spot-Knoten

Mit Spot-Knotenpools werden die Kosten optimiert, indem der Höchstbetrag, den Sie pro Spot-Knoten und Stunde zu zahlen bereit sind, begrenzt wird. Verwenden Sie den --spot-max-price-Parameter, um einen sicheren Betrag festzulegen. Neu erstellte Spot-Knoten werden entfernt, sobald dieser Wert erreicht wird.

Sie können diesen Wert auf einen beliebigen positiven Wert mit bis zu fünf Dezimalstellen oder auf -1 festlegen. Wenn Sie den Wert --spot-max-price auf -1 festlegen, wirkt sich dies auf folgende Weise auf den Knotenpool aus:

  • Knoten werden nicht auf der Grundlage ihres Preises entfernt.
  • Die Kosten für neue Knoten basieren auf dem aktuellen Preis für Spot-Knoten oder dem Preis für einen Standardknoten, je nachdem, welcher Preis niedriger ist.

Wenn Sie den Wert zum Beispiel auf 0,98765 setzen, beträgt der Höchstpreis für einen Knoten in US-Dollar 0,98765 pro Stunde. Wenn die Nutzung des Knotens diesen Wert überschreitet, wird er entfernt.

Aktivieren der automatischen Clusterskalierung

Es wird empfohlen, die automatische Clusterskalierung zu aktivieren. Nutzen Sie dazu den --enable-cluster-autoscaler-Parameter. Wenn Sie die automatische Clusterskalierung nicht verwenden, besteht das Risiko, dass die Knotenanzahl im Knotenpool auf null fällt, wenn Knoten aufgrund von Azure-Kapazitätseinschränkungen entfernt werden.

Minimale Knotenanzahl

Legen Sie die minimale Knotenanzahl mithilfe des --min-count-Parameters auf einen Wert zwischen 1 und 100 fest. Eine minimale Knotenanzahl ist erforderlich, wenn Sie die automatische Clusterskalierung aktivieren.

Maximale Knotenanzahl

Legen Sie die maximale Knotenanzahl mit dem Parameter --max-count auf einen Wert zwischen 1 und 100 fest. Eine maximale Knotenanzahl ist erforderlich, wenn Sie die automatische Clusterskalierung aktivieren.

Beispielkonfiguration

Hier ist ein Beispiel für einen az aks nodepool add-Befehl, der einen Spot-Knotenpool mit einer maximalen Anzahl von 3 und einer minimalen Anzahl von 1 hinzufügt. Beachten Sie die Verwendung von --enable-cluster-autoscaler, um die Spot-Knotenfunktionen zu aktivieren.

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

Bereitstellen von Pods in Spot-Knotenpools

Wenn Sie Workloads in Kubernetes bereitstellen, können Sie Informationen für den Scheduler bereitstellen, um anzugeben, auf welchen Knoten die Workloads ausgeführt werden können und auf welchen nicht. Sie steuern die Workloadplanung durch Konfigurieren von Markierungen, Toleranz oder Knotenaffinität. Spot-Knoten werden mit einer bestimmten Bezeichnung und einem Taint konfiguriert.

Was ist ein Taint?

Eine Markierung wird auf einen Knoten angewendet, um anzugeben, dass nur bestimmte Pods auf ihm geplant werden können. Spot-Knoten werden mit einer Bezeichnung konfiguriert, die auf kubernetes.azure.com/scalesetpriority:spot festgelegt ist.

Was ist die Toleranz?

Toleranz ist eine Spezifikation, die auf einen Pod angewendet wird, um zu ermöglichen, aber nicht zu erfordern, dass ein Pod auf einem Knoten mit dem entsprechenden Taint geplant wird. Spot-Knoten werden mit einem Taint konfiguriert, der auf kubernetes.azure.com/scalesetpriority=spot:NoSchedule festgelegt ist.

Hinweis

Taints und Toleranzen sind keine Garantie dafür, dass ein Pod auf einem bestimmten Knoten platziert wird. Wenn z. B. ein Knoten keine Markierung aufweist, ist es möglich, dass der Pod mit der Toleranz auf dem Knoten ohne Markierung geplant wird. Die Angabe einer Affinität mit Taints und Toleranzen kann dieses Problem lösen.

Was ist Knotenaffinität?

Sie verwenden die Knotenaffinität, um zu beschreiben, welche Pods auf einem Knoten geplant werden. Affinität wird mithilfe von Bezeichnungen angegeben, die auf dem Knoten definiert werden. In AKS werden Systempods z. B. mit Antiaffinität für Spot-Knoten konfiguriert, um zu verhindern, dass sie auf diesen Knoten geplant werden.

Definieren von Toleranz in einer Podmanifestdatei

Die Knotenmarkierungstoleranz wird durch Erstellen eines tolerations-Wörterbucheintrags in der Manifestdatei Ihrer Workload angegeben. In diesem Wörterbuch legen Sie die folgenden Eigenschaften für jede Knotenmarkierung fest, die die Workload in diesem Abschnitt tolerieren muss:

Eigenschaft Beschreibung
key Mit dieser Eigenschaft wird ein Schlüssel-Wert-Paar für eine Knotenmarkierung identifiziert, das auf dem Knoten angegeben wird. Beispielsweise ist das Schlüssel-Wert-Paar in einem Spot-Knotenpool kubernetes.azure.com/scalesetpriority:spot. Der Schlüssel ist kubernetes.azure.com/scalesetpriority.
operator Diese Eigenschaft ermöglicht, dass die Toleranz einer Markierung entspricht. Der Standardoperator ist Equal. Sie können auch Exists angeben, um eine Übereinstimmung mit der Toleranz zu erreichen. Wenn Sie Exists verwenden, geben Sie jedoch nicht die folgende Eigenschaft an (value).
value Diese Eigenschaft stellt den Wertteil des Schlüssel-Wert-Paars für die Knotenmarkierung dar, das auf dem Knoten angegeben ist. In einem Spot-Knotenpool mit einem Schlüssel-Wert-Paar von kubernetes.azure.com/scalesetpriority:spot ist der Wert beispielsweise spot.
effect Diese Eigenschaft gibt an, wie die Planung für einen Pod im System erfolgt. Sie haben drei Möglichkeiten: NoSchedule, PreferNoSchedule und NoExecute. NoSchedule sorgt dafür, dass das System den Pod nicht einplanen kann. PreferNoSchedule erlaubt dem System, zu versuchen, den Pod nicht zu planen. NoExecute entfernt entweder Pods, die bereits auf dem markierten Knoten ausgeführt werden, oder plant den Pod überhaupt nicht.

Definieren der Knotenaffinität in einer Podmanifestdatei

Sie geben die Affinität an, indem Sie einen affinity-Eintrag in Ihrer Workloadmanifestdatei erstellen. In diesem Eintrag legen Sie die folgenden Eigenschaften für jede Knotenbezeichnung fest, der ein Workload entsprechen muss:

Eigenschaft BESCHREIBUNG
nodeAffinity Beschreibt die Regeln für die Knotenaffinitätsplanung für den Pod.
requiredDuringSchedulingIgnoredDuringExecution Wenn die in diesem Feld angegebenen Affinitätsanforderungen zum Zeitpunkt der Planung nicht erfüllt sind, kann der Pod nicht auf dem Knoten geplant werden. Wenn die in diesem Feld angegebenen Affinitätsanforderungen zu einem bestimmten Zeitpunkt während der Ausführung des Pods nicht mehr erfüllt sind (z. B. aufgrund einer Aktualisierung), kann das System versuchen, den Pod von seinem Knoten zu entfernen.
nodeSelectorTerms Eine Liste von Knotenselektorbegriffen. Die zurückgegebenen Benennungen entsprechen einem der Filter und nicht allen Filtern.
matchExpressions Eine Liste von Knotenselektoranforderungen nach Knotenbezeichnungen.
key Der Bezeichnungsschlüssel, auf den der Selektor angewendet wird. Der Schlüssel ist kubernetes.azure.com/scalesetpriority.
operator Stellt die Beziehung eines Schlüssels zu einem Satz von Werten dar. Gültige Operatoren sind In, NotIn, Exists, DoesNotExist Gt und Lt.
values Diese Eigenschaft stellt den Wertteil des Schlüssel-Wert-Paars für die Knotenbezeichnung dar, das auf dem Knoten angegeben wird. In einem Spot-Knotenpool mit einem Schlüssel-Wert-Paar von kubernetes.azure.com/scalesetpriority:spot ist der Wert spot.

Im Folgenden sehen Sie ein Beispiel für eine Workload, für die Toleranz und Affinität für Spot-Knotenpools hinzugefügt wurde.

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"

Überprüfen Sie Ihr Wissen

1.

Angenommen, Sie verfügen über einen zustandslosen Dienst, der Onlinebestellungen verarbeitet und in einem Azure Kubernetes Service-Cluster (AKS) ausgeführt wird. Sie entscheiden sich für die Verwendung von Spot-Knotenpools auf dem AKS-Cluster, um die Computekosten für den Cluster zu optimieren. Wie fügen Sie einem AKS-Cluster Spot-Knotenpools hinzu?

2.

Welche Entfernungsrichtlinie ist für den in der vorherigen Frage beschriebenen Dienst die kostengünstigste Option zum Konfigurieren des Spot-Knotenpools?

3.

Wie stellen Sie im Zusammenhang mit dem in der vorherigen Frage beschriebenen Dienst sicher, dass Workloads auf den Knoten des Spot-Benutzerknotenpools geplant werden?