Déployer un outil d'autoscaling distribué pour Spanner


Ce tutoriel explique comment configurer l'infrastructure de l'outil Autoscaler pour Spanner à l'aide d'une topologie de déploiement distribué. Dans l'option de déploiement présentée dans ce tutoriel, tous les composants de l'Autoscaler se trouvent dans un seul projet, à l'exception de Cloud Scheduler, du sujet de transfert et de sa fonction correspondante.

Ce tutoriel est destiné aux équipes chargées de l'informatique, des opérations et de la fiabilité des sites, qui souhaitent réduire les coûts opérationnels et optimiser les coûts de leurs déploiements Spanner. Ce document fait partie d'une série :

La topologie de déploiement distribué regroupe les fonctionnalités utiles suivantes pour les déploiements par projet et les déploiements centralisés :

  • Les équipes qui possèdent les instances Spanner, appelées équipes d'application, gèrent les paramètres de configuration de l'Autoscaler pour leurs instances avec les tâches Cloud Scheduler dont elles sont propriétaires.
  • En dehors des paramètres de configuration, une équipe centrale gère le reste de l'infrastructure de l'Autoscaler, réduisant ainsi les coûts de gestion.

Architecture

Le schéma suivant illustre l'architecture de l'Autoscaler dans une topologie de déploiement distribué :

Topologie de déploiement distribué.

Pour obtenir une explication des composants de l'autoscaler et de chacune des étapes numérotées dans le flux d'événements, consultez la page Autoscaling Spanner.

Fonction de transfert

Cloud Scheduler ne peut publier des messages que sur les sujets d'un même projet. Dans le cadre de la topologie distribuée, ce tutoriel introduit un composant intermédiaire appelé fonction de transfert.

La fonction de transfert transmet les messages publiés à Pub/Sub à partir de Cloud Scheduler, vérifie leur syntaxe JSON et les transmet au sujet Pub/Sub du service d'interrogation. Le sujet peut appartenir à un projet distinct dans Cloud Scheduler.

Le schéma suivant montre les composants utilisés pour le mécanisme de transfert :

Mécanisme de transfert.

Comme indiqué dans le schéma précédent, les instances Spanner se trouvent dans des projets nommés Application 1 et Application 2:

  1. Cloud Scheduler est le même projet que les instances Spanner.
  2. (2a) Cloud Scheduler publie ses messages dans le sujet de transfert dans les projets Application 1 et Application 2.

    (2b) La fonction de transfert lit les messages à partir du sujet de transfert.

    (2c) La fonction de transfert transmet les messages au sujet d'interrogation résidant dans le projet de l'Autoscaler.

  3. La fonction d'interrogation lit les messages du sujet d'interrogation et le processus se poursuit, comme décrit dans la section Autoscaling Spanner.

Objectifs

  • Déployer l'Autoscaler à l'aide d'un modèle de déploiement distribué
  • Importer des instances Spanner existantes dans l'état Terraform
  • Configurer l'Autoscaler.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Lorsque vous suivez les instructions de ce tutoriel, les coûts associés au fonctionnement des composants d'Autoscaler doivent être de zéro ou proches de zéro. Toutefois, cette estimation n'inclut pas les coûts des instances Spanner. Pour obtenir un exemple de calcul des coûts des instances Spanner, consultez la page Autoscaling Spanner.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

Dans la topologie d'un déploiement distribué, en plus d'un projet Autoscaler, vous configurez un deuxième projet, appelé projet d'application dans ce tutoriel. Le projet d'application contient les ressources de l'application, y compris Spanner. Dans ce tutoriel, configurez et activez la facturation et les API séparément pour ces deux projets.

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

  2. Dans Cloud Shell, clonez le dépôt suivant :

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. Exportez les variables pour les répertoires de travail :

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

Préparer le projet Autoscaler

Dans cette section, vous allez préparer le déploiement du projet qui contient l'ensemble de l'infrastructure centralisée de l'Autoscaler, à l'exception de Cloud Scheduler.

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Activer les API Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Functions, and Cloud Build.

    Activer les API

  4. Dans Cloud Shell, définissez les variables d'environnement avec l'ID de votre projet Autoscaler :

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. Définissez la région et la zone et l'emplacement App Engine (pour Firestore) pour l'infrastructure de l'Autoscaler :

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. Créer un compte de service :

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

    Terraform utilise ce compte pour créer toutes les ressources de votre infrastructure.

  7. Attribuez le rôle de propriétaire du projet au compte de service :

     gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Créez un fichier de clé de compte de service :

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. Si votre projet ne possède pas encore d'instance Firestore, créez-en une :

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

Déployer l'Autoscaler

Dans cette section, vous déployez les composants de l'Autoscaler à l'aide des fichiers Terraform situés dans les répertoires suivants :

Répertoire Contenu du répertoire
terraform/ Configuration de premier niveau, qui inclut chacune des options de déploiement et les modules réutilisables.
terraform/cloud-functions/distributed/autoscaler-project/ Configuration du projet où l'Autoscaler est situé. Délègue au module Autoscaler.
terraform/modules/autoscaler-functions Configuration de la fonction d'interrogation et de la fonction de scaling Cloud Functions et des sujets Pub/Sub.
  1. Dans Cloud Shell, définissez l'ID, la région, la zone et l'emplacement App Engine du projet dans les variables d'environnement Terraform correspondantes :

    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. Remplacez le répertoire par le répertoire Terraform du projet de scaling et initialisez-le :

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. Créez l'infrastructure de l'autoscaler :

    terraform apply -parallelism=2
    

    Après avoir vérifié les ressources, saisissez yes lorsque vous y êtes invité.

    Lorsque vous exécutez cette commande dans Cloud Shell, vous pouvez rencontrer le message d'erreur suivant : "Error: cannot assign requested address"

    Il s'agit d'un problème connu dans Terraform Google Provider. Dans ce cas, réessayez avec la commande suivante :

    terraform apply -parallelism=1
    

Préparer le projet d'application

Dans cette section, vous préparez le déploiement du sujet et de la fonction Cloud Scheduler et Forwarder dans le projet qui contient les instances Spanner.

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Activer les API Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Functions, and Cloud Build.

    Activer les API

  4. Dans Cloud Shell, définissez les variables d'environnement avec l'ID du projet d'application :

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. Définissez la région et la zone et l'emplacement App Engine pour le projet d'application :

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. Créez un compte de service que Terraform peut utiliser pour créer les ressources de votre infrastructure :

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. Attribuez le rôle de propriétaire du projet(roles/owner) au compte de service :

     gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Créez un fichier de clé de compte de service :

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. Créez une application pour activer Cloud Scheduler :

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

    Vous n'avez pas besoin de créer une base de données Firestore, car l'état est stocké dans le projet d'autoscaler.

Déployer l'infrastructure du projet d'application

Les composants Terraform du projet d'application se trouvent dans les répertoires suivants :

Dans cette section, vous utilisez les fichiers Terraform pour déployer les composants du projet d'application.

  1. Dans Cloud Shell, définissez l'ID, la région, la zone et l'emplacement App Engine du projet dans les variables d'environnement Terraform correspondantes :

      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. Définissez l'ID de projet correspondant à l'emplacement de stockage de l'état de l'autoscaler :

    export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
    

    L'état de l'autoscaler inclut les horodatages au moment du déclenchement des événements de scaling pour chaque instance.

  3. Si vous souhaitez créer une instance Spanner pour tester l'autoscaler, définissez la variable suivante :

    export TF_VAR_terraform_spanner=true
    

    L'instance Spanner créée par Terraform est nommée autoscale-test.

    Si vous ne souhaitez pas créer une instance Spanner, car vous disposez déjà d'une instance que l'autoscaler doit surveiller, définissez le nom de votre instance dans la variable suivante :

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    Pour en savoir plus sur la configuration de Terraform pour gérer votre instance Spanner, consultez la page Importer vos instances Spanner.

  4. Remplacez le répertoire par le répertoire app-project Terraform et initialisez-le :

    cd "${APP_DIR}"
    terraform init
    
  5. Créez l'infrastructure dans le projet d'application :

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

    Vérifiez que la liste des ressources que Terraform doit créer est correcte, puis saisissez yes lorsque vous y êtes invité.

    Lorsque vous exécutez cette commande dans Cloud Shell, vous pouvez rencontrer le message d'erreur suivant : "Error: cannot assign requested address"

    Il s'agit d'un problème connu dans Terraform Google Provider. Dans ce cas, réessayez avec la commande suivante :

    terraform apply -parallelism=1
    

Autoriser les fonctions Cloud Functions du redirecteur à publier sur le sujet de l'interrogation

  1. Dans Cloud Shell, revenez dans le répertoire de projet Terraform de l'autoscaler et assurez-vous que les variables Terraform sont correctement définies :

    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. Définissez les variables Terraform pour vos comptes de service de transfert. Mettez à jour et ajoutez vos comptes de service en fonction de vos besoins :

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

    Vérifiez que la liste des ressources que Terraform doit créer est correcte, puis saisissez yes lorsque vous y êtes invité.

    Lorsque vous exécutez cette commande dans Cloud Shell, vous pouvez rencontrer le message d'erreur suivant : "Error: cannot assign requested address"

    Il s'agit d'un problème connu dans Terraform Google Provider. Dans ce cas, réessayez avec la commande suivante :

    terraform apply -parallelism=1.
    

Vérifier votre déploiement

Lorsque l'infrastructure de l'autoscaler est prête, vous pouvez configurer ses paramètres. Pour en savoir plus, consultez la section Configurer l'autoscaler.

Étant donné que vous créez un déploiement distribué dans ce tutoriel, les journaux possèdent les propriétés suivantes :

  • Les journaux des fonctions d'interrogation et de scaling apparaissent dans l'explorateur de journaux du projet d'autoscaler.
  • Les journaux relatifs aux erreurs de syntaxe dans la configuration JSON de la charge utile Cloud Scheduler s'affichent dans l'explorateur de journaux de chaque projet d'application. Cela permet à l'équipe responsable d'une instance Spanner spécifique de résoudre ses problèmes de configuration de manière indépendante.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étapes suivantes