Kubernetes-Deployment skalieren

In Kubernetes-Umgebungen können Sie Ihre Datenbankressourcen dynamisch skalieren, wenn sich die Anforderungen an die Arbeitslast ä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, die vertikale Skalierung auf mindestens 32 GB Arbeitsspeicher pro Server zu erhöhen, 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. Die Skalierung 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 einzigen helm upgrade Befehl erweitern. Stattdessen erfordert die Skalierung des Speichers manuelle Schritte zur Volume-Erweiterung.

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-Diagramms, z. B. 0.2.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

Wenn Sie jede Zone in der Bereitstellung auf 15 Server skalieren 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 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-Diagramms, z. B. 0.2.0.
  • REPLICAS: Die Zielanzahl der Serverreplikate pro Zone, z. B. 15.
  • NAMESPACE: Der Kubernetes-Namespace, z. B. spanner-ns.

Bestimmte Zone skalieren

Wenn in Ihrer ersten Bereitstellung unterschiedliche Serveranzahlen für einzelne Zonen konfiguriert wurden, können Sie eine einzelne Zone auswählen. Wenn Sie beispielsweise die 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 Zielanzahl der Zonenreplikate, z. B. 15.

Wenn Sie prüfen möchten, 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 Herunterskalieren von Servern erfordert zusätzliche Schritte, da das System Datenpartitionen sicher von 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 reduzieren Sie die Anzahl der Server:

  1. Listen Sie die Server in Ihrer Zone auf, um Kandidaten für die Entfernung 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 aus der Liste entfernt wurde. Nach dem Löschen wechselt der Server in einen fehlerhaften Zustand im System und wird aus dem aktiven Dienstpfad entfernt.

  2. Skalieren Sie die Helm-Bereitstellung herunter, indem Sie einen Helm-Upgrade-Befehl ausführen, um die Zielanzahl der Replikate zu erreichen. Wenn Sie beispielsweise die Replikate pro Zone auf 1 Pod reduzieren 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-PVCs (Persistent Volume Claims), die mit den entfernten Pods verknüpft sind. Um versehentlichen Datenverlust zu vermeiden, werden PVCs von Helm und Kubernetes nicht automatisch gelöscht, wenn ein StatefulSet herunterskaliert wird. Löschen Sie die PVCs manuell, um den Speicher vollständig freizugeben:

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    Beispiel: So löschen Sie die Protokoll- und Datenvolumes 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
    
spanner deployment servers delete

Zone hinzufügen

Wenn Sie Ihrer Bereitstellung eine neue Zone hinzufügen, erhöht sich die Verfügbarkeit und Ihre Datenbank ist vor Ausfällen in einer einzelnen Zone geschützt.

Mit dem folgenden Befehl wird beispielsweise eine aktive Einzelzonen bereitstellung in Google Kubernetes Engine (GKE) in der us-east1-b Zone 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ühren Sie die folgenden Schritte aus, um dieser Konfiguration die Zone us-east1-c hinzuzufügen:

  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 Zone 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 zur Zonenerstellung aus:

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

    Ersetzen Sie Folgendes:

    • NEW_ZONE: Die ID 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 der Root-Server-Endpunkte 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 Änderungen an der Topologie vorzunehmen.

Entfernen Sie die im vorherigen Abschnitt erstellte Zone us-east1-c. Führen Sie dazu die folgenden Schritte aus:

  1. Löschen Sie die Zone und starten Sie die Zonenentfernung in Spanner Omni:

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

    Ersetzen Sie ZONE durch die zu entfernende Zone, z. B. us-east1-c.

  2. Prüfen Sie, ob die Zone 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 einen Helm-Upgrade-Befehl ausführen und einen aktualisierten JSON-Block mit den Standorten übergeben, der die entfernte Zone nicht 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"}]}]' \
      -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 erhöhen. Stattdessen müssen Sie eine manuelle Volume-Erweiterung durchführen. Weitere Informationen finden Sie im Leitfaden zur Volume-Erweiterung für GKE-StatefulSets.

So erweitern Sie Ihren Festplattenspeicher:

  1. Definieren Sie die Parameter für die Volume-Erweiterung 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 Ihrer Bereitstellung, 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-Diagramms, z. B. 0.2.0.
  2. Führen Sie die Befehle aus, um die PVCs zu patchen, die StatefulSets zu löschen (die Backend-Pods bleiben erhalten) und die Helm-Bereitstellung 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