Freigeben über


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 von tolerationSeconds 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 nodeTaintsErstellt:

[
  {
    ...
    "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"   

Nächste Schritte