Los entornos de Kubernetes te permiten escalar los recursos de la base de datos de forma dinámica a medida que cambian las demandas de la carga de trabajo. Usa estos procedimientos de escalamiento si implementaste Spanner Omni con el gráfico de Helm.
Antes de comenzar
Antes de escalar tu implementación de Kubernetes, debes hacer lo siguiente:
Descarga y, luego, instala la CLI de Spanner Omni.
Instala Helm y crea una configuración de gráfico de Helm.
Como práctica recomendada, te sugerimos que realices un escalamiento vertical hasta al menos 32 GB de memoria por servidor antes de agregar más servidores para realizar un escalamiento horizontal.
Limitaciones
El escalamiento en Kubernetes tiene las siguientes limitaciones:
Solo servidores no raíz: El escalamiento horizontal es compatible con instancias no raíz. No se admite el escalamiento del servidor raíz.
Restricciones de almacenamiento de StatefulSet: Debido a que los
volumeClaimTemplatesde Kubernetes son inmutables, no puedes expandir los discos de pods con un solohelm upgradecomando. En cambio, el escalamiento del almacenamiento requiere pasos manuales de expansión del volumen.
Escalamiento vertical
Para ajustar los recursos de CPU o memoria de tus servidores, actualiza la configuración con una actualización de Helm:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set resources.cpu=CPU_CORES \
--set resources.memory=MEMORY_LIMIT \
-n NAMESPACE
Reemplaza lo siguiente:
HELM_CHART_PATH: La ruta de acceso al gráfico de Helm, por ejemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: La versión del gráfico de Helm, por ejemplo,0.2.0.CPU_CORES: La cantidad de núcleos de CPU virtuales que se asignarán a cada pod del servidor, por ejemplo,8.MEMORY_LIMIT: El límite de RAM para cada pod del servidor, por ejemplo,32Gi.NAMESPACE: El espacio de nombres de Kubernetes de la implementación, por ejemplo,spanner-ns.
Escalamiento horizontal
Para realizar un escalamiento horizontal, agrega más servidores a tu implementación. El escalamiento horizontal es compatible con servidores no raíz.
Agrega servidores no raíz
Para agregar servidores no raíz, aumenta el recuento de réplicas en la configuración del gráfico de Helm. Puedes escalar todas las zonas de manera uniforme o escalar una zona específica.
Escala de manera uniforme
Para escalar cada zona de la implementación a 15 servidores, ejecuta el siguiente comando:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set deployment.replicasPerZone=REPLICAS \
-n NAMESPACE
Reemplaza lo siguiente:
HELM_CHART_PATH: La ruta de acceso al gráfico de Helm, por ejemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: La versión del gráfico de Helm, por ejemplo,0.2.0.REPLICAS: La cantidad objetivo de réplicas del servidor por zona, por ejemplo,15.NAMESPACE: El espacio de nombres de Kubernetes, por ejemplo,spanner-ns.
Escala una zona específica
Si tu implementación inicial configuró diferentes recuentos de servidores para zonas individuales, puedes segmentar una sola zona. Por ejemplo, para aumentar las réplicas de la primera zona dentro de la primera ubicación a 15, ejecuta el siguiente comando:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set locations[0].zones[0].replicas=REPLICAS \
-n NAMESPACE
Reemplaza REPLICAS por el recuento de réplicas de la zona de destino, por ejemplo, 15.
Para verificar que los servidores nuevos se unieron correctamente a la implementación, consulta la CLI de Spanner Omni para enumerar los servidores de implementación o ver tu panel de Grafana.
spanner deployment servers list \
--zone=ZONE \
--deployment-endpoint=ENDPOINT
Reemplaza lo siguiente:
ZONE: La zona que deseas enumerar, por ejemplo,us-central1-a.ENDPOINT: El extremo externo de tu implementación, por ejemplo,${ENDPOINT}:15000.
Quita servidores no raíz
La reducción de los servidores requiere pasos adicionales porque el sistema debe reubicar de forma segura las particiones de datos lejos de los servidores dados de baja. Debido a que los StatefulSets de Kubernetes quitan los pods del índice más alto al más bajo, primero debes segmentar los servidores no raíz de índice más alto para quitarlos.
Para reducir la cantidad de servidores, sigue estos pasos:
Enumera los servidores de tu zona para identificar los candidatos para quitar:
spanner deployment servers list \ --zone=ZONE \ --deployment-endpoint=ENDPOINTResultado de ejemplo:
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 - -Borra el servidor no raíz dado de baja con el índice más alto (por ejemplo,
spanner-a-1.pod.spanner-ns:15000):spanner deployment servers delete SERVER_NAME \ --zone=ZONE \ --deployment-endpoint=ENDPOINTReemplaza
SERVER_NAMEpor el identificador del servidor, por ejemplo,spanner-a-1.pod.spanner-ns:15000.Consulta la lista de servidores hasta que se quite el servidor de destino de la lista. Después de la eliminación, el servidor pasa a un estado incorrecto en el sistema y se quita de la ruta de servicio activa.
Reduce la implementación de Helm ejecutando un comando de actualización de Helm para que coincida con el recuento de réplicas de destino. Por ejemplo, para disminuir las réplicas por zona a
1pod, ejecuta el siguiente comando:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set deployment.replicasPerZone=REPLICAS \ -n NAMESPACEReemplaza
REPLICASpor el recuento de réplicas actualizado, por ejemplo,1.Borra las declaraciones de volúmenes persistentes (PVC) de Kubernetes asociadas con los pods quitados. Para evitar la pérdida accidental de datos, Helm y Kubernetes no borran automáticamente las PVC cuando se reduce un StatefulSet. Borra manualmente las PVC para recuperar por completo el almacenamiento:
kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACEPor ejemplo, para borrar los registros y los volúmenes de datos de
spanner-a-1en el espacio de nombresspanner-ns:kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
Agrega una zona
Agregar una zona nueva a tu implementación aumenta la disponibilidad y protege tu base de datos contra las interrupciones de una sola zona.
Por ejemplo, el siguiente comando inicializa una implementación de una sola zona en ejecución en Google Kubernetes Engine (GKE) en la us-east1-b zona de
la us región:
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
Para agregar la zona us-east1-c a esta configuración, sigue estos pasos:
Para iniciar los pods en la zona nueva, ejecuta el comando
helm upgradey pasa un bloque JSON actualizado que incluya la nueva zona de ubicación: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 NAMESPACEAgrega la zona nueva con la CLI de Spanner Omni. Espera a que los pods del servidor raíz de la zona recién creada ingresen al estado
Runningy estén listos. Luego, ejecuta el comando de creación de zona:spanner deployment zones create NEW_ZONE \ --location=LOCATION \ --root-servers=ROOT_SERVERS_LIST \ --deployment-endpoint=ENDPOINTReemplaza lo siguiente:
NEW_ZONE: El identificador de la zona que se agregará, por ejemplo,us-east1-c.LOCATION: La ubicación de la implementación, por ejemplo,us.ROOT_SERVERS_LIST: Una lista separada por comas de los extremos del servidor raíz en la zona nueva, por ejemplo,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: El extremo de implementación externo, por ejemplo,${ENDPOINT}:15000.
Espera a que se complete la creación de la zona. La replicación de los esquemas y las tablas de la base de datos existentes en una zona nueva lleva tiempo. Para supervisar el progreso de la sincronización de la zona, enumera las zonas de implementación:
spanner deployment zones list --deployment-endpoint=ENDPOINT
Quita una zona
Puedes dar de baja una zona activa de tu implementación de varias zonas para reducir los recursos o alinearte con los cambios de topología.
Para quitar la zona us-east1-c creada en la sección anterior, sigue estos pasos:
Borra la zona y, luego, inicia la eliminación de la zona dentro de Spanner Omni:
spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINTReemplaza
ZONEpor la zona que se quitará, por ejemplo,us-east1-c.Verifica que se haya quitado la zona. Ejecuta un comando de lista y espera hasta que la zona ya no aparezca en el resultado:
spanner deployment zones list --deployment-endpoint=ENDPOINTPara quitar los servidores del clúster de Kubernetes, ejecuta un comando de actualización de Helm y pasa un bloque JSON de ubicaciones actualizado que excluya la zona quitada:
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
Escala el almacenamiento
Debido a que los volumeClaimTemplates de Kubernetes son inmutables, no puedes escalar verticalmente las capacidades de almacenamiento de Pods con el comando helm upgrade directamente. En cambio, debes realizar una expansión manual del volumen. Para obtener más información, consulta la
guía Expansión de volúmenes de StatefulSet de GKE.
Para expandir el almacenamiento en disco, sigue estos pasos:
Define los parámetros para la expansión del volumen como variables de entorno en tu 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"Reemplaza lo siguiente:
NEW_SIZE: El tamaño de capacidad de almacenamiento de destino, por ejemplo,200Gi.NAMESPACE: El espacio de nombres de Kubernetes, por ejemplo,spanner-ns.STATEFULSET_NAME_1,STATEFULSET_NAME_2, ...: Los nombres de los StatefulSets en tu implementación, que suelen corresponder a los nombres abreviados de tus zonas (por ejemplo,spanner-east-b spanner-east-c).HELM_CHART_PATH: La ruta de acceso al gráfico de Helm, por ejemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: La versión del gráfico de Helm, por ejemplo,0.2.0.
Ejecuta los comandos para aplicar parches a las PVC, borrar los StatefulSets (dejando intactos los pods de backend) y actualizar la implementación de 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
Próximos pasos
- Obtén información para mantener una implementación.