Konfigurieren mehrerer Knotenpools mithilfe von AKS-Spot-Knotenpools mit automatischer Clusterskalierung
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"