Freigeben über


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 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.

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

  1. Erstellen Sie einen Knotenpool mit einem Taint mithilfe des Befehls az aks nodepool add, und verwenden Sie den --node-taints-Parameter, um sku=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
    
  2. Überprüfen Sie den Status des Knotenpools.

  3. Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist.

Aktualisieren eines Knotenpools, um ein Knoten-Taint hinzuzufügen

  1. Aktualisieren Sie einen Knotenpool, um ein Knoten-Taint mithilfe des Befehls az aks nodepool update hinzuzufügen, und verwenden Sie den --node-taints-Parameter, um sku=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
    
  2. Überprüfen Sie den Status des Knotenpools.

  3. Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist.

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 Sie az --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 oder az 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

  1. Registrieren Sie das Featureflag NodeInitializationTaintsPreview mithilfe des Befehls az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    Es dauert einige Minuten, bis der Status Registered (Registriert) angezeigt wird.

  2. Überprüfen Sie den Registrierungsstatus mithilfe des Befehls az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. 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

  1. Erstellen Sie einen Cluster mit einem Knoteninitialisierungs-Taint mithilfe des Befehls az aks create, und verwenden Sie den --node-initialization-taints-Parameter, um sku=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
    
  2. Überprüfen Sie den Status des Knotenpools.

  3. Überprüfen Sie, ob das Taint auf den Knoten festgelegt ist.

Erstellen eines Clusters, um ein Knoteninitialisierungs-Taint hinzuzufügen

  1. Aktualisieren Sie einen Cluster, um ein Knoteninitialisierungs-Taint mithilfe des Befehls az aks update hinzuzufügen, und verwenden Sie den --node-initialization-taints-Parameter, um sku=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"
    
  2. Überprüfen Sie den Status des Knotenpools.

  3. Ü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 angegebenen nodeTaints 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 angegebenen nodeInitializationTaints 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 festgelegten Taints 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

  1. Führen Sie die Schritte in Vorübergehendes Entfernen von Knoteninitialisierungs-Taints aus, um das Knoteninitialisierungs-Taint mithilfe der Kubernetes-API zu entfernen.

  2. 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 unter Taints nicht enthält:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

Nächste Schritte