Verwenden von Knotentaints in einem von Azure Arc-Cluster aktivierten AKS
Gilt für: Azure Local, Version 23H2
In diesem Artikel wird beschrieben, wie Knotentaints in einem AKS-Cluster verwendet werden.
Übersicht
Der AKS-Planungsmechanismus ist für das Platzieren von Pods auf Knoten verantwortlich und basiert auf dem upstream-Kubernetes-Scheduler kube-scheduler. Sie können die Ausführung eines Pods auf bestimmte Knoten beschränken, indem Sie den Knoten anweisen, eine Gruppe von Pods mithilfe von Knotentaints abzulehnen, die mit dem AKS-Scheduler 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.
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 mit Azure CLI, Azure PowerShell oder dem Azure-Portal erstellen.
- Wenn Sie einen Knotenpool erstellen, können Sie ihrTaints hinzufügen. Wenn Sie einen Taint hinzufügen, erhalten alle Knoten des Knotenpools diesen Taint.
Wichtig
Sie sollten Taints oder Beschriftungen zu Knoten für den gesamten Knotenpool hinzufügen.az aksarc nodepool
Es wird nicht empfohlen kubectl
, die Verwendung vonTaints oder Bezeichnungen auf einzelne Knoten in einem Knotenpool anzuwenden.
Festlegen von Taints für Knotenpools
Erstellen Sie mithilfe des Befehls az aksarc nodepool add
einen Knotenpool mit einem Taint. Geben Sie den Namen taintnp
an, und verwenden Sie den --node-taints
Parameter, um für den Taint anzugeben sku=gpu:NoSchedule
:
az aksarc nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name taintnp \
--node-count 1 \
--node-taints sku=gpu:NoSchedule \
--no-wait
Überprüfen Sie den Status des Knotenpools mithilfe des az aksarc nodepool list
Befehls:
az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster
Die folgende Beispielausgabe zeigt, dass der taintnp
Knotenpool Knoten mit dem angegebenen nodeTaints
Erstellt:
[
{
...
"count": 1,
...
"name": "taintnp",
...
"provisioningState": "Succeeded",
...
"nodeTaints": [
"sku=gpu:NoSchedule"
],
...
},
...
]
Die Taint-Informationen sind in Kubernetes für die Behandlung von Planungsregeln für Knoten sichtbar. Der Kubernetes-Scheduler kann Taints und Tolerationen verwenden, um einzuschränken, welche Workloads auf Knoten ausgeführt werden können.
- Ein Taint wird auf einen Knoten angewendet, der anzeigt, dass nur bestimmte Pods darauf geplant werden können.
- Anschließend wird eine Toleration auf einen Pod angewendet, mit dem sie den Taint eines Knotens "tolerieren" können.
Festlegen von Knotenpooltoleranzen
Im vorherigen Schritt haben Sie den sku=gpu:NoSchedule
Taint beim Erstellen des Knotenpools angewendet. Im folgenden Beispiel für das YAML-Manifest wird eine Toleration verwendet, damit der Kubernetes-Scheduler einen NGINX-Pod auf einem Knoten in diesem Knotenpool ausführen kann:
Erstellen Sie eine Datei namens nginx-toleration.yaml , und kopieren/einfügen Sie das folgende Beispiel YAML:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine
name: mypod
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1
memory: 2G
tolerations:
- key: "sku"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
Planen Sie den Pod mit dem Befehl kubectl apply
:
kubectl apply -f nginx-toleration.yaml
Es dauert einige Sekunden, um den Pod zu planen und das NGINX-Image per Pull abzurufen.
Überprüfen Sie den Status mithilfe des kubectl describe pod
Befehls:
kubectl describe pod mypod
Die folgende komprimierte Beispielausgabe zeigt, dass die sku=gpu:NoSchedule
Toleration angewendet wird. Im Abschnitt "Ereignisse" hat der Planer dem Knoten den Pod moc-lbeof1gn6x3
zugewiesen:
[...]
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
sku=gpu:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 54s default-scheduler Successfully assigned default/mypod to moc-lbeof1gn6x3
Normal Pulling 53s kubelet Pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
Normal Pulled 48s kubelet Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" in 3.025148695s (3.025157609s including waiting)
Normal Created 48s kubelet Created container
Normal Started 48s kubelet Started container
Nur Pods, auf die diese Tolerierung angewendet wurde, können auf Knoten in taintnp
. Alle anderen Pods werden im Knotenpool nodepool1 geplant. Wenn Sie mehr Knotenpools erstellen, können Sie mit Taints und Toleranzen einschränken, welche Pods für diese Knotenressourcen geplant werden können.
Aktualisieren eines Clusterknotenpools zum Hinzufügen eines Knotens taint
Aktualisieren Sie einen Cluster, um einen Knoten mit dem az aksarc update
Befehl und dem --node-taints
Parameter hinzuzufügen, der für den Taint angegeben sku=gpu:NoSchedule
werden soll. Alle vorhandenenTaints werden durch die neuen Werte ersetzt. Die altenTaints werden gelöscht:
az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"