Automatiser le basculement multirégional avec l'état de santé des services Cloud Run

Ce document explique comment configurer et déployer un service Cloud Run multirégion à disponibilité élevée, avec des fonctionnalités de basculement et de reprise après sinistre automatisées.

L'état de santé du service Cloud Run expose l'état de santé global de votre service dans chaque région à l'aide de groupes de points de terminaison du réseau (NEG) sans serveur.

Fonctionnement

Le basculement automatisé achemine les requêtes entrantes d'un équilibreur de charge d'application externe global ou d'un équilibreur de charge d'application interne interrégional vers vos services Cloud Run via des NEG sans serveur régionaux. Les instances de conteneur individuelles exécutent des vérifications d'aptitude, que Cloud Run agrège pour déterminer l'état de fonctionnement global de chaque service régional.

Un service Cloud Run dans une région est opérationnel et reçoit du trafic si 60% ou plus de ses instances réussissent leurs sondes de disponibilité. Si une région n'est plus opérationnelle, l'équilibreur de charge redirige automatiquement le trafic vers une région opérationnelle. Une fois que la région non opérationnelle est rétablie, l'équilibreur de charge y restaure progressivement le trafic.

Limites

Les limites suivantes s'appliquent à l'état de santé des services Cloud Run :

  • Vous devez configurer au moins une instance minimale au niveau du service ou de la révision par région pour calculer l'état. Vous pouvez également utiliser la métrique Nombre d'instances de conteneur dans Cloud Monitoring pour estimer le nombre minimal d'instances requis pour vos régions.
  • Les basculements nécessitent au moins deux services provenant de régions différentes. Sinon, si un service échoue, le message d'erreur no healthy upstream s'affiche.
  • Vous ne pouvez pas configurer de masque d'URL ni de tags dans les NEG sans serveur.
  • Vous ne pouvez pas activer IAP à partir d'un service de backend ou d'un équilibreur de charge. Activez IAP directement depuis Cloud Run.
  • Si un service Cloud Run est supprimé, Cloud Run ne signale pas d'état non opérationnel à l'équilibreur de charge.
  • Le premier test d'aptitude n'est pas comptabilisé lors du démarrage d'une nouvelle instance. Il est donc possible qu'une requête soit brièvement acheminée vers un service qui vient de démarrer avant de devenir non opérationnel.
  • L'état de fonctionnement du service Cloud Run est calculé pour toutes les instances. Les révisions sans sondes sont traitées comme inconnues. L'équilibreur de charge considère les instances inconnues comme opérationnelles.
  • Le calcul de l'état du service peut générer des résultats inexacts si les instances plantent rapidement.

Bonnes pratiques

Vous pouvez combiner les vérifications d'aptitude, la répartition du trafic et le nombre minimal d'instances pour effectuer des déploiements progressifs et sécurisés. Cela vous permet de vérifier l'état d'une nouvelle révision dans une seule région "canari" avant de la promouvoir, en vous assurant que l'équilibreur de charge n'envoie le trafic qu'aux backends régionaux opérationnels.

Lorsque vous configurez des vérifications sur votre propre application, ajoutez un point de terminaison HTTP/1 (valeur par défaut de Cloud Run, et non HTTP/2) dans votre code de service pour répondre à la vérification. Le nom du point de terminaison (par exemple, /startup, /health ou /are_you_ready) doit correspondre à path dans la configuration de la vérification. Les points de terminaison HTTP de vérification d'état sont accessibles en externe et suivent les mêmes principes que tous les autres points de terminaison de service HTTP exposés en externe.

Vous pouvez déployer une révision de service sur un service Cloud Run existant qui n'utilise pas de vérification de préparation ni l'état de santé du service Cloud Run. Suivez cette procédure région par région pour déployer une nouvelle révision en toute sécurité :

  1. Déployez la nouvelle révision dans une seule région "canari" avec une vérification de l'état configurée.

  2. Envoyez une petite quantité de trafic (par exemple, 1%) vers la nouvelle révision.

  3. Utilisez un nombre minimal d'instances non nul au niveau du service plutôt qu'au niveau de la révision.

  4. Vérifiez la métrique de sonde de disponibilité (run.googleapis.com/container/instance_count_with_readiness) pour vous assurer que les nouvelles instances sont opérationnelles.

  5. Augmentez progressivement le pourcentage de trafic vers la nouvelle révision. À mesure que vous augmentez le trafic, surveillez la métrique sur l'état du service Cloud Run régional (run.googleapis.com/service_health_count), qui est utilisée par l'équilibreur de charge. Les rapports sur l'état du service Cloud Run UNKNOWN jusqu'à ce qu'un trafic suffisant soit acheminé vers la nouvelle révision.

  6. Une fois que la révision reçoit 100% du trafic et que l'état du service Cloud Run régional est stable et opérationnel, répétez ce processus pour toutes les autres régions.

Tutoriel : Configurer le basculement automatique

Ce tutoriel vous guide dans le déploiement d'un exemple d'application Go dans deux régions, la configuration d'un équilibreur de charge d'application externe mondial avec des NEG sans serveur et le test du basculement automatique.

Au cours de ce tutoriel, vous allez :

  1. Préparer l'exemple d'application
  2. Déployer des services Cloud Run dans deux régions avec des sondes de disponibilité
  3. Configurer un équilibreur de charge d'application externe global
  4. Ajouter vos services via le NEG sans serveur
  5. Tester le basculement

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

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai sans frais.

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Activez les API Artifact Registry, Cloud Build, Cloud Run Admin, Network Services et Compute Engine, si certaines ne sont pas déjà activées.

    Rôles requis pour activer les API

    Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    Activer les API

  7. Installez et initialisez la gcloud CLI.
  8. Mettez à jour les composants :
    gcloud components update
  9. Définissez les variables de configuration utilisées dans ce tutoriel :
    PROJECT_ID= gcloud config set core/project PROJECT_ID
    PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    SERVICE=health-example
    REGION_A=us-west1
    REGION_B=europe-west1
    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud .

Définir les rôles requis

Pour déployer à partir de la source avec compilation, vous ou votre administrateur devez attribuer les rôles IAM suivants au compte de service Cloud Build.

Cliquez ici pour afficher les rôles requis pour le compte de service Cloud Build

Cloud Build utilise automatiquement le compte de service Compute Engine par défaut comme compte de service Cloud Build par défaut pour compiler votre code source et votre ressource Cloud Run, sauf si vous modifiez ce comportement. Pour que Cloud Build puisse créer vos sources, demandez à votre administrateur d'accorder le rôle Créateur Cloud Run (roles/run.builder) au compte de service Compute Engine par défaut sur votre projet :

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

Remplacez PROJECT_NUMBER par le numéro de votre projet Google Cloudet PROJECT_ID par l'ID de votre projet Google Cloud. Pour obtenir des instructions détaillées sur la recherche de votre ID du projet et de votre numéro de projet, consultez Créer et gérer des projets.

L'attribution du rôle de compilateur Cloud Run au compte de service Compute Engine par défaut prend quelques minutes à se propager.

Pour obtenir les autorisations nécessaires à votre identité de service pour accéder au fichier et au bucket Cloud Storage, demandez à votre administrateur d'accorder à l'identité de service le rôle Administrateur Storage (roles/storage.admin). Pour en savoir plus sur les rôles et les autorisations Cloud Storage, consultez la page IAM pour Cloud Storage.

Pour obtenir la liste des rôles et des autorisations IAM associés à Cloud Run, consultez les sections Rôles IAM Cloud Run et Autorisations IAM Cloud Run. Si votre service Cloud Run communique avec les APIGoogle Cloud , telles que les bibliothèques clientes Cloud, consultez le guide de configuration de l'identité du service. Pour en savoir plus sur l'attribution de rôles, consultez les pages Autorisations de déploiement et Gérer les accès.

Préparer l'exemple d'application

Pour récupérer l'exemple de code à utiliser, procédez comme suit :

  1. Clonez le dépôt de l'exemple sur votre ordinateur local :

    git clone https://github.com/GoogleCloudPlatform/golang-samples
    
  2. Accédez au répertoire contenant l'exemple de code Cloud Run :

    cd golang-samples/run/service-health
    

Déployer le service Cloud Run dans deux régions avec des sondes de préparation

Les basculements nécessitent au moins deux services provenant de régions différentes. Pour déployer vos services à partir de la source dans deux régions différentes avec des vérifications de disponibilité, exécutez les commandes suivantes. Si vous préférez utiliser Terraform, consultez Déployer un service multirégional et assurez-vous d'ajouter la configuration de la sonde de disponibilité.

  1. Déployez votre service health-example dans us-west1 et europe-west1 à partir du répertoire source. Vous avez besoin d'au moins une instance minimale pour configurer l'état du service avec des sondes de préparation :

    gcloud run deploy $SERVICE \
    --source=. \
    --regions=$REGION_A,$REGION_B \
    --min=10 \
    --readiness-probe httpGet.path="/are_you_ready"
    
  2. Répondez aux invites pour installer les API requises en répondant y lorsque vous y êtes invité. Vous ne devez procéder à cette opération qu'une fois par projet. Répondez aux autres invites en fournissant la plate-forme et la région, si vous n'avez pas défini les paramètres par défaut pour celles-ci, comme décrit dans la section Avant de commencer.

Configurer un équilibreur de charge d'application externe global

Pour configurer un équilibreur de charge d'application externe mondial afin d'acheminer le trafic entre us-west1 et europe-west1, procédez comme suit. Si vous préférez provisionner votre équilibreur de charge à l'aide de Terraform, consultez Créer un équilibreur de charge d'application externe global.

  1. Créez un service de backend :

    gcloud compute backend-services create $SERVICE-bs \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --global
    
  2. Configurez une adresse IP externe statique globale pour accéder à votre équilibreur de charge :

    gcloud compute addresses create $SERVICE-ip \
      --network-tier=PREMIUM \
      --ip-version=IPV4 \
      --global
    
  3. Créez un mappage d'URL pour acheminer les requêtes entrantes vers le service de backend :

    gcloud compute url-maps create $SERVICE-lb \
      --default-service $SERVICE-bs
    
  4. Créez un proxy HTTP cible, qui va rediriger les requêtes vers votre mappage d'URL :

    gcloud compute target-http-proxies create $SERVICE-hp \
    --url-map=$SERVICE-lb
    
  5. Créez une règle de transfert pour acheminer les requêtes entrantes vers le proxy :

    gcloud compute forwarding-rules create $SERVICE-fr \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=PREMIUM \
      --address=$SERVICE-ip \
      --target-http-proxy=$SERVICE-hp \
      --global \
      --ports=80
    

Ajouter vos services via un NEG sans serveur

Pour ajouter les services que vous avez déployés dans us-west1 et europe-west1 à l'aide du NEG sans serveur, suivez ces étapes. Si vous préférez provisionner vos NEG sans serveur à l'aide de Terraform, consultez Configurer des groupes de points de terminaison du réseau régionaux.

  1. Créez un groupe de points de terminaison du réseau (NEG) sans serveur pour votre service Cloud Run dans us-west1 et europe-west1 :

    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_A \
        --region $REGION_A \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_B \
        --region $REGION_B \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
  2. Ajoutez le NEG sans serveur en tant que backend aux services de backend dans us-west1 et europe-west1 :

    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_A \
        --network-endpoint-group-region=$REGION_A
    
    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_B \
        --network-endpoint-group-region=$REGION_B
    

Pour découvrir d'autres options de configuration, consultez Configurer un équilibreur de charge d'application externe global avec Cloud Run.

Signaler l'état de santé régional

Pour agréger l'état de santé des services Cloud Run régionaux et signaler un état sain ou non sain à l'équilibreur de charge, procédez comme suit :

  1. Déployez une révision de service Cloud Run dans plusieurs régions avec un ou plusieurs nombres minimaux d'instances. Exécutez la commande suivante pour utiliser la vérification d'aptitude que vous avez configurée à l'étape précédente :

    gcloud run deploy SERVICE_NAME \
    --regions=REGION_A,REGION_B \
    --min=MIN_INSTANCES

    Remplacez les éléments suivants :

    • SERVICE_NAME : nom du service.
    • REGION_A, REGION_B : différentes régions pour la révision de votre service. Par exemple, définissez REGION_A sur us-central1 et REGION_B sur europe-west1.
    • MIN_INSTANCES : nombre d'instances de conteneur à garder en attente et prêtes à recevoir des requêtes. Vous devez définir la valeur minimale sur 1 ou plus.
  2. Configurez une vérification de disponibilité gRPC ou HTTP sur chaque instance de conteneur.

  3. Configurez un équilibreur de charge d'application externe global ou un équilibreur de charge d'application interne interrégional pour rediriger le trafic loin des régions non opérationnelles.

  4. Configurez des NEG sans serveur pour chaque service Cloud Run dans chaque région.

  5. Configurez un service de backend pour qu'il se connecte aux NEG sans serveur.

Découvrez comment déployer un exemple d'application Cloud Run dans deux régions avec des sondes de préparation.

Tester et vérifier le basculement

Pour tester le basculement afin d'assurer la fiabilité et la résilience de vos services Cloud Run, procédez comme suit :

  1. Exécutez la commande suivante pour obtenir l'adresse IP de votre équilibreur de charge :

    LBIP=$(gcloud compute addresses describe $SERVICE-ip --global --format='value(address)')
    
  2. Facultatif : Envoyez une requête à votre équilibreur de charge si vos services nécessitent une authentification :

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LBIP
    
  3. Obtenez la valeur de la variable LBIP en exécutant la commande echo $LBIP. L'adresse IP de l'équilibreur de charge s'affiche. Par exemple, 11.22.33.44.

  4. Pour tester un basculement, accédez à l'URL http://LOAD_BALANCER_IP, où LOAD_BALANCER_IP correspond à la valeur que vous avez obtenue à l'étape précédente. Cliquez sur le bouton bascule de votre région dans la section Régions desservies. Cela désigne la région opérationnelle et l'instance diffusant le trafic :

    Automatiser le basculement multirégional avec l'état de santé des services Cloud Run

Surveiller les vérifications de l'état

Une fois que vous avez configuré l'état de santé du service Cloud Run, les NEG sans serveur collectent la métrique d'état de santé du service Cloud Monitoring. Vous pouvez afficher l'état de fonctionnement des services régionaux existants.

Si un service d'une région n'est pas opérationnel, l'équilibreur de charge redirige le trafic de la région non opérationnelle vers une région opérationnelle. Le trafic est rétabli une fois la région redevenue opérationnelle.

Utiliser des abonnements push Pub/Sub authentifiés avec un déploiement multirégional

Par défaut, un service Pub/Sub envoie des messages à des points de terminaison push dans la même région Google Cloud où le service Pub/Sub les stocke. Pour contourner ce comportement, consultez Utiliser un abonnement push Pub/Sub authentifié avec un déploiement multirégional Cloud Run.

Alternative : Configurer le basculement manuel

Si vous devez configurer manuellement le trafic pour qu'il bascule vers une région opérationnelle sans vous appuyer sur des vérifications, modifiez le mappage d'URL de l'équilibreur de charge d'application externe global.

  1. Pour mettre à jour le mappage d'URL de l'équilibreur de charge d'application externe global, supprimez le NEG du service de backend à l'aide de l'indicateur --global :

    gcloud compute backend-services remove-backend BACKEND_NAME \
    --network-endpoint-group=NEG_NAME \
    --network-endpoint-group-region=REGION \
    --global
    

    Remplacez les éléments suivants :

    • BACKEND_NAME : nom du service de backend.
    • NEG_NAME : nom de la ressource du groupe de points de terminaison du réseau, par exemple myservice-neg-uscentral1.
    • REGION : région dans laquelle le NEG a été créé et dans laquelle vous souhaitez supprimer votre service. Exemple : us-central1,asia-east1.
  2. Pour vérifier qu'une région opérationnelle diffuse désormais du trafic, accédez à https://.

Pour éviter que des frais supplémentaires ne soient facturés sur votre compte Google Cloud , supprimez toutes les ressources que vous avez déployées avec ce tutoriel.

Supprimer le projet

Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous devez le conserver sans les modifications apportées lors du présent tutoriel, supprimez les ressources créées pour ce tutoriel.

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour 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.

Supprimer les ressources du tutoriel

  1. Supprimez le service Cloud Run que vous avez déployé dans ce tutoriel. Les services Cloud Run n'entraînent pas de frais tant qu'ils ne reçoivent pas de requêtes.

    Pour supprimer votre service Cloud Run, exécutez la commande suivante :

    gcloud run services delete SERVICE-NAME

    Remplacez SERVICE-NAME par le nom du service.

    Vous pouvez également supprimer des services Cloud Run à partir de la consoleGoogle Cloud .

  2. Supprimez la configuration régionale par défaut gcloud que vous avez ajoutée lors de la configuration du tutoriel :

     gcloud config unset run/region
    
  3. Supprimez la configuration du projet :

     gcloud config unset project
    

Étapes suivantes