Kompakte Platzierung für GKE-Knoten definieren


Mit einer Richtlinie für kompakte Platzierung können Sie steuern, ob sich die GKE-Knoten (Google Kubernetes Engine) relativ zueinander innerhalb einer Zone befinden.

Überblick

Wenn Sie Knotenpools und Arbeitslasten in einem GKE-Cluster erstellen, können Sie eine kompakte Platzierungsrichtlinie definieren. Diese gibt an, dass diese Knoten oder Arbeitslasten innerhalb einer Zone näher beieinander platziert werden sollen. Wenn sich Knoten näher beieinander befinden, kann die Netzwerklatenz zwischen Knoten reduziert werden. Dies kann besonders für eng gekoppelte Batcharbeitslasten nützlich sein.

Kompakte Platzierung mit GKE Autopilot verwenden

Beschränkungen

  • GKE stellt Arbeitslasten innerhalb einer kompakten Platzierung in derselben Zone bereit.
  • Die kompakte Platzierung ist auf Balanced und A100 GPU verfügbar. Weitere Informationen finden Sie unter Maschinentypen.
  • Kompakte Platzierungen sind für Pods verfügbar, die auf bis zu 150 Knoten gruppiert werden.
  • Live-Migration für Knoten wird nicht unterstützt.

Kompakte Platzierungsrichtlinie aktivieren

Fügen Sie der Pod-Spezifikation mit den folgenden Schlüsseln einen nodeSelector hinzu, um die kompakte Platzierung für GKE Autopilot zu aktivieren:

  • cloud.google.com/gke-placement-group ist die Kennung, die Sie der Gruppe von Pods zuweisen, die zusammen in derselben kompakten Placement-Gruppe ausgeführt werden sollen.

  • Verwenden Sie einen der folgenden Schlüssel, um den Ressourcentyp zu definieren:

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"

Das folgende Beispiel ist ein Auszug einer Pod-Spezifikation, die eine kompakte Platzierung ermöglicht. Die Kennung der Placement-Gruppe ist placement-group-1 und die Compute-Klasse ist Balanced:

  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"

Jede Placement-Gruppe ist auf 150 Knoten beschränkt. Sie sollten eine Placement-Gruppe nur auf die Arbeitslasten beschränken, die von der Gruppierung profitieren, und Ihre Arbeitslasten nach Möglichkeit auf separate Placement-Gruppen verteilen.

Kompakte Platzierung mit GKE Standard verwenden

Beschränkungen

Für die kompakte Platzierung in GKE Standard-Knotenpools gelten die folgenden Einschränkungen:

Kompakte Platzierungsrichtlinie erstellen

Zum Erstellen kompakter Platzierungsrichtlinien geben Sie im Google Cloud CLI die Option placement-type=COMPACT während der Knotenpool- oder Clustererstellung an. Mit dieser Einstellung versucht GKE, Knoten innerhalb eines Knotenpools näher beieinander zu platzieren.

Wenn Sie eine vorhandene Ressourcenrichtlinie in Ihrem Cluster verwenden möchten, geben Sie den Speicherort Ihrer benutzerdefinierten Richtlinie für das Flag placement-policy während der Knotenpool- oder Clustererstellung an. Dies ermöglicht die Verwendung von reservierten Placements, mehrere Knotenpools mit derselben Platzierungsrichtlinie und andere erweiterte Placement-Optionen. Sie erfordert jedoch auch mehr manuelle Vorgänge als die Angabe des Flags "--Placement-type=COMPACT". Beispielsweise müssen Sie benutzerdefinierte Ressourcenrichtlinien erstellen, löschen und verwalten. Achten Sie darauf, dass die maximale Anzahl von VM-Instanzen in allen Knotenpools mithilfe der Ressourcenrichtlinie eingehalten wird. Wenn dieses Limit erreicht wird, während einige Ihrer Knotenpools ihre maximale Größe nicht erreichen, schlägt das Hinzufügen weiterer Knoten fehl.

Wenn Sie die Flags placement-type und placement-policy nicht angeben, gibt es standardmäßig keine Anforderungen zur Knotenplatzierung.

Richtlinie für kompakte Platzierung in einem neuen Cluster erstellen

Wenn Sie einen neuen Cluster erstellen, können Sie eine kompakte Platzierungsrichtlinie angeben, die auf den Standardknotenpool angewendet wird. Bei allen nachfolgenden Knotenpools, die Sie für den Cluster erstellen, müssen Sie angeben, ob eine kompakte Platzierung angewendet werden soll.

Verwenden Sie den folgenden Befehl, um einen Cluster mit einem Standardknotenpool zu erstellen, auf den eine Richtlinie für kompakte Platzierung angewendet wird:

gcloud container clusters create CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Dabei gilt:

  • CLUSTER_NAME: Der Name des neuen Clusters.
  • MACHINE_TYPE: Der Maschinentyp für Knoten; muss ein C2-Maschinentyp sein (z. B. c2-standard-4).
  • --placement-type COMPACT: Wendet eine kompakte Platzierung auf die Knoten im Standardknotenpool an.
  • MAX_UNAVAILABLE: Maximale Anzahl von Knoten, die während eines Knotenpool-Upgrades gleichzeitig nicht verfügbar sein können. Für eine kompakte Platzierung empfehlen wir schnelle Surge-Upgrades, um die Wahrscheinlichkeit zu verbessern, dass sich Knoten während der Upgrades an einem anderen Ort befinden.

Richtlinie für kompakte Platzierung in einem vorhandenen Cluster erstellen

Auf einem vorhandenen Cluster können Sie einen Knotenpool erstellen, auf den eine Richtlinie für kompakte Platzierung angewendet wird.

Verwenden Sie den folgenden Befehl, um einen Knotenpool zu erstellen, auf den eine Richtlinie für kompakte Platzierung angewendet wird:

gcloud container node-pools create NODEPOOL_NAME \
    --machine-type MACHINE_TYPE \
    --cluster CLUSTER_NAME \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Dabei gilt:

  • NODEPOOL_NAME: Der Name des neuen Knotenpools.
  • MACHINE_TYPE: Der Maschinentyp für Knoten; muss ein C2-Maschinentyp sein (z. B. c2-standard-4).
  • CLUSTER_NAME: Name Ihres vorhandenen Clusters.
  • --placement-type COMPACT: Gibt an, dass die kompakte Platzierung für die Knoten im neuen Knotenpool angewendet werden soll.
  • MAX_UNAVAILABLE: Maximale Anzahl von Knoten, die während eines Knotenpool-Upgrades gleichzeitig nicht verfügbar sein können. Für eine kompakte Platzierung empfehlen wir schnelle Surge-Upgrades, um die Wahrscheinlichkeit zu verbessern, dass sich Knoten während der Upgrades an einem anderen Ort befinden.

Knotenpools mit einer gemeinsamen benutzerdefinierten Platzierungsrichtlinie erstellen

Sie können manuell eine Ressourcenrichtlinie erstellen und in mehreren Knotenpools verwenden.

  1. Erstellen Sie die Ressourcenrichtlinie in der Google Cloud-Region des Clusters:

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION \
        --collocation collocated
    

    Ersetzen Sie Folgendes:

    • POLICY_NAME: Der Name Ihrer Ressourcenrichtlinie.
    • REGION: Die Region Ihres Clusters.
  2. Erstellen Sie mit der benutzerdefinierten Ressourcenrichtlinie einen Knotenpool:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

    Ersetzen Sie Folgendes:

    • NODEPOOL_NAME: Der Name des neuen Knotenpools.
    • MACHINE_TYPE: Der Maschinentyp für Knoten; muss ein C2-Maschinentyp sein (z. B. c2-standard-4).
    • CLUSTER_NAME: Name Ihres vorhandenen Clusters.
    • MAX_UNAVAILABLE: Maximale Anzahl von Knoten, die während eines Knotenpool-Upgrades gleichzeitig nicht verfügbar sein können. Für eine kompakte Platzierung empfehlen wir schnelle Surge-Upgrades, um die Wahrscheinlichkeit zu verbessern, dass sich Knoten während der Upgrades an einem anderen Ort befinden.

Compute Engine-Reservierung mit einer Richtlinie für kompakte Platzierung verwenden

Mit Reservierungen können Sie dafür sorgen, dass Hardware in der angegebenen Zone verfügbar ist, um das Risiko von Fehlern bei der Knotenpoolerstellung aufgrund unzureichender Hardware zu verringern.

  1. Erstellen Sie eine Reservierung, die eine kompakte Platzierungsrichtlinie angibt:

    gcloud compute reservations create RESERVATION_NAME \
        --vm-count MACHINE_COUNT \
        --machine-type MACHINE_TYPE \
        --resource-policies policy=POLICY_NAME \
        --zone ZONE \
        --require-specific-reservation
    

    Ersetzen Sie Folgendes:

    • RESERVATION_NAME: Der Name Ihrer Reservierung.
    • MACHINE_COUNT: Die Anzahl der reservierten Knoten.
    • MACHINE_TYPE: Der Maschinentyp für Knoten; muss ein C2-Maschinentyp sein. Wenn Sie beispielsweise einen vordefinierten C2-Maschinentyp mit 4 vCPUs verwenden möchten, geben Sie c2-standard-4 an.
    • POLICY_NAME: Der Name Ihrer Ressourcenrichtlinie.
    • ZONE: Die Zone, in der Ihre Reservierung erstellt werden soll.
  2. Erstellen Sie einen Knotenpool. Geben Sie dazu die Richtlinie für kompakte Platzierung und die Reservierung an, die Sie im vorherigen Schritt erstellt haben:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --reservation-affinity specific \
        --reservation RESERVATION_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

Ersetzen Sie Folgendes:

  • NODEPOOL_NAME: Der Name des neuen Knotenpools.
  • MACHINE_TYPE: Der Maschinentyp für Knoten; muss ein C2-Maschinentyp sein (z. B. c2-standard-4).
  • CLUSTER_NAME: Name Ihres vorhandenen Clusters.

Arbeitslast auf Knoten mit kompakter Platzierung erstellen

Zum Ausführen von Arbeitslasten auf dedizierten Knoten mit kompakter Platzierung können Sie beispielsweise folgende Kubernetes-Mechanismen verwenden: Pods zu Knoten zuweisen und das Planen unerwünschter Pods für eine Gruppe von Knoten verhindern.

Im folgenden Beispiel fügen Sie den dedizierten Knoten eine Markierung und den Pods eine entsprechende Toleranz und Affinität hinzu.

  1. Fügen Sie den Knoten im Knotenpool mit einer Richtlinie für kompakte Platzierung eine Markierung hinzu:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. Geben Sie in der Arbeitslastdefinition die erforderliche Toleranz und eine Knotenaffinität an. Hier ein Beispiel mit einem einzelnen Pod:

    apiVersion: v1
    kind: Pod
    metadata:
      ...
    spec:
      ...
      tolerations:
      - key: dedicated-pool
        operator: "Equal"
        value: "NODEPOOL_NAME"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated-pool
                operator: In
                values:
                - NODEPOOL_NAME
    

An einigen Standorten ist es möglicherweise nicht möglich, einen großen Knotenpool mithilfe einer Richtlinie für kompakte Platzierung zu erstellen. Wenn Sie die Größe solcher Knotenpools auf das Erforderliche beschränken möchten, sollten Sie einen Knotenpool pro Arbeitslast erstellen, der eine kompakte Platzierung erfordert.

Kompakte Platzierung für die automatische Knotenbereitstellung verwenden

Ab der GKE-Version 1.25 unterstützt die automatische Knotenbereitstellung die Richtlinie für kompakte Platzierung. Mit der automatischen Knotenbereitstellung stellt GKE automatisch Knotenpools anhand des Bedarfs von Clusterressourcen bereit. Weitere Informationen finden Sie unter Automatische Knotenbereitstellung verwenden.

Zur Aktivierung der kompakten Platzierung für die automatische Knotenbereitstellung fügen Sie der Pod-Spezifikation mit den folgenden Schlüsseln nodeSelector hinzu:

  • cloud.google.com/gke-placement-group ist die Kennung, die Sie der Gruppe von Pods zuweisen, die zusammen in derselben kompakten Placement-Gruppe ausgeführt werden sollen.

  • cloud.google.com/machine-family ist der Name der Maschinenfamilie. Verwenden Sie eine der Maschinenfamilien, die die kompakte Platzierung unterstützen. Wir empfehlen die Verwendung von C2- oder C2D-Maschinenfamilien für Arbeitslasten mit Rechen- und Netzwerkleistungsanforderungen.

Das folgende Beispiel zeigt eine Pod-Spezifikation, die die kompakte Platzierung ermöglicht:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY

Sie können den Schlüssel cloud.google.com/machine-family weglassen, wenn in der Pod-Konfiguration bereits ein Maschinentyp definiert ist, der für die kompakte Platzierung unterstützt wird. Wenn die Pod-Spezifikation beispielsweise nvidia.com/gpu enthält und der Cluster für die Verwendung von A100-GPUs konfiguriert ist, müssen Sie den Schlüssel cloud.google.com/machine-family nicht angeben.

Das folgende Beispiel zeigt eine Pod-Spezifikation, die die Anfrage nvidia.com/gpu definiert, und der Cluster ist für die Verwendung von A100-GPUs konfiguriert. Dieser Pod spec enthält nicht den Schlüssel cloud.google.com/machine-family:

  apiVersion: v1
  kind: Pod
  metadata:
    ...
  spec:
    ...
    nodeSelector:
      cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
      cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
    resources:
      limits:
        nvidia.com/gpu: 2

Weitere Informationen finden Sie unter Pods zur Nutzung von GPUs konfigurieren.

Größe der Placement-Gruppe optimieren

Da GKE die beste Platzierung für kleinere Bereitstellungen ermittelt, sollten Sie GKE anweisen, keine anderen Pod-Typen in derselben Placement-Gruppe auszuführen. Fügen Sie einen Toleranzschlüssel mit dem Schlüssel cloud.google.com/gke-placement-group und der von Ihnen definierten ID für die kompakte Platzierung hinzu.

Das folgende Beispiel zeigt eine Pod-Spezifikation, die eine Pod-Toleranz mit kompakter Platzierung definiert:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  tolerations:
  - key: cloud.google.com/gke-placement-group
    operator: "Equal"
    value: PLACEMENT_GROUP_IDENTIFIER
    effect: "NoSchedule"

Weitere Informationen zur automatischen Knotenbereitstellung mit Pod-Toleranz finden Sie unter Arbeitslasttrennung.

Nächste Schritte