Kubernetes-Deployment skalieren

In Kubernetes-Umgebungen können Sie Ihre Datenbankressourcen dynamisch skalieren, wenn sich die Arbeitslastanforderungen ändern. Verwenden Sie diese Skalierungsverfahren, wenn Sie Spanner Omni mit dem Helm-Diagramm bereitgestellt haben.

Hinweis

Bevor Sie Ihre Kubernetes-Bereitstellung skalieren, müssen Sie Folgendes tun:

Als Best Practice empfehlen wir, vertikal auf mindestens 32 GB Arbeitsspeicher pro Server zu skalieren, bevor Sie weitere Server hinzufügen, um horizontal zu skalieren.

Beschränkungen

Für die Skalierung in Kubernetes gelten die folgenden Einschränkungen:

  • Nur Nicht-Root-Server: Die horizontale Skalierung wird für Nicht-Root-Instanzen unterstützt. Das Skalieren von Root-Servern wird nicht unterstützt.

  • Speicherbeschränkungen für StatefulSets: Da Kubernetes-volumeClaimTemplates unveränderlich sind, können Sie Pod-Festplatten nicht mit einem einzelnen helm upgrade-Befehl erweitern. Stattdessen erfordert das Skalieren von Speicherplatz manuelle Schritte zur Erweiterung des Volumes.

Vertikal skalieren

Wenn Sie die CPU- oder Arbeitsspeicherressourcen für Ihre Server anpassen möchten, aktualisieren Sie Ihre Konfiguration mit einem Helm-Upgrade:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set resources.cpu=CPU_CORES \
  --set resources.memory=MEMORY_LIMIT \
  -n NAMESPACE

Ersetzen Sie Folgendes:

  • HELM_CHART_PATH: Der Pfad zu Ihrem Helm-Diagramm, z. B. oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION: Die Version des Helm-Charts, z. B. 1.0.0.
  • CPU_CORES: Die Anzahl der vCPU-Kerne, die jedem Server-Pod zugewiesen werden sollen, z. B. 8.
  • MEMORY_LIMIT: Das RAM-Limit für jeden Server-Pod, z. B. 32Gi.
  • NAMESPACE: Der Kubernetes-Namespace der Bereitstellung, z. B. spanner-ns.

Horizontal skalieren

Wenn Sie horizontal skalieren möchten, fügen Sie Ihrer Bereitstellung weitere Server hinzu. Die horizontale Skalierung wird für Nicht-Root-Server unterstützt.

Nicht-Root-Server hinzufügen

Wenn Sie Nicht-Root-Server hinzufügen möchten, erhöhen Sie die Anzahl der Replikate in der Helm-Diagrammkonfiguration. Sie können alle Zonen einheitlich oder eine bestimmte Zone skalieren.

Einheitlich skalieren

Führen Sie den folgenden Befehl aus, um jede Zone im Deployment auf 15 Server zu skalieren:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set deployment.replicasPerZone=REPLICAS \
  -n NAMESPACE

Ersetzen Sie Folgendes:

  • HELM_CHART_PATH: Der Pfad zu Ihrem Helm-Diagramm, z. B. oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION: Die Version des Helm-Charts, z. B. 1.0.0.
  • REPLICAS: Die Zielanzahl der Serverreplikate pro Zone, z. B. 15.
  • NAMESPACE: Der Kubernetes-Namespace, z. B. spanner-ns.

Bestimmte Zone skalieren

Wenn bei der ersten Bereitstellung unterschiedliche Serveranzahlen für die einzelnen Zonen konfiguriert wurden, können Sie auf eine einzelne Zone ausrichten. Wenn Sie beispielsweise die Anzahl der Replikate der ersten Zone am ersten Standort auf 15 erhöhen möchten, führen Sie den folgenden Befehl aus:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set locations[0].zones[0].replicas=REPLICAS \
  -n NAMESPACE

Ersetzen Sie REPLICAS durch die Anzahl der Replikate in der Zielzone, z. B. 15.

Um zu prüfen, ob die neuen Server der Bereitstellung erfolgreich beigetreten sind, fragen Sie die Spanner Omni CLI ab, um die Bereitstellungsserver aufzulisten, oder rufen Sie Ihr Grafana-Dashboard auf.

spanner deployment servers list \
  --zone=ZONE \
  --deployment-endpoint=ENDPOINT

Ersetzen Sie Folgendes:

  • ZONE: Die Zone, die Sie auflisten möchten, z. B. us-central1-a.
  • ENDPOINT: Der externe Endpunkt Ihrer Bereitstellung, z. B. ${ENDPOINT}:15000.

Nicht-Root-Server entfernen

Das Herunterfahren von Servern erfordert zusätzliche Schritte, da das System Datenpartitionen sicher von den außer Betrieb genommenen Servern verschieben muss. Da Kubernetes-StatefulSets Pods vom höchsten zum niedrigsten Index entfernen, müssen Sie zuerst die Nicht-Root-Server mit dem höchsten Index entfernen.

So verringern Sie die Anzahl der Server:

  1. Listen Sie die Server in Ihrer Zone auf, um Kandidaten für das Entfernen zu identifizieren:

    spanner deployment servers list \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    Beispielausgabe:

    NAME                                                          HOST                        PORT_BASE  ROOT  STATE
    zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000  spanner-a-0.pod.spanner-ns  15000      true  -
    zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000  spanner-a-1.pod.spanner-ns  15000      -     -
    

    Löschen Sie den außer Betrieb genommenen Nicht-Root-Server mit dem höchsten Index (z. B. spanner-a-1.pod.spanner-ns:15000):

    spanner deployment servers delete SERVER_NAME \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    Ersetzen Sie SERVER_NAME durch die Server-ID, z. B. spanner-a-1.pod.spanner-ns:15000.

    Prüfen Sie die Serverliste, bis der Zielserver daraus entfernt wurde. Nach dem Löschen wechselt der Server in einen fehlerhaften Zustand und wird aus dem aktiven Dienstpfad entfernt.

  2. Skalieren Sie das Helm-Deployment herunter, indem Sie einen Helm-Upgrade-Befehl ausführen, der Ihrer Zielreplikatzahl entspricht. Wenn Sie beispielsweise die Anzahl der Replikate pro Zone auf 1 Pods verringern möchten, führen Sie den folgenden Befehl aus:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set deployment.replicasPerZone=REPLICAS \
      -n NAMESPACE
    

    Ersetzen Sie REPLICAS durch die aktualisierte Anzahl der Replikate, z. B. 1.

  3. Löschen Sie die Kubernetes-Anforderungen nichtflüchtiger Volumes (Persistent Volume Claims, PVCs), die mit den entfernten Pods verknüpft sind. Um versehentlichen Datenverlust zu verhindern, werden PVCs von Helm und Kubernetes nicht automatisch gelöscht, wenn ein StatefulSet herunterskaliert wird. So löschen Sie die PVCs manuell, um den Speicherplatz vollständig freizugeben:

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    So löschen Sie beispielsweise die Logs und Datenvolumen für spanner-a-1 im Namespace spanner-ns:

    kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
    

Zonen hinzufügen

Wenn Sie Ihrer Bereitstellung eine neue Zone hinzufügen, erhöhen Sie die Verfügbarkeit und schützen Ihre Datenbank vor Ausfällen einzelner Zonen.

Mit dem folgenden Befehl wird beispielsweise ein laufendes Single-Zone-Deployment in Google Kubernetes Engine (GKE) in der Zone us-east1-b der Region us initialisiert:

helm upgrade --install spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --set resources.cpu=2 \
  --set resources.memory=8Gi \
  --set global.platform=gke \
  --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
  -n NAMESPACE

Fügen Sie dieser Konfiguration die Zone us-east1-c hinzu, indem Sie die folgenden Schritte ausführen:

  1. Starten Sie die Pods in der neuen Zone, indem Sie den Befehl helm upgrade ausführen und einen aktualisierten JSON-Block übergeben, der die neue Standortzone enthält:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \
      -n NAMESPACE
    
  2. Fügen Sie die neue Zone mit der Spanner Omni-CLI hinzu. Warten Sie, bis die Root-Server-Pods in der neu erstellten Zone den Status Running und „Bereit“ erreicht haben. Führen Sie dann den Befehl zum Erstellen der Zone aus:

    spanner deployment zones create NEW_ZONE \
      --location=LOCATION \
      --root-servers=ROOT_SERVERS_LIST \
      --deployment-endpoint=ENDPOINT
    

    Ersetzen Sie Folgendes:

    • NEW_ZONE: Die Kennung der Zone, die hinzugefügt werden soll, z. B. us-east1-c.
    • LOCATION: Der Bereitstellungsort, z. B. us.
    • ROOT_SERVERS_LIST: Eine durch Kommas getrennte Liste von Root-Server-Endpunkten in der neuen Zone, z. B. spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000.
    • ENDPOINT: Der externe Bereitstellungsendpunkt, z. B. ${ENDPOINT}:15000.
  3. Warten Sie, bis die Zonenerstellung abgeschlossen ist. Die Replikation vorhandener Datenbankschemas und ‑tabellen in eine neue Zone dauert einige Zeit. Überwachen Sie den Fortschritt der Zonensynchronisierung, indem Sie die Bereitstellungszonen auflisten:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    

Zone entfernen

Sie können eine aktive Zone aus Ihrer Bereitstellung mit mehreren Zonen außer Betrieb nehmen, um Ressourcen zu reduzieren oder sich an Topologieänderungen anzupassen.

Entfernen Sie die Zone us-east1-c, die Sie im vorherigen Abschnitt erstellt haben, indem Sie die folgenden Schritte ausführen:

  1. Löschen Sie die Zone und starten Sie die Zone-Tear-Down-Prozedur in Spanner Omni:

    spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINT
    

    Ersetzen Sie ZONE durch die Zone, die entfernt werden soll, z. B. us-east1-c.

  2. Prüfen Sie, ob der Bereich entfernt wurde. Führen Sie einen List-Befehl aus und warten Sie, bis die Zone nicht mehr in der Ausgabe angezeigt wird:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. Entfernen Sie die Server aus dem Kubernetes-Cluster, indem Sie den Befehl „helm upgrade“ ausführen und einen aktualisierten JSON-Block für „locations“ übergeben, in dem die entfernte Zone ausgeschlossen wird:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
      -n NAMESPACE
    

Speicher skalieren

Da Kubernetes-volumeClaimTemplates unveränderlich sind, können Sie die Speicherkapazitäten von Pods nicht direkt mit dem Befehl helm upgrade hochskalieren. Stattdessen müssen Sie das Volume manuell erweitern. Weitere Informationen finden Sie im Leitfaden zum Erweitern von StatefulSet-Volumes in GKE.

So erweitern Sie den Festplattenspeicher:

  1. Definieren Sie die Parameter für die Volumenerweiterung als Umgebungsvariablen in Ihrem Terminal:

    NEW_SIZE="NEW_SIZE"
    NAMESPACE="NAMESPACE"
    RELEASE_NAME="spanner-omni"
    STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3"
    HELM_CHART_PATH="HELM_CHART_PATH"
    VERSION="VERSION"
    

    Ersetzen Sie Folgendes:

    • NEW_SIZE: Die Zielgröße der Speicherkapazität, z. B. 200Gi.
    • NAMESPACE: Der Kubernetes-Namespace, z. B. spanner-ns.
    • STATEFULSET_NAME_1, STATEFULSET_NAME_2, …: Die Namen der StatefulSets in Ihrem Deployment, die in der Regel den Kurznamen Ihrer Zonen entsprechen (z. B. spanner-east-b spanner-east-c).
    • HELM_CHART_PATH: Der Pfad zu Ihrem Helm-Diagramm, z. B. oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
    • VERSION: Die Version des Helm-Charts, z. B. 1.0.0.
  2. Führen Sie die Befehle aus, um die PVCs zu patchen, die StatefulSets zu löschen (wobei die Backend-Pods intakt bleiben) und das Helm-Deployment zu aktualisieren:

    # Patch all associated PVCs directly.
    for pvc in $(kubectl get pvc -n $NAMESPACE \
      -l app.kubernetes.io/instance=$RELEASE_NAME \
      -o name | grep "data-volume"); do
      kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}"
    done
    
    # Delete the StatefulSet while leaving backend pods intact (orphan cascade).
    kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan
    
    # Run Helm upgrade to align the templates with the expanded size.
    helm upgrade $RELEASE_NAME $HELM_CHART_PATH \
      --version $VERSION \
      --reuse-values \
      --set storage.data.size=$NEW_SIZE \
      -n $NAMESPACE
    

Nächste Schritte