Ce guide explique comment effectuer des déploiements bleu/vert sans temps d'arrêt sur des groupes d'instances gérés (MIG) Compute Engine à l'aide de Cloud Build et de Terraform.
Cloud Build vous permet d'automatiser divers processus de développement, y compris la compilation et le déploiement d'applications dans différents Google Cloud environnements d'exécution, tels que Compute Engine, Google Kubernetes Engine, GKE Enterprise et les fonctions Cloud Run.
Les MIG Compute Engine vous permettent d'exécuter des applications sur plusieurs machines virtuelles (VM) identiques. Vous pouvez rendre vos charges de travail évolutives et disponibilité élevée en tirant parti des services de MIG automatisés, comme l'autoscaling, l'autoréparation, le déploiement régional (multizone) et la mise à jour automatique. À l'aide du modèle de déploiement continu bleu/vert, vous apprendrez à transférer progressivement le trafic utilisateur d'un MIG (bleu) vers un autre MIG (vert), tous deux exécutés en production.
Avant de commencer
-
Enable the Cloud Build, Cloud Run, Artifact Registry, and Resource Manager APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.
Préparez le code source de votre application. Votre code source doit être stocké dans un dépôt tel que GitHub ou Bitbucket.
Pour exécuter les commandes
gcloud
sur cette page, installez Google Cloud CLI.
Autorisations requises pour la gestion de l'authentification et des accès
-
Dans la console Google Cloud , accédez à la page Autorisations settings Cloud Build :
Pour le compte de service Cloud Build spécifié ou le compte de service Cloud Build par défaut, définissez l'état des rôles suivants sur Activé :
- Administrateur d'instances Compute v1 (
roles/compute.instanceAdmin
) : permet à Cloud Build de déployer de nouvelles instances sur Compute Engine.- Dans le panneau "Attribuer le rôle Utilisateur du compte de service", choisissez un compte de service à emprunter, puis cliquez sur Accorder l'autorisation.
- Administrateur de l'espace de stockage (
roles/storage.admin
) : permet de lire et d'écrire des données dans Cloud Storage. - Rédacteur Artifact Registry (
roles/artifactregistry.writer
) : permet d'extraire des images d'Artifact Registry et d'y écrire des données. - Rédacteur de journaux (
roles/logging.logWriter
) : permet d'écrire des entrées de journal dans Cloud Logging. - Éditeur Cloud Build (
roles/cloudbuild.builds.editor
) : permet à votre compte de service d'exécuter des builds.
- Administrateur d'instances Compute v1 (
Présentation de la conception
Le diagramme suivant illustre le modèle de déploiement bleu-vert utilisé par l'exemple de code décrit dans ce document :
De manière générale, ce modèle inclut les composants suivants :
- Deux pools de VM Compute Engine : bleu et vert.
- Trois équilibreurs de charge HTTP(S) externes :
- Un équilibreur de charge bleu-vert, qui achemine le trafic des utilisateurs finaux vers le pool bleu ou vert d'instances de VM.
- Un équilibreur de charge bleu qui achemine le trafic des ingénieurs QA et des développeurs vers le pool d'instances de VM bleues.
- Un équilibreur de charge vert qui achemine le trafic des ingénieurs QA et des développeurs vers le pool d'instances vertes.
- Deux ensembles d'utilisateurs :
- Les utilisateurs finaux ayant accès à l'équilibreur de charge bleu-vert, qui les redirige vers le pool d'instances bleu ou vert.
- Ingénieurs et développeurs QA qui ont besoin d'accéder aux deux ensembles de pools à des fins de développement et de test. Ils peuvent accéder aux équilibreurs de charge bleu et vert, qui les redirigent respectivement vers le pool d'instances bleu et le pool d'instances vert.
Les pools de VM bleu et vert sont implémentés en tant que MIG Compute Engine, et les adresses IP externes sont acheminées vers les VM du MIG à l'aide d'équilibreurs de charge HTTP(S) externes. L'exemple de code décrit dans ce document utilise Terraform pour configurer cette infrastructure.
Le schéma suivant illustre les opérations de développement qui ont lieu lors du déploiement :
Dans le schéma précédent, les flèches rouges représentent le flux d'amorçage qui se produit lorsque vous configurez l'infrastructure de déploiement pour la première fois, et les flèches bleues représentent le flux GitOps qui se produit lors de chaque déploiement.
Pour configurer cette infrastructure, vous exécutez un script de configuration qui lance le processus d'amorçage et configure les composants du flux GitOps.
Le script de configuration exécute un pipeline Cloud Build qui effectue les opérations suivantes :
- Crée un dépôt dans Cloud Source Repositories nommé
copy-of-gcp-mig-simple
et copie le code source de l'exemple de dépôt GitHub dans le dépôt Cloud Source Repositories. - Crée deux déclencheurs Cloud Build nommés
apply
etdestroy
.
Le déclencheur apply
est associé à un fichier Terraform nommé main.tfvars
dans Cloud Source Repositories. Ce fichier contient les variables Terraform représentant les équilibreurs de charge bleu et vert.
Pour configurer le déploiement, mettez à jour les variables dans le fichier main.tfvars
.
Le déclencheur apply
exécute un pipeline Cloud Build qui exécute tf_apply
et effectue les opérations suivantes :
- Crée deux MIG Compute Engine (un pour la version verte et un pour la version bleue), quatre instances de VM Compute Engine (deux pour le MIG vert et deux pour le MIG bleu), les trois équilibreurs de charge (bleu, vert et le répartiteur) et trois adresses IP publiques.
- Affiche les adresses IP que vous pouvez utiliser pour afficher les applications déployées dans les instances bleues et vertes.
Le déclencheur de suppression est déclenché manuellement pour supprimer toutes les ressources créées par le déclencheur d'application.
Essayez-le !
Exécutez le script d'installation à partir du dépôt d'exemples de code Google :
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
Lorsque le script de configuration demande le consentement de l'utilisateur, saisissez yes.
L'exécution du script se termine en quelques secondes.
Dans la console Google Cloud , ouvrez la page Historique de compilation de Cloud Build :
Cliquez sur la dernière version.
La page Détails de la compilation s'affiche. Elle présente un pipeline Cloud Build avec trois étapes de compilation : la première crée un dépôt dans Cloud Source Repositories, la deuxième clone le contenu du dépôt d'exemple dans GitHub vers Cloud Source Repositories et la troisième ajoute deux déclencheurs de compilation.
Ouvrez Cloud Source Repositories :
Dans la liste des dépôts, cliquez sur
copy-of-gcp-mig-simple
.Dans l'onglet Historique en bas de la page, vous verrez un commit avec la description
A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
créé par Cloud Build pour créer un dépôt nommécopy-of-gcp-mig-simple
.Accédez à la page Déclencheurs de Cloud Build :
Pour lancer le processus de déploiement, mettez à jour le fichier
infra/main.tfvars
:Dans votre fenêtre de terminal, créez un dossier nommé
deploy-compute-engine
et accédez-y :mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
Clonez le dépôt
copy-of-gcp-mig-simple
:gcloud source repos clone copy-of-mig-blue-green
Accédez au répertoire cloné :
cd ./copy-of-mig-blue-green
Mettez à jour
infra/main.tfvars
pour remplacer "blue" par "green" :sed -i'' -e 's/blue/green/g' infra/main.tfvars
Ajoutez le fichier modifié :
git add .
Validez le fichier :
git commit -m "Promote green"
Transférez le fichier :
git push
Toute modification apportée à
infra/main.tfvars
déclenche l'exécution du déclencheurapply
, qui lance le déploiement.
Ouvrez Cloud Source Repositories :
Dans la liste des dépôts, cliquez sur
copy-of-gcp-mig-simple
.Le commit avec la description
Promote green
s'affiche dans l'onglet Historique en bas de la page.Pour afficher l'exécution du déclencheur
apply
, ouvrez la page Historique de compilation dans la console Google Cloud :Ouvrez la page Informations sur le build en cliquant sur le premier build.
Le pipeline de déclencheur
apply
s'affiche avec deux étapes de compilation. La première étape de compilation exécute Terraform apply pour créer les ressources Compute Engine et d'équilibrage de charge pour le déploiement. La deuxième étape de compilation affiche l'adresse IP à laquelle vous pouvez voir l'application en cours d'exécution.Ouvrez l'adresse IP correspondant au MIG vert dans un navigateur. Une capture d'écran semblable à celle ci-dessous s'affiche pour indiquer le déploiement :
Accédez à la page Groupe d'instances de Compute Engine pour afficher les groupes d'instances "Bleu" et "Vert" :
Ouvrez la page Instances de VM pour afficher les quatre instances de VM :
Ouvrez la page Adresses IP externes pour afficher les trois équilibreurs de charge :
Deux déclencheurs de compilation nommés apply
et destroy
s'affichent. Le déclencheur apply
est associé au fichier infra/main.tfvars
dans la branche main
. Ce déclencheur est exécuté chaque fois que le fichier est modifié. Le déclencheur destroy
est un déclencheur manuel.
Comprendre le code
Le code source de cet exemple de code comprend les éléments suivants :
- Code source lié au script de configuration.
- Code source lié aux pipelines Cloud Build.
- Code source lié aux modèles Terraform.
Script de configuration
setup.sh
est le script de configuration qui exécute le processus d'amorçage et crée les composants pour le déploiement bleu-vert. Le script effectue les opérations suivantes :
- Active les API Cloud Build, Resource Manager, Compute Engine et Cloud Source Repositories.
- Attribue le rôle IAM
roles/editor
au compte de service Cloud Build dans votre projet. Ce rôle est requis pour que Cloud Build puisse créer et configurer les composants GitOps nécessaires au déploiement. - Attribue le rôle IAM
roles/source.admin
au compte de service Cloud Build dans votre projet. Ce rôle est requis pour que le compte de service Cloud Build puisse créer les dépôts Cloud Source Repositories dans votre projet et cloner le contenu de l'exemple de dépôt GitHub dans vos dépôts Cloud Source Repositories. Génère un pipeline Cloud Build nommé
bootstrap.cloudbuild.yaml
en ligne, qui :- Crée un dépôt dans Cloud Source Repositories.
- Copie le code source de l'exemple de dépôt GitHub dans le nouveau dépôt Cloud Source Repositories.
- Crée les déclencheurs de compilation "apply" et "destroy".
Pipelines Cloud Build
apply.cloudbuild.yaml
et destroy.cloudbuild.yaml
sont les fichiers de configuration Cloud Build que le script d'installation utilise pour configurer les ressources du flux GitOps. apply.cloudbuild.yaml
contient deux étapes de compilation :
- Étape de compilation
tf_apply build
qui appelle la fonctiontf_install_in_cloud_build_step
, qui installe Terraform.tf_apply
qui crée les ressources utilisées dans le flux GitOps. Les fonctionstf_install_in_cloud_build_step
ettf_apply
sont définies dansbash_utils.sh
, et l'étape de compilation utilise la commandesource
pour les appeler. - Étape de compilation
describe_deployment
qui appelle la fonctiondescribe_deployment
qui affiche les adresses IP des équilibreurs de charge.
destroy.cloudbuild.yaml
appelle tf_destroy
qui supprime toutes les ressources créées par tf_apply
.
Les fonctions tf_install_in_cloud_build_step
, tf_apply
, describe_deployment
et tf_destroy
sont définies dans le fichier bash_utils.sh
.
Les fichiers de configuration de compilation utilisent la commande source
pour appeler les fonctions.
Le code suivant montre la fonction tf_install_in_cloud_build_step
définie dans bash_utils.sh
. Les fichiers de configuration de compilation appellent cette fonction pour installer Terraform à la volée. Il crée un bucket Cloud Storage pour enregistrer l'état Terraform.
L'extrait de code suivant montre la fonction tf_apply
définie dans bash_utils.sh
. Il appelle d'abord terraform init
qui charge tous les modules et bibliothèques personnalisées, puis exécute terraform apply
pour charger les variables à partir du fichier main.tfvars
.
L'extrait de code suivant montre la fonction describe_deployment
définie dans bash_utils.sh
. Il utilise gcloud compute addresses describe
pour récupérer les adresses IP des équilibreurs de charge à l'aide du nom et les affiche.
L'extrait de code suivant montre la fonction tf_destroy
définie dans bash_utils.sh
. Il appelle terraform init
qui charge tous les modules et bibliothèques personnalisées, puis exécute terraform destroy
qui décharge les variables Terraform.
Modèles Terraform
Vous trouverez tous les fichiers et variables de configuration Terraform dans le dossier copy-of-gcp-mig-simple/infra/
.
main.tf
: fichier de configuration Terraformmain.tfvars
: ce fichier définit les variables Terraform.mig/
etsplitter/
: ces dossiers contiennent les modules qui définissent les équilibreurs de charge. Le dossiermig/
contient le fichier de configuration Terraform qui définit le MIG pour les équilibreurs de charge bleu et vert. Les MIG bleu et vert sont identiques. Ils sont donc définis une seule fois et instanciés pour les objets bleu et vert. Le fichier de configuration Terraform pour l'équilibreur de charge de répartiteur se trouve dans le dossiersplitter/
.
L'extrait de code suivant montre le contenu de infra/main.tfvars
. Il contient trois variables : deux qui déterminent la version de l'application à déployer dans les pools bleu et vert, et une variable pour la couleur active (bleu ou vert). Les modifications apportées à ce fichier déclenchent le déploiement.
Voici un extrait de code de infra/main.tf
. Dans cet extrait :
- Une variable est définie pour le projet Google Cloud .
- Google est défini comme fournisseur Terraform.
- Une variable est définie pour l'espace de noms. Tous les objets créés par Terraform sont préfixés avec cette variable afin que plusieurs versions de l'application puissent être déployées dans le même projet et que les noms d'objets ne se chevauchent pas.
- Les variables
MIG_VER_BLUE
,MIG_VER_BLUE
etMIG_ACTIVE_COLOR
sont les liaisons pour les variables du fichierinfra/main.tfvars
.
L'extrait de code suivant de infra/main.tf
montre l'instanciation du module de fractionnement. Ce module prend en compte la couleur active afin que l'équilibreur de charge du répartiteur sache quel MIG déployer l'application.
L'extrait de code suivant de infra/main.tf
définit deux modules identiques pour les MIG bleues et vertes. Il prend en compte la couleur, le réseau et le sous-réseau définis dans le module de fractionnement.
Le fichier splitter/main.tf
définit les objets créés pour le MIG du répartiteur. Voici un extrait de code de splitter/main.tf
qui contient la logique permettant de basculer entre les MIG verts et bleus. Il est soutenu par le service google_compute_region_backend_service
, qui peut acheminer le trafic vers deux régions de backend : var.instance_group_blue
ou var.instance_group_green
.
capacity_scaler
définit la part du trafic à acheminer.
Le code suivant achemine 100 % du trafic vers la couleur spécifiée, mais vous pouvez le modifier pour le déploiement Canary afin d'acheminer le trafic vers un sous-ensemble d'utilisateurs.
Le fichier mig/main.tf
définit les objets liés aux MIG bleus et verts. L'extrait de code suivant de ce fichier définit le modèle d'instance Compute Engine utilisé pour créer les pools de VM. Notez que ce modèle d'instance a la propriété de cycle de vie Terraform définie sur create_before_destroy
.
En effet, lorsque vous mettez à jour la version du pool, vous ne pouvez pas utiliser le modèle pour créer la nouvelle version des pools tant qu'il est encore utilisé par la version précédente du pool. Toutefois, si l'ancienne version du pool est détruite avant la création du nouveau modèle, les pools seront indisponibles pendant un certain temps. Pour éviter ce scénario, nous définissons le cycle de vie Terraform sur create_before_destroy
afin que la version la plus récente d'un pool de VM soit créée avant la destruction de l'ancienne version.