Los entornos de Kubernetes te permiten escalar los recursos de tu base de datos de forma dinámica a medida que cambian las demandas de la carga de trabajo. Usa estos procedimientos de ajuste de escala 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 ajuste de escala vertical hasta alcanzar al menos 32 GB de memoria por servidor antes de agregar más servidores para realizar un ajuste de escala horizontal.
Limitaciones
El ajuste de escala en Kubernetes tiene las siguientes limitaciones:
Solo servidores no raíz: El ajuste de escala horizontal es compatible con las instancias no raíz. No se admite el ajuste de escala del servidor raíz.
Restricciones de almacenamiento de StatefulSet: Debido a que los
volumeClaimTemplatesde Kubernetes son inmutables, no puedes expandir los discos de los Pods con un solo comandohelm upgrade. En cambio, el escalamiento del almacenamiento requiere pasos manuales para expandir el volumen.
Escalar verticalmente
Para ajustar los recursos de CPU o memoria de tus servidores, actualiza tu 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: Es la ruta de acceso a tu gráfico de Helm, por ejemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: Es la versión del gráfico de Helm, por ejemplo,1.0.0.CPU_CORES: Es la cantidad de núcleos de CPU virtuales que se asignarán a cada pod del servidor, por ejemplo,8.MEMORY_LIMIT: Es el límite de RAM para cada pod del servidor, por ejemplo,32Gi.NAMESPACE: Es el espacio de nombres de Kubernetes de la implementación, por ejemplo,spanner-ns.
Escalar horizontalmente
Para escalar horizontalmente, agrega más servidores a tu implementación. El escalamiento horizontal es compatible con los servidores que no son raíz.
Agrega servidores no raíz
Para agregar servidores que no sean 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.
Escalar de forma 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: Es la ruta de acceso a tu 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,1.0.0.REPLICAS: Es la cantidad objetivo de réplicas del servidor por zona, por ejemplo,15.NAMESPACE: Es el espacio de nombres de Kubernetes, por ejemplo,spanner-ns.
Cómo ajustar la escala de una zona específica
Si tu implementación inicial configuró diferentes cantidades de servidores para zonas individuales, puedes segmentar tu campaña para 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 la cantidad 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: Es la zona que deseas enumerar, por ejemplo,us-central1-a.ENDPOINT: Es el extremo externo de tu implementación, por ejemplo,${ENDPOINT}:15000.
Cómo quitar servidores que no son raíz
Reducir la cantidad de servidores requiere pasos adicionales, ya que el sistema debe reubicar de forma segura las particiones de datos lejos de los servidores retirados. Dado 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 con el í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 a eliminación:
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 retirado 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.Revisa la lista de servidores hasta que se quite el servidor de destino. Después de la eliminación, el servidor pasa a un estado no saludable en el sistema y se quita de la ruta de servicio activa.
Para reducir la escala de la implementación de Helm, ejecuta un comando de actualización de Helm para que coincida con la cantidad de réplicas objetivo. 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 reclamaciones 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 los PVC cuando se reduce la escala de un StatefulSet. Borra manualmente los 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, haz lo siguiente: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 en ejecución de una sola zona en Google Kubernetes Engine (GKE) en la zona us-east1-b de la región 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
Agrega la zona us-east1-c a esta configuración siguiendo estos pasos:
Ejecuta el comando
helm upgradey pasa un bloque JSON actualizado que incluya la nueva zona de ubicación para iniciar los pods en la zona nueva: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 entren en el estado
Runningy estén listos. Luego, ejecuta el comando de creación de la zona:spanner deployment zones create NEW_ZONE \ --location=LOCATION \ --root-servers=ROOT_SERVERS_LIST \ --deployment-endpoint=ENDPOINTReemplaza lo siguiente:
NEW_ZONE: Es el identificador de la zona que se agregará, por ejemplo,us-east1-c.LOCATION: Es la ubicación de la implementación, por ejemplo,us.ROOT_SERVERS_LIST: Es 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: Es 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 esquemas y tablas de bases de datos existentes en una zona nueva lleva tiempo. Supervisa el progreso de la sincronización de la zona enumerando las zonas de implementación:
spanner deployment zones list --deployment-endpoint=ENDPOINT
Cómo quitar una zona
Puedes dar de baja una zona activa de tu implementación multizona para reducir los recursos o alinearte con los cambios de topología.
Para quitar la zona us-east1-c que creaste en la sección anterior, sigue estos pasos:
Borra la zona y, luego, inicia la eliminación de la zona en Spanner Omni:
spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINTReemplaza
ZONEpor la zona que deseas 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 helm upgrade 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 de almacenamiento
Dado que los objetos volumeClaimTemplates de Kubernetes son inmutables, no puedes escalar verticalmente las capacidades de almacenamiento de los Pods directamente con el comando helm upgrade. En su lugar, debes realizar una expansión manual del volumen. Para obtener más información, consulta la
guía de expansión de volumen 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: Es el tamaño de capacidad de almacenamiento objetivo, por ejemplo,200Gi.NAMESPACE: Es el espacio de nombres de Kubernetes, por ejemplo,spanner-ns.STATEFULSET_NAME_1,STATEFULSET_NAME_2, …: Son los nombres de los objetos 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 a tu gráfico de Helm, por ejemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: Es la versión del gráfico de Helm, por ejemplo,1.0.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 más información para mantener una implementación.