Implementa una herramienta distribuida de Escalador automático para Spanner


En este instructivo, se muestra cómo configurar la infraestructura de la herramienta del escalador automático para Spanner mediante una topología de implementación distribuida. En la opción de implementación que se presenta en este instructivo, todos los componentes del escalador automático están en un solo proyecto, excepto Cloud Scheduler, el tema de reenvío y su función correspondiente.

Este instructivo está dirigido a los equipos de TI, ingeniería de confiabilidad de sitios y operaciones que desean reducir las sobrecargas operativas y optimizar el costo de sus implementaciones de Spanner. Este documento forma parte de una serie:

La topología de implementación distribuida reúne las siguientes características beneficios por proyecto y de las implementaciones centralizadas:

  • Los equipos que poseen las instancias de Spanner, llamados equipos de aplicaciones, administran los parámetros de configuración del escalador automático para sus instancias con trabajos de Cloud Scheduler de los que son propietarios.
  • Fuera de los parámetros de configuración, un equipo central administra el resto de la infraestructura del escalador automático, lo que minimiza la sobrecarga de administración.

Arquitectura

En el siguiente diagrama, se muestra la arquitectura del escalador automático en una topología de implementación distribuida:

Topología de implementación distribuida.

Para obtener una explicación de los componentes del escalador automático y cada uno de los pasos numerados en el flujo de eventos, consulta Ajuste de escala automático de Spanner.

Función de reenvío

Cloud Scheduler solo puede publicar mensajes en temas del mismo proyecto, por lo que, para la topología distribuida, en este instructivo se introduce un componente intermedio llamado función de reenvío.

La función de reenvío reenvía los mensajes publicados en Pub/Sub desde Cloud Scheduler, verifica su sintaxis JSON y los reenvía al tema de sondeo de Pub/Sub. El tema puede pertenecer a un proyecto diferente al de Cloud Scheduler.

En el siguiente diagrama, se muestran los componentes que se usaron para el mecanismo de reenvío:

Mecanismo de reenvío.

Como se muestra en el diagrama anterior, las instancias de Spanner se encuentran en proyectos llamados Aplicación 1 y Aplicación 2:

  1. Cloud Scheduler es el mismo proyecto que Spanner individuales.
  2. (2a) Cloud Scheduler publica sus mensajes en el tema de reenvío en los proyectos de la Aplicación 1 y la Aplicación 2.

    (2b) La función de reenvío lee los mensajes del tema reenvío.

    (2c) La función de reenvío reenvía los mensajes al tema de sondeo que reside en el proyecto del escalador automático.

  3. La función de sondeo lee los mensajes del tema de sondeo y las continúa, como se describe en Ajuste de escala automático de Spanner.

Objetivos

  • Implementar el escalador automático con un modelo de implementación distribuida.
  • Importar instancias existentes de Spanner al estado de Terraform
  • Configurar el escalador automático.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando sigues las instrucciones de este instructivo, los costos relacionados con el funcionamiento de los componentes del escalador automático deben ser cero o casi cero. Sin embargo, esta estimación no incluye los costos del servicio individuales. Para ver un ejemplo de cómo calcular los costos de las instancias de Spanner, consulta Ajuste de escala automático de Spanner.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

En una topología de implementación distribuida, además de un proyecto de escalador automático, configurarás un segundo proyecto, que en este instructivo se denomina proyecto de aplicación. El proyecto de Aplicación contiene los recursos de la aplicación, incluido Spanner. En este instructivo, configurarás y habilitarás la facturación y las API para estos dos proyectos por separado.

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. En Cloud Shell, clona el siguiente repositorio:

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. Exporta las variables para los directorios de trabajo:

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project"
    export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
    

Prepara el proyecto del escalador automático

En esta sección, prepararás la implementación del proyecto que contiene toda la infraestructura centralizada del escalador automático, excepto Cloud Scheduler.

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  3. Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.

    Enable the APIs

  4. En Cloud Shell, configura las variables de entorno con el ID de tu proyecto de Escalador automático:

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. Configura la región y zona. y ubicación de App Engine (para Firestore) para la infraestructura del escalador automático:

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. Cree una cuenta de servicio:

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    

    Terraform usa esta cuenta para crear todos los recursos en su infraestructura.

  7. Otorga la función de propietario del proyecto a la cuenta de servicio:

     gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Crea un archivo de claves de la cuenta de servicio:

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. Si tu proyecto aún no tiene una instancia de Firestore, crea una:

     gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
     gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    

Implementa el escalador automático

En esta sección, implementarás los componentes que conforman el escalador automático mediante los archivos de Terraform en los siguientes directorios:

Directorio Contenido del directorio
terraform/ Configuración de nivel superior, que incluye cada una de las opciones de implementación y los módulos reutilizables.
terraform/cloud-functions/distributed/autoscaler-project/ Configuración para el proyecto en el que se encuentra el escalador automático. Delega el módulo del escalador automático.
terraform/modules/autoscaler-functions Configuración de las funciones de sondeo y escalador de Cloud Run, además de los temas de Pub/Sub.
  1. En Cloud Shell, configura el ID del proyecto, la región, la zona y la ubicación de App Engine en las variables de entorno correspondientes de Terraform:

    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. Cambia el directorio al directorio de Terraform-scaler-project y, luego, inicialízalo:

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. Crea la infraestructura del escalador automático:

    terraform apply -parallelism=2
    

    Después de verificar los recursos, escribe yes cuando se le solicite.

    Cuando ejecutes este comando en Cloud Shell, es posible que veas el siguiente mensaje de error: "Error: cannot assign requested address"

    Este error es un problema conocido en el proveedor de Terraform de Google. En este caso, reintenta con el siguiente comando:

    terraform apply -parallelism=1
    

Prepara el proyecto de la Aplicación

En esta sección, en el proyecto que contiene las instancias de Spanner, debes preparar la implementación del tema y la función de Cloud Scheduler y reenvío.

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  3. Enable the Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.

    Enable the APIs

  4. En Cloud Shell, configura las variables de entorno con el ID del proyecto de aplicación:

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. Configura la región y zona y la ubicación de App Engine para el proyecto de aplicación:

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. Crea una cuenta de servicio para que Terraform use a fin de crear los recursos en tu infraestructura:

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. Otorga la función de propietario del proyecto(roles/owner) a la cuenta de servicio:

     gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Crea un archivo de claves de la cuenta de servicio:

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. Crea una aplicación para habilitar Cloud Scheduler:

    gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
    

    No necesitas crear una base de datos de Firestore porque el estado se almacena en el proyecto del escalador automático.

Implementa la infraestructura del proyecto de aplicación

Los componentes de Terraform que conforman el proyecto de aplicación se encuentran en los siguientes directorios:

En esta sección, usarás los archivos de Terraform para implementar los componentes que conforman el proyecto de aplicación.

  1. En Cloud Shell, configura el ID del proyecto, la región, la zona y la ubicación de App Engine en las variables de entorno correspondientes de Terraform:

      export TF_VAR_project_id="${APP_PROJECT_ID}"
      export TF_VAR_region="${APP_REGION}"
      export TF_VAR_zone="${APP_ZONE}"
      export TF_VAR_location="${APP_APP_ENGINE_LOCATION}"
    
  2. Configura el ID del proyecto en el que se almacena el estado del escalador automático:

    export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
    

    En el estado del escalador automático, se incluyen las marcas de tiempo de cuando se activaron los eventos de escalamiento para cada instancia.

  3. Si deseas crear una nueva instancia de Spanner para probar el escalador automático, configura la siguiente variable:

    export TF_VAR_terraform_spanner=true
    

    La instancia de Spanner que crea Terraform se llama autoscale-test.

    Si no deseas crear una instancia de Spanner nueva porque ya tienes una instancia para que el escalador automático la supervise, configura el nombre de tu instancia en la siguiente variable:

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    Si quieres obtener más información para configurar Terraform para administrar tu instancia de Spanner, consulta Importa tus instancias de Spanner.

  4. Cambia el directorio al directorio del proyecto de la app Terraform y, luego, inicialízalo:

    cd "${APP_DIR}"
    terraform init
    
  5. Crea la infraestructura en el proyecto de la aplicación:

    terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}"
    terraform apply -parallelism=2
    

    Verifica que la lista de recursos para que cree Terraform sea correcta y, luego, escribe yes cuando se te solicite.

    Cuando ejecutes este comando en Cloud Shell, es posible que veas el siguiente mensaje de error: "Error: cannot assign requested address"

    Este error es un problema conocido en el proveedor de Terraform de Google. En este caso, reintenta con el siguiente comando:

    terraform apply -parallelism=1
    

Autoriza a las funciones de reenvío de Cloud Run para publicar en el tema de sondeo

  1. En Cloud Shell, vuelve al directorio del proyecto terraform del escalador automático y asegúrate de que las variables de Terraform estén configuradas de forma correcta:

    cd "${AUTOSCALER_DIR}"
    
    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. Configura las variables de Terraform para tus cuentas de servicio de reenvío. Actualiza y agrega tus cuentas de servicio según sea necesario:

     export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]'
      terraform apply -parallelism=2
    

    Verifica que la lista de recursos para que cree Terraform sea correcta y, luego, escribe yes cuando se te solicite.

    Cuando ejecutes este comando en Cloud Shell, es posible que veas el siguiente mensaje de error: "Error: cannot assign requested address"

    Este error es un problema conocido en el proveedor de Terraform de Google. En este caso, reintenta con el siguiente comando:

    terraform apply -parallelism=1.
    

Verifica tu implementación

Cuando la infraestructura para el escalador automático esté lista, puedes configurar sus parámetros. Si deseas obtener más información, consulta Configura el escalador automático.

Debido a que creas una implementación distribuida en este instructivo, los registros tienen las siguientes propiedades:

  • Los registros de las funciones de sondeo y escalamiento aparecen en el Explorador de registros para el proyecto de escalador automático.
  • Los registros sobre errores de sintaxis en la configuración JSON de la carga útil de Cloud Scheduler aparecen en el Explorador de registros para cada proyecto de aplicación. Esto permite al equipo responsable de una instancia específica de Spanner solucionar sus problemas de configuración de forma independiente.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?