Ce document explique comment mettre en œuvre l'architecture de référence décrite dans la section Intégrer des microservices avec Pub/Sub et GKE. L'architecture est conçue pour gérer les processus de longue durée en utilisant des conteneurs et une messagerie asynchrone.
Ce document utilise un exemple d'application de partage de photos qui génère des vignettes de photos. Vous déployez l'application à l'aide de Google Kubernetes Engine (GKE) et utilisez Pub/Sub pour appeler de manière asynchrone des processus de longue durée. Vous utilisez également des notifications Pub/Sub pour Cloud Storage afin d'ajouter des tâches secondaires sans modifier le code de l'application.
L'application est conteneurisée par Cloud Build et stockée dans Artifact Registry. Elle utilise Cloud Vision pour détecter les images au contenu inapproprié.
Architecture
Le schéma suivant illustre la conception de l'exemple d'application d'album photo qui met en œuvre l'architecture de référence.
Figure 1 : Architecture de traitement d'image basée sur l'utilisation de conteneurs et d'une messagerie asynchrone.
Le schéma précédent montre comment la vignette est générée :
- Un client importe une image dans l'application.
- L'application stocke l'image dans Cloud Storage.
- Une requête est générée pour la vignette.
- Le générateur de vignettes crée la vignette.
- La réponse positive est envoyée à l'application d'album photo.
- La réponse positive est envoyée au client et vous pouvez trouver la vignette dans Cloud Storage.
Le schéma suivant montre comment l'application met en œuvre la génération de vignettes en tant que service distinct et de manière asynchrone.
Figure 2. Architecture du processus d'extraction des vignettes.
Vous utilisez Pub/Sub pour envoyer des requêtes de service au service de génération de vignettes. Cette nouvelle architecture rend l'appel de service asynchrone afin qu'une vignette soit créée en arrière-plan une fois que l'application a renvoyé la réponse à un client. Cette conception permet également au service de génération de vignettes de s'adapter afin que plusieurs tâches puissent s'exécuter en parallèle.
Objectifs
- Déployer un exemple d'application d'album photo sur GKE
- Effectuer des appels de service asynchrones à partir de l'application
- Utiliser les notifications Pub/Sub pour Cloud Storage afin de déclencher l'application lorsqu'un nouveau fichier est importé dans le bucket Cloud Storage
- Utiliser Pub/Sub pour effectuer plus de tâches sans modifier l'application
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
- Cloud Storage
- Cloud SQL
- Pub/Sub
- Compute Engine instances used by GKE
- Cluster-management fee for GKE
- Cloud Load Balancing
- Cloud Build
- Artifact Registry
- Vision
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez fini de créer l'exemple d'application, vous pouvez éviter de continuer à payer des frais en supprimant les ressources créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- 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 gratuits pour exécuter, tester et déployer des charges de travail.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud SQL, Cloud Build, Artifact Registry, and Cloud Vision APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud SQL, Cloud Build, Artifact Registry, and Cloud Vision APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Configurer l'environnement
Dans cette section, vous allez définir les paramètres par défaut pour les valeurs utilisées tout au long du document. Si vous fermez votre session Cloud Shell, vous perdrez ces paramètres d'environnement.
Dans Cloud Shell, définissez votre projet Google Cloud par défaut :
gcloud config set project PROJECT_ID
Remplacez
PROJECT_ID
par l'ID de votre projet Google Cloud.Définissez votre région Compute Engine par défaut :
gcloud config set compute/region REGION export REGION=REGION
Remplacez
REGION
par une région proche de vous. Pour en savoir plus, consultez la page Régions et zones.Définissez votre zone Compute Engine par défaut :
gcloud config set compute/zone ZONE export ZONE=ZONE
Remplacez
ZONE
par une zone proche de vous.Téléchargez les fichiers d'exemple d'application et accédez à votre répertoire actuel :
git clone https://github.com/GoogleCloudPlatform/gke-photoalbum-example cd gke-photoalbum-example
Créer un bucket Cloud Storage et importer l'image de vignettes par défaut
Dans Cloud Shell, créez un bucket Cloud Storage pour stocker les images et les vignettes d'origine :
export PROJECT_ID=$(gcloud config get-value project) gcloud storage buckets create gs://${PROJECT_ID}-photostore --location=${REGION}
Importez le fichier de vignettes par défaut :
gcloud storage cp ./application/photoalbum/images/default.png \ gs://${PROJECT_ID}-photostore/thumbnails/default.png
- Les images importées sont stockées au format suivant :
gs://PROJECT_ID-photostore/FILENAME
oùFILENAME
représente le nom du fichier image importé. - Les vignettes générées sont stockées au format suivant :
gs://PROJECT_ID-photostore/thumbnails/FILENAME
. - L'image d'origine et la vignette correspondante ont le même
FILENAME
, mais la vignette est stockée dans le bucketthumbnails
. Pendant la création de la vignette, l'image de vignette d'espace réservé
default.png
suivante s'affiche dans l'album photo.
- Les images importées sont stockées au format suivant :
Rendre le fichier de vignette public :
gcloud storage buckets add-iam-policy-binding gs://${PROJECT_ID}-photostore \ --member=allUsers --role=roles/storage.objectViewer
Créer une instance Cloud SQL et une base de données MySQL
Dans Cloud Shell, créez l'instance Cloud SQL :
gcloud sql instances create photoalbum-db --region=${REGION} \ --database-version=MYSQL_8_0
Récupérez le nom de la connexion :
gcloud sql instances describe photoalbum-db \ --format="value(connectionName)"
Notez ce nom, car vous l'utiliserez plus tard.
Définissez le mot de passe de l'utilisateur MySQL
root@%
.gcloud sql users set-password root --host=% --instance=photoalbum-db \ --password=PASSWORD
Remplacez
PASSWORD
par un mot de passe sécurisé pour l'utilisateurroot@%
.Connectez-vous à l'instance Cloud SQL.
gcloud sql connect photoalbum-db --user=root --quiet
Lorsque vous y êtes invité, saisissez le mot de passe que vous avez configuré à l'étape précédente.
Créez une base de données appelée
photo_db
, dont l'utilisateur estappuser
avec le mot de passepas4appuser
:create database photo_db; create user 'appuser'@'%' identified by 'pas4appuser'; grant all on photo_db.* to 'appuser'@'%' with grant option; flush privileges;
Confirmez le résultat et quittez MySQL :
show databases; select user from mysql.user; exit
Dans le résultat, vérifiez que la base de données
photo_db
et l'utilisateurappuser
sont créés :mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | photo_db | | sys | +--------------------+ 5 rows in set (0.16 sec) mysql> \t Outfile disabled. mysql> select user from mysql.user; +-------------------+ | user | +-------------------+ | appuser | | cloudsqlreplica | | cloudsqlsuperuser | | root | | cloudsqlexport | | cloudsqlimport | | cloudsqloneshot | | root | | cloudsqlexport | | cloudsqlimport | | cloudsqloneshot | | root | | cloudsqlapplier | | cloudsqlimport | | mysql.infoschema | | mysql.session | | mysql.sys | | root | +-------------------+ 18 rows in set (0.16 sec) mysql> exit Bye
Créer un sujet et un abonnement Pub/Sub
Dans Cloud Shell, créez un sujet Pub/Sub appelé
thumbnail-service
:gcloud pubsub topics create thumbnail-service
L'application d'album photo envoie des requêtes au service de génération de vignettes en publiant un message sur le sujet
thumbnail-service
.Créez un abonnement Pub/Sub appelé
thumbnail-workers
:gcloud pubsub subscriptions create --topic thumbnail-service thumbnail-workers
Le service de génération de vignettes reçoit des requêtes de l'abonnement
thumbnail-workers
.
Créer un cluster GKE
Dans Cloud Shell, créez un cluster GKE autorisé à appeler des API :
gcloud container clusters create "photoalbum-cluster" \ --scopes "https://www.googleapis.com/auth/cloud-platform" \ --num-nodes "5"
Récupérez les identifiants d'accès configurés pour pouvoir gérer le cluster à l'aide de la commande
kubectl
lors des étapes suivantes :gcloud container clusters get-credentials photoalbum-cluster
Affichez la liste des nœuds :
kubectl get nodes
Dans le résultat, vérifiez qu'il existe cinq nœuds dont la valeur
STATUS
estReady
:NAME STATUS ROLES AGE VERSION gke-photoalbum-cluster-default-pool-d637570a-2pfh Ready <none> 2m55s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-3rm4 Ready <none> 2m55s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-f7l4 Ready <none> 2m55s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-qb2z Ready <none> 2m53s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-rvnp Ready <none> 2m54s v1.24.10-gke.2300
Créer le dépôt Artifact Registry
Dans Cloud Shell, créez un dépôt pour stocker les images de conteneurs :
gcloud artifacts repositories create photoalbum-repo \ --repository-format=docker \ --location=us-central1 \ --description="Docker repository"
Créer des images pour l'application
Dans un éditeur de texte, ouvrez le fichier
application/photoalbum/src/auth_decorator.py
et mettez à jour le nom d'utilisateur et le mot de passe :USERNAME = 'username' PASSWORD = 'passw0rd'
Dans Cloud Shell, créez une image pour l'application d'album photo à l'aide du service Cloud Build :
gcloud builds submit ./application/photoalbum -t \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app
Créez une image pour le service de génération de vignettes
thumbnail-worker
à l'aide du service Cloud Build :gcloud builds submit ./application/thumbnail -t \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/thumbnail-worker
Déployer l'application d'album photo
Dans Cloud Shell, mettez à jour les fichiers manifestes de déploiement Kubernetes pour l'album photo et le générateur de vignettes avec les valeurs de votre environnement :
connection_name=$(gcloud sql instances describe photoalbum-db \ --format "value(connectionName)") digest_photoalbum=$(gcloud container images describe \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app:latest --format \ "value(image_summary.digest)") sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \ -e "s/\[CONNECTION_NAME\]/${connection_name}/" \ -e "s/\[DIGEST\]/${digest_photoalbum}/" \ config/photoalbum-deployment.yaml digest_thumbnail=$(gcloud container images describe \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/thumbnail-worker:latest --format \ "value(image_summary.digest)") sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \ -e "s/\[CONNECTION_NAME\]/${connection_name}/" \ -e "s/\[DIGEST\]/${digest_thumbnail}/" \ config/thumbnail-deployment.yaml
Créez des ressources de déploiement pour lancer l'application d'album photo et le service de génération de vignettes :
kubectl create -f config/photoalbum-deployment.yaml kubectl create -f config/thumbnail-deployment.yaml
Créez une ressource de service pour attribuer une adresse IP externe à l'application :
kubectl create -f config/photoalbum-service.yaml
Vérifiez les résultats des pods :
kubectl get pods
Dans le résultat, vérifiez qu'il existe trois pods pour chaque pod
photoalbum-app
etthumbail-worker
, et que leur valeurSTATUS
estRunning
:NAME READY STATUS RESTARTS AGE photoalbum-app-555f7cbdb7-cp8nw 2/2 Running 0 2m photoalbum-app-555f7cbdb7-ftlc6 2/2 Running 0 2m photoalbum-app-555f7cbdb7-xsr4b 2/2 Running 0 2m thumbnail-worker-86bd95cd68-728k5 2/2 Running 0 2m thumbnail-worker-86bd95cd68-hqxqr 2/2 Running 0 2m thumbnail-worker-86bd95cd68-xnxhc 2/2 Running 0 2m
Les pods
thumbnail-worker
s'abonnent aux requêtes de génération de vignettes de l'abonnementthumbnail-workers
. Pour en savoir plus, découvrez l'utilisation de la fonctioncallback
dans le code source.Vérifiez les résultats des services :
kubectl get services
Dans le résultat, vérifiez qu'il y a bien une adresse IP externe dans la colonne
EXTERNAL-IP
du servicephotoalbum-service
. Quelques minutes peuvent s'écouler avant que les services ne soient tous en cours d'exécution.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.23.240.1 <none> 443/TCP 20m photoalbum-service LoadBalancer 10.23.253.241 146.148.111.115 80:32657/TCP 2m
Notez l'adresse IP externe, car elle sera utilisée ultérieurement. Dans cet exemple, la valeur est de
146.148.111.115
.
Tester l'application d'album photo
Pour accéder à l'application déployée dans un navigateur Web, accédez à l'URL suivante, puis saisissez le nom d'utilisateur et le mot de passe que vous avez précédemment configurés :
http://EXTERNAL_IP
Remplacez
EXTERNAL_IP
par l'adresse IP que vous avez copiée à l'étape précédente.Pour importer un fichier image, cliquez sur Importer.
L'image de vignette d'espace réservé apparaît à l'écran.
En arrière-plan, le service de génération de vignettes crée une vignette de l'image importée. Pour afficher la vignette générée, cliquez sur Refresh (Actualiser). L'API Cloud Vision ajoute des libellés aux images qu'elle détecte.
Pour afficher l'image d'origine, cliquez sur la vignette.
Ajouter une fonctionnalité de détection d'images inappropriées
L'image suivante montre comment utiliser les notifications Pub/Sub pour Cloud Storage afin de déclencher un service de détection de contenu inapproprié. Cette fonctionnalité floute l'image lorsqu'un nouveau fichier avec du contenu inapproprié est stocké dans le bucket Cloud Storage.
Dans l'image précédente, le service utilise la fonctionnalité de détection de recherche sécurisée de l'API Cloud Vision pour détecter le contenu inapproprié dans une image.
L'application photo déclenche le générateur de vignettes et le vérificateur d'image de manière asynchrone. Par conséquent, rien ne garantit que ces composants seront exécutés dans un ordre spécifique. Si la génération de vignettes se produit avant le floutage de l'image, une vignette inappropriée peut s'afficher pendant une courte période. Cependant, l'outil de vérification des images floute finalement l'image inappropriée et la vignette inappropriée.
Créer un sujet, un abonnement et une notification Pub/Sub
Dans Cloud Shell, créez un sujet Pub/Sub appelé
safeimage-service
:gcloud pubsub topics create safeimage-service
Créez un abonnement Pub/Sub appelé
safeimage-workers
:gcloud pubsub subscriptions create --topic safeimage-service \ safeimage-workers
Configurez une notification Pub/Sub afin qu'un message soit envoyé au sujet
safeimage-service
lorsqu'un nouveau fichier est importé dans le bucket Cloud Storage :gcloud storage buckets notifications create gs://${PROJECT_ID}-photostore \ --topic=safeimage-service --payload-format=json
Créer et déployer l'image du nœud de calcul
Dans Cloud Shell, créez une image de conteneur pour l'abonnement
safeimage-workers
à l'aide de Cloud Build :gcloud builds submit ./application/safeimage \ -t us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker
Mettez à jour les fichiers manifestes de déploiement Kubernetes pour le service d'images sécurisées avec l'ID de votre projet Google Cloud, le nom de la connexion Cloud SQL et les condensés des images de conteneur :
digest_safeimage=$(gcloud container images describe \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker:latest --format \ "value(image_summary.digest)") sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \ -e "s/\[CONNECTION_NAME\]/${connection_name}/" \ -e "s/\[DIGEST\]/${digest_safeimage}/" \ config/safeimage-deployment.yaml
Créer une ressource de déploiement
Créez une ressource de déploiement appelée
safeimage-deployment
pour déployer le sujetsafeimage-service
:kubectl create -f config/safeimage-deployment.yaml
Vérifiez les résultats :
kubectl get pods
Dans le résultat, vérifiez qu'il existe trois pods
safeimage-worker
dont la valeurSTATUS
estRunning
.NAME READY STATUS RESTARTS AGE photoalbum-app-555f7cbdb7-cp8nw 2/2 Running 0 30m photoalbum-app-555f7cbdb7-ftlc6 2/2 Running 0 30m photoalbum-app-555f7cbdb7-xsr4b 2/2 Running 8 30m safeimage-worker-7dc8c84f54-6sqzs 1/1 Running 0 2m safeimage-worker-7dc8c84f54-9bskw 1/1 Running 0 2m safeimage-worker-7dc8c84f54-b7gtp 1/1 Running 0 2m thumbnail-worker-86bd95cd68-9wrpv 2/2 Running 0 30m thumbnail-worker-86bd95cd68-kbhsn 2/2 Running 2 30m thumbnail-worker-86bd95cd68-n4rj7 2/2 Running 0 30m
Les pods
safeimage-worker
s'abonnent aux requêtes de détection d'images inappropriées de l'abonnementsafeimage-workers
. Pour en savoir plus, découvrez l'utilisation de la fonctioncallback
dans le code source.
Tester la fonctionnalité de détection d'images au contenu inapproprié
Dans cette section, vous importez une image test pour vérifier que la fonctionnalité de détection de recherche sécurisée floute une image inappropriée. L'image test est une photo d'une jeune fille déguisée en zombi (sous licence CC0 de Pixaby).
- Téléchargez l'image test.
- Pour importer l'image, accédez à
http://EXTERNAL_IP
, puis cliquez sur Upload (Importer). Cliquez sur Actualiser. L'application affiche une vignette floutée.
Pour voir si l'image importée est également floutée, cliquez sur la vignette.
Effectuer un nettoyage
Si vous ne souhaitez pas conserver les ressources Google Cloud que vous avez créées pour l'exemple d'application, vous pouvez les supprimer afin qu'elles ne vous soient plus facturées. Vous pouvez soit supprimer entièrement le projet, soit supprimer les ressources du cluster, puis le supprimer.
Supprimer le projet
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Supprimer les ressources individuelles
Au lieu de supprimer le projet, vous pouvez supprimer les ressources individuelles que vous avez créées.
Supprimez les ressources de GKE :
kubectl delete -f config/safeimage-deployment.yaml kubectl delete -f config/photoalbum-service.yaml kubectl delete -f config/thumbnail-deployment.yaml kubectl delete -f config/photoalbum-deployment.yaml
Supprimez le cluster de GKE :
gcloud container clusters delete photoalbum-cluster --quiet
Supprimez le dépôt dans Artifact Registry :
gcloud artifacts repositories delete photoalbum-repo --location us-central1 --quiet
Supprimez les abonnements et les sujets de Pub/Sub :
gcloud pubsub subscriptions delete safeimage-workers gcloud pubsub topics delete safeimage-service gcloud pubsub subscriptions delete thumbnail-workers gcloud pubsub topics delete thumbnail-service
Supprimez l'instance Cloud SQL :
gcloud sql instances delete photoalbum-db --quiet
Supprimez le bucket Cloud Storage :
gcloud storage rm gs://${PROJECT_ID}-photostore --recursive gcloud storage rm gs://${PROJECT_ID}_cloudbuild --recursive
Supprimez les fichiers :
cd .. rm -rf gke-photoalbum-example
Étape suivante
- Apprenez-en plus sur le DevOps et découvrez la fonctionnalité d'architecture associée à cette architecture de référence.
- Effectuez l'évaluation DevOps rapide pour comprendre votre position par rapport au reste du secteur.
- Pour découvrir d'autres architectures de référence, schémas et bonnes pratiques, consultez le Centre d'architecture cloud.