Verwenden von Knoten-Taints in einem AKS-Cluster (Azure Kubernetes Service)
Dieser Artikel beschreibt das Verwenden von Knoten-Taints in einem AKS-Cluster (Azure Kubernetes Service).
Übersicht
Der AKS-Planungsmechanismus ist für das Platzieren von Pods auf Knoten verantwortlich und basiert auf dem Upstream-Kubernetes-Planer, kube-scheduler. Sie können die Ausführung eines Pods auf bestimmte Knoten beschränken, indem Sie die Pods mit Knotenaffinität anfügen oder den Knoten anweisen, eine Gruppe von Pods mithilfe Knoten-Taints abzuwehren, die mit dem AKS-Planer interagieren.
Knoten-Taints funktionieren, indem ein Knoten markiert wird, sodass der Planer verhindert, bestimmte Pods auf den markierten Knoten zu platzieren. Sie können Toleranzen auf einem Pod platzieren, damit der Planer diesen Pod auf einem Knoten mit einem passenden Taint planen kann. Taints und Tolerationen arbeiten zusammen, um zu steuern, wie der Planer Pods auf Knoten platziert. Weitere Informationen finden Sie unter Beispielanwendungsfälle von Taints und Toleranzen.
Taints sind Schlüssel-Wert-Paare mit einem Effekt. Bei Verwendung von Knoten-Taints gibt es drei Werte für das Effektfeld: NoExecute
, NoSchedule
und PreferNoSchedule
.
NoExecute
: Pods, die bereits auf dem Knoten ausgeführt werden, werden sofort entfernt, wenn sie keine übereinstimmende Toleranz haben. Wenn ein Pod über eine übereinstimmende Toleranz verfügt, kann er bei Angabe vontolerationSeconds
entfernt werden.NoSchedule
: Nur Pods mit einer übereinstimmenden Toleranz werden auf diesem Knoten platziert. Vorhandene Pods werden nicht entfernt.PreferNoSchedule
: Der Planer vermeidet das Platzieren von Pods, die keine übereinstimmende Toleranz aufweisen.
Knoten-Taint-Optionen
Es gibt zwei Arten von Knoten-Taints, die auf Ihre AKS-Knoten angewendet werden können: Knoten-Taints und Knoteninitialisierungs-Taints.
- Knoten-Taints sollen dauerhaft auf dem Knoten bleiben, um Pods mit Knotenaffinität zu planen. Knoten-Taints können nur vollständig mithilfe der AKS-API hinzugefügt, aktualisiert oder entfernt werden.
- Knoteninitialisierungs-Taints werden zur Startzeit auf dem Knoten platziert und sollten vorübergehend verwendet werden, z. B. in Szenarien, in denen Sie möglicherweise zusätzliche Zeit benötigen, um Ihre Knoten einzurichten. Sie können die Knoteninitialisierungs-Taints mithilfe der Kubernetes-API entfernen und haben während des Knotenlebenszyklus keine Garantie. Sie werden erst angezeigt, nachdem für einen Knoten eine Skalierung, ein Ugrade oder ein Reimaging durchgeführt wurde. Neue Knoten verfügen nach der Skalierung weiterhin über das Knoteninitialisierungs-Taint. Die Knoteninitialisierungs-Taints werden nach dem Upgrade auf allen Knoten angezeigt. Wenn Sie die Initialisierungs-Taints vollständig entfernen möchten, können Sie sie mithilfe der AKS-API entfernen, nachdem sie die Knoten mithilfe der Kubernetes-API entfernt haben. Nachdem Sie die Initialisierungselemente mithilfe der AKS-API aus der Clusterspezifikation entfernt haben, werden neu erstellte Knoten nicht mehr mit diesen Initialisierungs-Taints erstellt. Wenn das Initialisierungs-Taint noch auf vorhandenen Knoten vorhanden ist, können Sie ihn dauerhaft entfernen, indem Sie einen Knotenimageupgradevorgang ausführen.
Hinweis
Knoten-Taints und Bezeichnungen, die mit der AKS-Knotenpool-API angewendet werden, können nicht von der Kubernetes-API geändert werden und umgekehrt. Änderungen an System-Taints sind nicht zulässig.
Dies gilt nicht für Knoteninitialisierungs-Taints.
Verwenden von Knoten-Taints
Voraussetzungen
In diesem Artikel wird vorausgesetzt, dass Sie über einen AKS-Cluster verfügen. Wenn Sie einen AKS-Cluster benötigen, können Sie einen mithilfe der Azure-Befehlszeilenschnittstelle, mit Azure PowerShell oder über das Azure-Portal erstellen.
Erstellen eines Knotenpools mit einem Knoten-Taint
Erstellen Sie einen Knotenpool mit einem Taint mithilfe des Befehls
az aks nodepool add
, und verwenden Sie den--node-taints
-Parameter, umsku=gpu:NoSchedule
für den Taint anzugeben.az aks nodepool add \ --resource-group $RESOURCE_GROUP_NAME \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --node-count 1 \ --node-taints "sku=gpu:NoSchedule" \ --no-wait
Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist.
Aktualisieren eines Knotenpools, um ein Knoten-Taint hinzuzufügen
Aktualisieren Sie einen Knotenpool, um ein Knoten-Taint mithilfe des Befehls
az aks nodepool update
hinzuzufügen, und verwenden Sie den--node-taints
-Parameter, umsku=gpu:NoSchedule
für das Taint anzugeben.az aks nodepool update \ --resource-group $RESOURCE_GROUP_NAME \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --node-taints "sku=gpu:NoSchedule" \ --no-wait
Verwenden von Knoteninitialisierungs-Taints (Vorschau)
Wichtig
AKS-Previewfunktionen stehen gemäß dem Self-Service- und Aktivierungsprinzip zur Verfügung. Vorschauversionen werden „wie besehen“ und „wie verfügbar“ bereitgestellt und sind von Service Level Agreements und der Herstellergarantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundensupport auf Grundlage der bestmöglichen Leistung abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in der Produktion vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:
Voraussetzungen und Einschränkungen
- Azure CLI-Version
3.0.0b3
oder höher muss installiert und konfiguriert sein. Führen Sieaz --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. - Sie können Initialisierungs-Taints nur mithilfe der AKS-API anwenden, wenn Sie Cluster erstellen oder aktualisieren. Wenn Sie ARM-Vorlagen verwenden, können Sie während der Erstellung und Aktualisierung des Knotenpools Knoteninitialisierungs-Taints angeben.
- Initialisierungs-Taints können nicht mithilfe der Azure CLI auf Windows-Knotenpools angewendet werden.
Abrufen der Anmeldeinformationen für Ihren Cluster
Laden Sie die Anmeldeinformationen für den AKS-Cluster mit dem Befehl
az aks get-credentials
.az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
Installieren der Azure CLI-Erweiterung aks-preview
Registrieren oder aktualisieren Sie die Erweiterung „aks-preview“ mithilfe des Befehls
az extension add
oderaz extension update
.# Register the aks-preview extension az extension add --name aks-preview # Update the aks-preview extension az extension update --name aks-preview
Registrieren des NodeInitializationTaintsPreview
-Featureflags
Registrieren Sie das Featureflag
NodeInitializationTaintsPreview
mithilfe des Befehlsaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Es dauert einige Minuten, bis der Status Registered (Registriert) angezeigt wird.
Überprüfen Sie den Registrierungsstatus mithilfe des Befehls
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Wenn der Zustand Registered (Registriert) lautet, aktualisieren Sie die Registrierung des Ressourcenanbieters Microsoft.ContainerService mithilfe des Befehls
az provider register
.az provider register --namespace Microsoft.ContainerService
Erstellen eines Clusters mit einem Knoteninitialisierungs-Taint
Erstellen Sie einen Cluster mit einem Knoteninitialisierungs-Taint mithilfe des Befehls
az aks create
, und verwenden Sie den--node-initialization-taints
-Parameter, umsku=gpu:NoSchedule
für das Taint anzugeben.Wichtig
Die angegebenen Knoteninitialisierungs-Taints werden für alle Knotenpools im Cluster angewendet. Um das Initialisierungs-Taint auf einen bestimmten Knoten anzuwenden, können Sie anstelle der CLI eine ARM-Vorlage verwenden.
az aks create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-count 1 \ --node-init-taints "sku=gpu:NoSchedule" \ --generate-ssh-keys
Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist.
Erstellen eines Clusters, um ein Knoteninitialisierungs-Taint hinzuzufügen
Aktualisieren Sie einen Cluster, um ein Knoteninitialisierungs-Taint mithilfe des Befehls
az aks update
hinzuzufügen, und verwenden Sie den--node-initialization-taints
-Parameter, umsku=gpu:NoSchedule
für das Taint anzugeben.Wichtig
Beim Aktualisieren eines Clusters mit einem Knoteninitialisierungs-Taint gelten dieTaints für alle Knotenpools im Cluster. Sie können Aktualisierungen der Knoteninitialisierungs-Taints auf dem Knoten nach einem Reimage-Vorgang anzeigen.
az aks update \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-init-taints "sku=gpu:NoSchedule"
Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist.
Überprüfen des Status des Knotenpools
Überprüfen Sie nach dem Anwenden des Knoten-Taints oder Initialisierungs-Taints den Status des Knotenpools mithilfe des Befehls
az aks nodepool list
.az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
Falls Sie Knoten-Taints angewendet haben, zeigt die folgende Beispielausgabe, dass der Knotenpool
<node-pool-name>
Knoten mit den angegebenennodeTaints
Creating
:[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
Falls Sie Knoten-Taints angewendet haben, zeigt die folgende Beispielausgabe, dass der Knotenpool
<node-pool-name>
Knoten mit den angegebenennodeInitializationTaints
Creating
:[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeInitializationTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist
Überprüfen Sie die Knoten-Taints und Initialisierungs-Taints der Knoteninitialisierung in der Knotenkonfiguration mithilfe des Befehls
kubectl describe node
.kubectl describe node $NODE_NAME
Falls Sie Knoten-Taints angewendet haben, zeigt die folgende Beispielausgabe, dass der Knotenpool
<node-pool-name>
die festgelegtenTaints
aufweist:[ ... Name: <node-pool-name> ... Taints: sku=gpu:NoSchedule ... ], ... ... ]
Entfernen von Knoten-Taints
Entfernen eines bestimmten Knoten-Taints
Entfernen Sie Knoten-Taints mithilfe des Befehls
az aks nodepool update
. Mit dem folgenden Beispielbefehl wird der"sku=gpu:NoSchedule"
-Knoten-Taint aus dem Knotenpool entfernt.az aks nodepool update \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-taints "sku=gpu:NoSchedule"
Entfernen aller Knoten-Taints
Entfernen Sie alle Knoten-Taints aus einem Knotenpool mithilfe des Befehls
az aks nodepool update
. Mit dem folgenden Beispielbefehl werden alle Knoten-Taints aus dem Knotenpool entfernt.az aks nodepool update \ --cluster-name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --name $NODE_POOL_NAME \ --node-taints ""
Entfernen von Knoteninitialisierungs-Taints
Sie haben die folgenden Optionen, um Knoteninitialisierungs-Taints aus dem Knoten zu entfernen:
- Vorübergehendes Entfernen von Knoteninitialisierungs-Taints mithilfe der Kubernetes-API. Wenn Sie sie auf diese Weise entfernen, werden die Taints wieder angezeigt, nachdem die Knotenskalierung oder das Upgrade erfolgt. Neue Knoten verfügen nach der Skalierung weiterhin über das Knoteninitialisierungs-Taint. Die Knoteninitialisierungs-Taints werden nach dem Upgrade auf allen Knoten angezeigt.
- Entfernen Sie die Knoteninitialisierung dauerhaft, indem Sie den Knoten mithilfe der Kubernetes-API aufheben und dann das Taint mithilfe der AKS-API entfernen. Sobald die Initialisierungs-Taints mithilfe der AKS-API aus der Clusterspezifikation entfernt wurden, haben neu erstellte Knoten nach Reimagingvorgängen keine Initialisierungs-Taints mehr.
Wenn Sie alle Initialisierungs-Taints aus Knotenpoolreplikaten entfernen, wird der vorhandene Initialisierungs-Taint möglicherweise nach einem Upgrade mit allen neuen Initialisierungs-Taints wieder angezeigt.
Vorübergehendes Entfernen von Knoteninitialisierungs-Taints
Entfernen Sie Knoteninitialisierungs-Taints vorübergehend mithilfe des
kubectl taint nodes
-Befehls.Mit diesem Befehl wird das Taint nur vom angegebenen Knoten entfernt. Wenn Sie das Taint aus jedem Knoten im Knotenpool entfernen möchten, müssen Sie den Befehl für jeden Knoten ausführen, aus dem das Taint entfernt werden soll.
kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
Nach dem Entfernen werden die Knoteninitialisierungs-Taints wieder angezeigt, nachdem die Knotenskalierung oder das Upgrade erfolgt.
Dauerhaftes Entfernen von Knoteninitialisierungs-Taints
Führen Sie die Schritte in Vorübergehendes Entfernen von Knoteninitialisierungs-Taints aus, um das Knoteninitialisierungs-Taint mithilfe der Kubernetes-API zu entfernen.
Entfernen Sie das Taint aus dem Knoten mithilfe der AKS-API und des Befehls
az aks update
. Mit diesem Befehl wird das Knoteninitialisierungs-Taint von jedem Knoten im Cluster entfernt.az aks update \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-init-taints ""
Überprüfen, ob das Taint auf den Knoten festgelegt ist
Überprüfen Sie die Knoten-Taints und Initialisierungs-Taints der Knoteninitialisierung in der Knotenkonfiguration mithilfe des Befehls
kubectl describe node
.kubectl describe node $NODE_NAME
Wenn Sie ein Knoten-Taint entfernt haben, zeigt die folgende Beispielausgabe, dass der
<node-pool-name>
-Knotenpool das entfernte Taint unterTaints
nicht enthält:[ ... Name: <node-pool-name> ... Taints: ... ], ... ... ]
Nächste Schritte
- Weitere Informationen über Beispielanwendungsfälle für Taints und Toleranzen.
- Weitere Informationen über Best Practices für erweiterte AKS-Scheduler-Features.
- Weitere Informationen zu Kubernetes-Bezeichnungen finden Sie in der Dokumentation zu Kubernetes-Bezeichnungen.
Azure Kubernetes Service