GKE-Pods in bestimmten Zonen platzieren


Auf dieser Seite erfahren Sie, wie Sie Google Kubernetes Engine (GKE) anweisen, Ihre Pods mithilfe der zonalen Topologie auf Knoten in bestimmten Google Cloud-Zonen auszuführen. Diese Art der Platzierung ist in Situationen wie der folgenden nützlich:

  • Pods müssen auf Daten zugreifen, die in einem zonalen nichtflüchtigen Compute Engine-Speicher gespeichert sind.
  • Pods müssen neben anderen zonalen Ressourcen wie Cloud SQL-Instanzen ausgeführt werden.

Sie können die zonale Platzierung auch mit topologiesensitivem Traffic-Routing verwenden, um die Latenz zwischen Clients und Arbeitslasten zu reduzieren. Weitere Informationen zum Topology-fähigen Traffic-Routing finden Sie unter Topologiebezogenes Routing.

Die Verwendung der zonalen Topologie zur Steuerung der Pod-Platzierung ist ein erweiterter Kubernetes-Mechanismus, den Sie nur verwenden sollten, wenn Pods in bestimmten Zonen ausgeführt werden müssen. In den meisten Produktionsumgebungen empfehlen wir, wenn möglich regionale Ressourcen zu verwenden. Dies ist, wenn möglich, die Standardeinstellung von GKE.

Zonale Platzierungsmethoden

Die zonale Topologie ist in Kubernetes mit dem Knotenlabel topology.kubernetes.io/zone: ZONE eingebunden. Mit einer der folgenden Methoden können Sie GKE anweisen, einen Pod in einer bestimmten Zone zu platzieren:

  • nodeAffinity: Geben Sie eine nodeAffinität-Regel in Ihrer Pod-Spezifikation für eine oder mehrere Google Cloud-Zonen an. Diese Methode ist flexibler als ein nodeSelector, da Sie Pods in mehreren Zonen platzieren können.
  • nodeSelector: Geben Sie einen nodeSelector in Ihrer Pod-Spezifikation für eine einzelne Google Cloud-Zone an.

Hinweise

Für die Platzierung zonaler Pods mit zonaler Topologie gelten folgende Überlegungen:

  • Der Cluster muss sich in derselben Google Cloud-Region wie die angeforderten Zonen befinden.
  • In Standardclustern müssen Sie die automatische Knotenbereitstellung verwenden oder Knotenpools mit Knoten in den angeforderten Zonen erstellen. Autopilot-Cluster verwalten diesen Prozess automatisch.
  • Standardcluster müssen regionale Cluster sein.

Preise

Die zonale Topologie ist eine Kubernetes-Planungsfunktion und wird in GKE ohne zusätzliche Kosten angeboten.

Preisinformationen finden Sie unter GKE-Preise.

Hinweise

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.
  • Achten Sie darauf, dass sich in derselben Google Cloud-Region ein GKE-Cluster befindet, in dem sich Ihre Pods befinden sollen. Informationen zum Erstellen eines neuen Clusters finden Sie unter Autopilot-Cluster erstellen.

Pods mit nodeAffinity in mehreren Zonen platzieren

Kubernetes nodeAffinität bietet einen flexiblen Planungsmechanismus, der mehrere Labelselektoren und logische Operatoren unterstützt. Verwenden Sie nodeAffinity, wenn Sie Pods in einer von mehreren Zonen ausführen möchten (z. B. in us-central1-a oder us-central1-f).

  1. Speichern Sie das folgende Manifest als multi-zone-affinity.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-multi-zone
      template:
        metadata:
          labels:
            app: nginx-multi-zone
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                    - us-central1-a
                    - us-central1-f
    

    Dieses Manifest erstellt ein Deployment mit drei Replikaten und platziert die Pods basierend auf der Knotenverfügbarkeit in us-central1-a oder us-central1-f.

    Achten Sie darauf, dass sich der Cluster in der Region us-central1 befindet. Wenn sich Ihr Cluster in einer anderen Region befindet, ändern Sie die Zonen im Feld „Werte“ des Manifests in gültige Zonen in Ihrer Clusterregion.

  2. Erstellen Sie das Deployment:

    kubectl create -f multi-zone-affinity.yaml
    

    GKE erstellt die Pods in Knoten in einer der angegebenen Zonen. Auf einem Knoten können mehrere Pods ausgeführt werden. Optional können Sie mithilfe von Pod-Anti-Affinität GKE anweisen, jeden Pod auf einem separaten Knoten zu platzieren.

Pods mit einem nodeSelector in einer einzigen Zone platzieren

Um Pods in einer einzelnen Zone zu platzieren, verwenden Sie einen nodeSelector in der Pod-Spezifikation. Ein nodeSelector entspricht einer requiredDuringSchedulingIgnoredDuringExecution-nodeAffinity-Regel, für die eine einzelne Zone angegeben ist.

  1. Speichern Sie das folgende Manifest als single-zone-selector.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-singlezone
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-singlezone
      template:
        metadata:
          labels:
            app: nginx-singlezone
        spec:
          nodeSelector:
            topology.kubernetes.io/zone: "us-central1-a"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    

    Dieses Manifest weist GKE an, alle Replikate im Deployment in der Zone us-central1-a zu platzieren.

  2. Erstellen Sie das Deployment:

    kubectl create -f single-zone-selector.yaml
    

Pod-Platzierung prüfen

Zum Prüfen der Pod-Platzierung listen Sie die Pods auf und prüfen die Knotenlabels. Möglicherweise werden mehrere Pods in einem einzelnen Knoten ausgeführt. Daher werden Pods möglicherweise nicht auf mehrere Zonen verteilt, wenn Sie nodeAffinity verwendet haben.

  1. Listen Sie Ihre Pods auf:

    kubectl get pods -o wide
    

    Die Ausgabe ist eine Liste von ausgeführten Pods und dem entsprechenden GKE-Knoten.

  2. Beschreiben Sie die Knoten:

    kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"
    

    Ersetzen Sie NODE_NAME durch den Namen des Knotens.

    Die Ausgabe sieht in etwa so aus:

    topology.kubernetes.io/zone: us-central1-a
    

Wenn Sie möchten, dass GKE die Pods gleichmäßig auf mehrere Zonen verteilt, damit ein Failover auf mehrere fehlerhafte Domains ausgeführt werden kann, verwenden Sie topologyDistributedConstraints.

Nächste Schritte