Planung mit Knotenmarkierungen steuern


Diese Seite bietet eine Übersicht über Knotenmarkierungen in Google Kubernetes Engine (GKE). Mit Knotenmarkierungen können Sie die Knoten angeben, auf denen Arbeitslasten ausgeführt werden sollen.

Autopilot-Cluster unterstützen nur die Verwendung von Knotenmarkierungen für die Arbeitslasttrennung. Eine Anleitung finden Sie unter Arbeitslasttrennung in GKE konfigurieren.

Überblick

Wenn Sie eine Arbeitslast zur Ausführung in einem Cluster einreichen, bestimmt der Planer, wo die der Arbeitslast zugeordneten Pods platziert werden. Der Planer kann einen Pod auf einem beliebigen Knoten platzieren, der die CPU-, Arbeitsspeicher- und angepassten Ressourcenanforderungen des Pods erfüllt.

Wenn der Cluster verschiedene Arbeitslasten ausführt, möchten Sie möglicherweise steuern, welche Arbeitslasten in einem bestimmten Knotenpool ausgeführt werden können.

Mit einer Knotenmarkierung können Sie einen Knoten markieren. Dies bewirkt, dass der Planer den Knoten für bestimmte Pods nicht verwendet. Ein ergänzendes Feature, Toleranzen, ermöglicht die Festlegung von Pods, die mit "markierten" Knoten verwendet werden können.

Markierungen und Toleranzen arbeiten zusammen, um sicherzustellen, dass Pods nicht auf geeigneten Knoten geplant werden.

Knotenmarkierungen sind Schlüssel/Wert-Paare, die einem Effekt zugeordnet sind. In der folgenden Tabelle sind die verfügbaren Effekte aufgeführt:

Effekt Beschreibung
NoSchedule Pods, die diese Markierung nicht tolerieren, werden nicht auf dem Knoten geplant. Vorhandene Pods werden nicht vom Knoten entfernt.
PreferNoSchedule Kubernetes plant keine Pods, die diese Markierung auf Knoten nicht tolerieren.
NoExecute Der Pod wird aus dem Knoten entfernt, wenn er bereits auf dem Knoten ausgeführt wird, und er wird nicht für den Knoten geplant, wenn er noch nicht auf dem Knoten ausgeführt wird.

Vorteile von Knotenmarkierungen in GKE

Sie können Knotenmarkierungen in GKE oder mit dem Befehl kubectl taint hinzufügen. Das Festlegen von Knotenmarkierungen in GKE bietet mehrere Vorteile gegenüber kubectl:

  • Markierungen bleiben erhalten, wenn ein Knoten neu gestartet oder ersetzt wird.
  • Markierungen werden automatisch erstellt, wenn ein Knoten zu einem Pool oder Cluster hinzugefügt wird.
  • Markierungen werden während dem Cluster-Autoscaling automatisch erstellt.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit gcloud components update ab.

Cluster mit Knotenmarkierungen erstellen

Wenn Sie einen Cluster in GKE erstellen, können Sie dem Cluster Knotenmarkierungen zuweisen. Dadurch werden die Markierungen allen Knoten zugewiesen, die mit dem Cluster erstellt wurden.

Wenn Sie einen Standardcluster mit Knotenmarkierungen erstellen, die den Effekt NoSchedule oder den Effekt NoExecute haben, kann GKE keine von GKE verwalteten Komponenten wie kube-dns oder metrics-server im Standardknotenpool planen, den GKE beim Erstellen des Clusters erstellt. GKE kann diese Komponenten nicht planen, da sie nicht die entsprechenden Toleranzen für Ihre Knotenmarkierungen haben. Sie müssen einen neuen Knotenpool hinzufügen, der eine der folgenden Bedingungen erfüllt:

  • Keine Markierungen
  • Eine Markierung mit dem Effekt PreferNoSchedule
  • Die components.gke.io/gke-managed-components=true:NoSchedule-Markierung

Mit jeder dieser Bedingungen kann GKE von GKE verwaltete Komponenten im neuen Knotenpool planen.

Eine Anleitung finden Sie unter Arbeitslasten auf dedizierten Knoten isolieren.

gcloud

Führen Sie den folgenden Befehl aus, um einen Cluster mit Knotenmarkierungen zu erstellen:

gcloud container clusters create CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

Dabei gilt:

  • CLUSTER_NAME ist der Name des neuen Clusters.
  • EFFECT: Einer der folgenden Effektwerte: PreferNoSchedule, NoSchedule oder NoExecute.
  • KEY=VALUE ist ein Schlüssel/Wert-Paar, das EFFECT zugeordnet ist.

Mit dem folgenden Befehl wird beispielsweise eine Markierung mit dem Schlüsselwert dedicated=experimental mit dem Effekt PreferNoSchedule angewendet:

gcloud container clusters create example-cluster \
    --node-taints dedicated=experimental:PreferNoSchedule

Console

So erstellen Sie einen Cluster mit Knotenmarkierungen:

  1. Rufen Sie in der Google Cloud Console die Seite Google Kubernetes Engine auf.

    Zur Seite „Google Kubernetes Engine“

  2. Klicken Sie auf Erstellen.

  3. Konfigurieren Sie den Cluster wie gewünscht.

  4. Maximieren Sie im Navigationsbereich unter Knotenpools den Knotenpool, den Sie ändern möchten, und klicken Sie dann auf Metadaten.

  5. Klicken Sie im Abschnitt Knotenmarkierungen auf Markierung hinzufügen.

  6. Wählen Sie in der Drop-down-Liste Effekt den gewünschten Effekt aus.

  7. Geben Sie das gewünschte Schlüssel/Wert-Paar in die Felder Schlüssel und Wert ein.

  8. Klicken Sie auf Erstellen.

API

Wenn Sie die API verwenden, um einen Cluster zu erstellen, schließen Sie das Feld nodeTaints unter nodeConfig ein. Beispiel:

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters

{
  'cluster': {
    'name': 'example-cluster',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'special',
          'Value': 'gpu',
          'effect': 'PreferNoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

Knotenpool mit Knotenmarkierungen erstellen

Wenn Sie eine Markierung auf einen Knoten anwenden, dürfen nur Pods, die die Markierung tolerieren, auf dem Knoten ausgeführt werden. In einem GKE-Cluster können Sie eine Markierung auf einen Knotenpool anwenden. Dadurch wird die Markierung auf alle Knoten im Pool angewendet.

Zum Erstellen eines Knotenpools mit Knotenmarkierungen können Sie die Google Cloud CLI, die Google Cloud Console oder die GKE API verwenden.

gcloud

Führen Sie den folgenden Befehl aus, um einen Knotenpool mit Knotenmarkierungen zu erstellen:

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

Dabei gilt:

  • POOL_NAME: Der Name des Knotenpools, der erstellt werden soll.
  • CLUSTER_NAME: Der Name des Clusters, in dem der Knotenpool erstellt wird.
  • EFFECT: Einer der folgenden Effektwerte: PreferNoSchedule, NoSchedule oder NoExecute.
  • KEY=VALUE ist ein Schlüssel/Wert-Paar, das EFFECT zugeordnet ist.

Mit dem folgenden Befehl wird beispielsweise ein Knotenpool auf einem vorhandenen Cluster erstellt und eine Markierung mit dem Schlüsselwert dedicated=experimental mit dem Effekt NoSchedule angewendet:

gcloud container node-pools create example-pool --cluster example-cluster \
    --node-taints dedicated=experimental:NoSchedule

Dieser Befehl erstellt einen Knotenpool und wendet eine Markierung an, die das Schlüssel/Wert-Paar special=gpu mit dem Effekt NoExecute hat:

gcloud container node-pools create example-pool-2 --cluster example-cluster \
    --node-taints special=gpu:NoExecute

Console

Führen Sie die folgenden Schritte aus, um einen Knotenpool mit Knotenmarkierungen zu erstellen:

  1. Rufen Sie in der Google Cloud Console die Seite Google Kubernetes Engine auf.

    Zur Seite "Google Kubernetes Engine"

  2. Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie ändern möchten.

  3. Klicken Sie auf der Seite Cluster-Details auf Knotenpool hinzufügen.

  4. Klicken Sie im Navigationsbereich auf Metadaten.

  5. Klicken Sie unter Knotenmarkierungen auf Markierung hinzufügen.

  6. Wählen Sie in der Drop-down-Liste Effekt den gewünschten Effekt aus.

  7. Geben Sie das gewünschte Schlüssel/Wert-Paar in die Felder Schlüssel und Wert ein.

  8. Klicken Sie auf Erstellen.

API

Wenn Sie die API verwenden, um einen Knotenpool zu erstellen, schließen Sie das Feld nodeTaints unter nodeConfig ein. Beispiel:

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters/CLUSTER_ID/nodePools

{
  'nodePool': {
    'name': 'example-pool',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'dedicated',
          'Value': 'experimental',
          'effect': 'NoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

Pods für Tolerieren einer Markierung konfigurieren

Sie können festlegen, dass Pods Markierungen tolerieren, indem Sie das Feld tolerations in die Pod-Spezifikation aufnehmen. Dies ist ein Teil einer Pod-Spezifikation.

Dieser Pod kann auf einem Knoten geplant werden, der die Markierung dedicated=experimental:NoSchedule hat:

tolerations:
- key: dedicated
  operator: Equal
  value: experimental
  effect: NoSchedule

Markierung zu einem vorhandenen Knoten hinzufügen

Mit dem Befehl kubectl taint können Sie einem vorhandenen Knoten Markierungen hinzufügen:

kubectl taint nodes NODE_NAME KEY=VALUE:EFFECT

Mit dem folgenden Befehl wird beispielsweise eine Markierung mit dem Schlüsselwert dedicated=experimental und dem Effekt NoSchedule auf den Knoten mynode angewendet:

kubectl taint nodes mynode dedicated=experimental:NoSchedule

Sie können Markierungen auch Knoten hinzufügen, die ein bestimmtes Label haben. Dazu verwenden Sie den Selektor -l zusammen mit dem angegebenen Label und Wert:

kubectl taint nodes -l LABEL=LABEL_VALUE KEY=VALUE:EFFECT

Mit dem folgenden Befehl wird beispielsweise eine Markierung mit dem Schlüssel dedicated-pool zu GKE-Knoten im Knotenpool my_pool hinzugefügt:

kubectl taint nodes -l cloud.google.com/gke-nodepool=my_pool dedicated-pool=my_pool:NoSchedule

Markierungen für einen Knoten prüfen

Verwenden Sie das kubectl-Befehlszeilentool, um die Markierungen für einen Knoten abzurufen.

  1. Rufen Sie mit dem folgenden Befehl eine Liste aller Knoten in Ihrem Cluster ab:

    kubectl get nodes
    
  2. Zum Prüfen eines Knotens können Sie den folgenden Befehl verwenden:

    kubectl describe node NODE_NAME
    
  3. Suchen Sie in der Ausgabe nach dem Feld Taints. Die Ausgabe sieht etwa so aus:

    Taints:  dedicated-pool=mypool:NoSchedule
    

Markierung von einem Knoten entfernen

Sie können kubectl taint verwenden, um Markierungen zu entfernen. Sie können Markierungen nach Schlüssel, Schlüssel/Wert-Paar oder Schlüssel/Effekt entfernen.

Mit dem folgenden Befehl werden beispielsweise alle Markierungen mit dem Schlüssel dedicated aus dem Knoten mynode entfernt:

kubectl taint nodes mynode dedicated-

Alle Markierungen aus einem Knotenpool entfernen

Führen Sie den folgenden Befehl aus, um alle Markierungen aus einem Knotenpool zu entfernen:

gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME

Dabei gilt:

  • POOL_NAME: der Name des zu ändernden Knotenpools.
  • CLUSTER_NAME: der Name des Clusters, in dem der Knotenpool erstellt wurde.

Nächste Schritte