Mettre à l'échelle un déploiement Kubernetes

Les environnements Kubernetes vous permettent d'adapter dynamiquement les ressources de votre base de données en fonction de l'évolution des besoins de la charge de travail. Utilisez ces procédures de scaling si vous avez déployé Spanner Omni à l'aide du chart Helm.

Avant de commencer

Avant de mettre à l'échelle votre déploiement Kubernetes, vous devez effectuer les opérations suivantes :

Bonne pratique : nous vous recommandons de faire évoluer votre infrastructure verticalement jusqu'à au moins 32 Go de mémoire par serveur avant d'ajouter des serveurs pour évoluer horizontalement.

Limites

La mise à l'échelle dans Kubernetes présente les limites suivantes :

  • Serveurs non root uniquement : le scaling horizontal est compatible avec les instances non root. La mise à l'échelle des serveurs racine n'est pas prise en charge.

  • Contraintes de stockage StatefulSet : étant donné que les volumeClaimTemplates Kubernetes sont immuables, vous ne pouvez pas étendre les disques de pod à l'aide d'une seule commande helm upgrade. Au lieu de cela, la mise à l'échelle du stockage nécessite des étapes manuelles d'expansion du volume.

Mise à l'échelle verticale

Pour ajuster les ressources de processeur ou de mémoire de vos serveurs, mettez à jour votre configuration à l'aide d'une mise à niveau Helm :

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

Remplacez les éléments suivants :

  • HELM_CHART_PATH : chemin d'accès à votre chart Helm, par exemple oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION : version du chart Helm, par exemple 0.2.0.
  • CPU_CORES : nombre de cœurs de processeur virtuel à attribuer à chaque pod de serveur, par exemple 8.
  • MEMORY_LIMIT : limite de RAM pour chaque pod de serveur, par exemple 32Gi.
  • NAMESPACE : espace de noms Kubernetes du déploiement (par exemple, spanner-ns).

Évolutivité horizontale

Pour effectuer un scaling horizontal, ajoutez des serveurs à votre déploiement. La mise à l'échelle horizontale est compatible avec les serveurs non racine.

Ajouter des serveurs non root

Pour ajouter des serveurs non root, augmentez le nombre de répliques dans la configuration du graphique Helm. Vous pouvez mettre à l'échelle toutes les zones de manière uniforme ou une zone spécifique.

Mise à l'échelle uniforme

Pour mettre à l'échelle chaque zone du déploiement à 15 serveurs, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • HELM_CHART_PATH : chemin d'accès à votre chart Helm (par exemple, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni)
  • VERSION : version du chart Helm (par exemple, 0.2.0).
  • REPLICAS : nombre cible de répliques de serveur par zone (par exemple, 15).
  • NAMESPACE : espace de noms Kubernetes (par exemple, spanner-ns).

Mettre à l'échelle une zone spécifique

Si votre déploiement initial a configuré différents nombres de serveurs pour chaque zone, vous pouvez cibler une seule zone. Par exemple, pour augmenter le nombre de répliques de la première zone à l'intérieur du premier emplacement à 15, exécutez la commande suivante :

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

Remplacez REPLICAS par le nombre de répliques de votre zone cible, par exemple 15.

Pour vérifier que les nouveaux serveurs ont bien rejoint le déploiement, interrogez l'interface de ligne de commande Spanner Omni pour lister les serveurs de déploiement ou consultez votre tableau de bord Grafana.

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

Remplacez les éléments suivants :

  • ZONE : zone que vous souhaitez lister (par exemple, us-central1-a).
  • ENDPOINT : point de terminaison externe de votre déploiement (par exemple, ${ENDPOINT}:15000).

Supprimer les serveurs non racine

La réduction de la taille des serveurs nécessite des étapes supplémentaires, car le système doit relocaliser les partitions de données en toute sécurité loin des serveurs mis hors service. Étant donné que les StatefulSets Kubernetes suppriment les pods de l'index le plus élevé à l'index le plus bas, vous devez d'abord cibler les serveurs non racine avec l'index le plus élevé pour la suppression.

Pour réduire le nombre de serveurs, procédez comme suit :

  1. Listez les serveurs de votre zone pour identifier ceux qui peuvent être supprimés :

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

    Exemple de résultat :

    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      -     -
    

    Supprimez le serveur non racine mis hors service avec l'index le plus élevé (par exemple, spanner-a-1.pod.spanner-ns:15000) :

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

    Remplacez SERVER_NAME par l'identifiant du serveur, par exemple spanner-a-1.pod.spanner-ns:15000.

    Consultez la liste des serveurs jusqu'à ce que le serveur cible en soit supprimé. Une fois supprimé, le serveur passe à un état non sain dans le système et est supprimé du chemin de service actif.

  2. Réduisez le déploiement Helm en exécutant une commande de mise à niveau Helm pour correspondre au nombre de répliques cible. Par exemple, pour réduire le nombre de réplicas par zone à 1 pod, exécutez la commande suivante :

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

    Remplacez REPLICAS par le nombre de réplicas mis à jour (par exemple, 1).

  3. Supprimez les demandes de volumes persistants (PVC) Kubernetes associées aux pods supprimés. Pour éviter toute perte de données accidentelle, Helm et Kubernetes ne suppriment pas automatiquement les PVC lors de la réduction d'un StatefulSet. Supprimez manuellement les PVC pour récupérer complètement l'espace de stockage :

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    Par exemple, pour supprimer les journaux et les volumes de données pour spanner-a-1 dans l'espace de noms spanner-ns :

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

Ajouter une zone

L'ajout d'une zone à votre déploiement augmente la disponibilité et protège votre base de données contre les pannes de zone unique.

Par exemple, la commande suivante initialise un déploiement à zone unique en cours d'exécution sur Google Kubernetes Engine (GKE) dans la zone us-east1-b de la région us :

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

Ajoutez la zone us-east1-c à cette configuration en procédant comme suit :

  1. Lancez les pods dans la nouvelle zone en exécutant la commande helm upgrade et en transmettant un bloc JSON mis à jour qui inclut la nouvelle zone géographique :

    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. Ajoutez la nouvelle zone à l'aide de la CLI Spanner Omni. Attendez que les pods du serveur racine de la zone nouvellement créée passent à l'état Running et prêt. Exécutez ensuite la commande de création de zone :

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

    Remplacez les éléments suivants :

    • NEW_ZONE : identifiant de la zone à ajouter, par exemple us-east1-c.
    • LOCATION : emplacement du déploiement (par exemple, us).
    • ROOT_SERVERS_LIST : liste de points de terminaison de serveurs racine séparés par une virgule dans la nouvelle zone (par exemple, 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 : point de terminaison du déploiement externe, par exemple ${ENDPOINT}:15000.
  3. Patientez pendant la création de la zone. La réplication des schémas et des tables de base de données existants vers une nouvelle zone prend du temps. Surveillez la progression de la synchronisation des zones en listant les zones de déploiement :

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    

Supprimer une zone

Vous pouvez mettre hors service une zone active de votre déploiement multizone pour réduire les ressources ou vous adapter aux modifications de la topologie.

Supprimez la zone us-east1-c créée dans la section précédente en procédant comme suit :

  1. Supprimez la zone et lancez la suppression de la zone dans Spanner Omni :

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

    Remplacez ZONE par la zone à supprimer, par exemple us-east1-c.

  2. Vérifiez que la zone a été supprimée. Exécutez une commande list et attendez que la zone ne s'affiche plus dans le résultat :

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. Supprimez les serveurs du cluster Kubernetes en exécutant une commande de mise à niveau Helm et en transmettant un bloc JSON de localisation mis à jour qui exclut la zone supprimée :

    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
    

Faire évoluer l'espace de stockage

Étant donné que les volumeClaimTemplates Kubernetes sont immuables, vous ne pouvez pas augmenter la capacité de stockage des pods à l'aide de la commande helm upgrade directement. Vous devez effectuer une expansion manuelle du volume. Pour en savoir plus, consultez le guide sur l'expansion de volume StatefulSet GKE.

Pour augmenter l'espace de stockage sur votre disque, procédez comme suit :

  1. Définissez les paramètres de l'expansion du volume en tant que variables d'environnement dans votre 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"
    

    Remplacez les éléments suivants :

    • NEW_SIZE : taille de la capacité de stockage cible, par exemple 200Gi.
    • NAMESPACE : espace de noms Kubernetes (par exemple, spanner-ns).
    • STATEFULSET_NAME_1, STATEFULSET_NAME_2, … : noms des StatefulSets de votre déploiement, correspondant généralement aux noms courts de vos zones (par exemple, spanner-east-b spanner-east-c).
    • HELM_CHART_PATH : chemin d'accès à votre chart Helm (par exemple, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni).
    • VERSION : version du chart Helm (par exemple, 0.2.0).
  2. Exécutez les commandes pour corriger les PVC, supprimer les StatefulSets (en laissant les pods de backend intacts) et mettre à niveau le déploiement Helm :

    # 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
    

Étapes suivantes