Cet exemple illustre le développement d'une application de journal avancée qui utilise Node.js pour l'interface et MySQL pour le backend. Le modèle crée et connecte également un équilibreur de charge HTTP qui répartit la charge entre deux zones et un autoscaler qui met automatiquement l'application à l'échelle.
Pour cet exemple, nous partons du principe que vous connaissez bien les conteneurs Docker, ainsi que les ressources Compute Engine, en particulier l'équilibrage de charge HTTP, l'autoscaling, les groupes d'instances gérés et les modèles d'instances.
Pour consulter d'autres tutoriels d'introduction, consultez le guide de démarrage ou le guide détaillé.
Avant de commencer
- Si vous voulez vous servir des exemples de ligne de commande de ce guide, installez l'outil de ligne de commande gcloud.
- Si vous voulez utiliser les exemples d'API de ce guide, configurez l'accès aux API.
- Familiarisez-vous avec l'équilibrage de charge HTTP de Compute Engine.
- Familiarisez-vous avec les conteneurs Docker.
Créer vos modèles
Dans cet exemple, un déploiement est lancé avec plusieurs types de ressources. Pour commencer, vous allez créer des modèles réutilisables qui définissent ces ressources séparément. Vous utiliserez ensuite ces modèles dans la configuration finale.
À la fin de cet exemple, vous disposerez d'un déploiement contenant les ressources suivantes :
- Une seule instance Compute Engine pour la machine virtuelle MySQL backend
- Un modèle d'instance qui utilise une image Docker
- Deux groupes d'instances gérés à évolution automatique dans deux zones différentes exécutant le service Node.js de frontend
- Un autre groupe d'instances géré à évolution automatique envoyant des données statiques
- Une vérification d'état et un équilibreur de charge HTTP pour le trafic distribué entre les différents groupes d'instances gérés
Créer des modèles de backend
Le backend de cette application consiste en une instance Compute Engine unique exécutant un conteneur MySQL Docker. Créez un modèle qui définit une instance Compute Engine utilisant une image optimisée pour les conteneurs. Nommez le fichier container_vm.[py|jinja]
.
Jinja
Python
Le modèle définit plusieurs variables, telles que containerImage
et manifest
, dont la valeur sera renseignée lorsque vous définirez votre configuration. Ce modèle a pour seule fonction de créer une unique instance de machine virtuelle (VM).
Lorsque vous utilisez des images de conteneur sur des instances Compute Engine, vous devez également fournir un fichier manifeste (différent du fichier manifeste Deployment Manager) pour indiquer à Compute Engine l'image de conteneur à utiliser. Créez une méthode d'assistance appelée container_helper.[py|jinja]
pour définir le fichier manifeste du conteneur de façon dynamique :
Jinja
Python
Créer des modèles d'interface
L'interface de cette application exécute Node.js et permet aux utilisateurs de publier des messages sur la page Web. Deux groupes d'instances gérés contiennent deux instances chacun : un groupe d'instances géré principal et un groupe d'instances géré secondaire pour l'équilibrage de charge.
Pour créer ces modèles d'interface, suivez les instructions ci-dessous.
Créez un modèle d'instance.
Vous devez disposer d'une ressource de modèle d'instance pour créer un groupe d'instances géré, qui est un groupe d'instances de VM identiques gérées de manière centralisée. Dans cet exemple, vous allez créer un groupe d'instances géré pour les instances frontend Node.js, mais vous devez d'abord créer le modèle d'instance.
Définissez un fichier nommé
container_instance_template.[py|jinja]
:Jinja
Python
Créez un groupe d'instances géré avec autoscaling.
Maintenant que vous disposez d'un modèle d'instance, vous pouvez définir un modèle qui utilise le modèle d'instance pour créer un groupe d'instances géré à évolution automatique. Créez un fichier nommé
autoscaled_group.[py|jinja]
avec le contenu suivant :Jinja
Python
Créez le fichier de schéma correspondant :
Jinja
Python
Créez des ressources à l'aide de ces modèles.
Jusqu'à présent, vous avez défini des modèles de base qui déterminent les propriétés de vos ressources. Définissez la configuration de votre frontend à l'aide de ces modèles. Créez un fichier nommé
service.[py|jinja]
avec le contenu suivant :Jinja
Python
Créez le fichier de schéma correspondant :
Jinja
Python
Voici le détail des éléments créés par ce modèle :
Deux groupes d'instances gérés, un groupe principal et un groupe secondaire.
Le modèle utilise le modèle
autoscaled_group.[py|jinja]
pour créer un groupe d'instances géré principal et secondaire à évolution automatique.Le modèle crée ensuite un service de backend et un vérificateur d'état. Le service de backend est nécessaire pour l'équilibrage de charge HTTP. De plus, il définit la capacité de diffusion des groupes d'instances qui en font partie. Dans ce cas, les groupes d'instances gérés principal et secondaire appartiennent à ce backend. Par conséquent, les propriétés par défaut du service de backend s'appliquent.
Par défaut, un service de backend effectue l'équilibrage de charge en fonction de l'utilisation du processeur des groupes d'instances associés. Toutefois, vous pouvez également effectuer l'équilibrage de charge en fonction du nombre de requêtes par seconde (RPS).
Remarque : Une vérification d'état est obligatoire lors de la création d'un service de backend.
Créer un modèle commun
Enfin, créez un modèle commun combinant les modèles de backend et d'interface. Créez un fichier nommé application.[py|jinja]
:
Jinja
Python
Créez le fichier de schéma correspondant :
Jinja
Python
En plus du frontend et du backend, le modèle permet également de définir des ressources supplémentaires :
Un service statique avec des groupes d'instances gérés principaux et secondaires. Ce service statique diffuse une page Web accessible via le chemin
/static
dans votre application.Une ressource de mappage d'URL. L'équilibrage de charge HTTP nécessite un mappage d'URL pour mapper les différentes URL sur les chemins corrects. Dans ce cas, le chemin par défaut, indiqué par la propriété
defaultService
, est le service de backend que vous avez créé précédemment. Si un utilisateur accède à/static
, le mappage d'URL mappe ce chemin sur le service statique, tel que défini dans la sectionpathMatchers
.Une règle de transfert globale et un proxy HTTP cible. Comme la charge de l'application est répartie entre deux zones distinctes, vous avez besoin d'une règle de transfert globale qui diffuse une seule adresse IP externe. En outre, un proxy HTTP cible est nécessaire pour configurer l'équilibrage de charge HTTP.
Règle de pare-feu qui autorise le trafic via le port 8080.
Créer la configuration
Maintenant que vos modèles et les schémas associés sont prêts, vous pouvez créer une configuration pour déployer ces ressources. Créez un fichier de configuration nommé application.yaml
avec le contenu suivant et remplacez ZONE_TO_RUN
et SECONDARY_ZONE_TO_RUN
par les zones principale et secondaire de votre choix.
Jinja
Python
Déployer votre configuration
Vous allez maintenant déployer vos ressources. À l'aide de Google Cloud CLI, exécutez la commande suivante. Vous pouvez éventuellement remplacer advanced-configuration-l7
par le nom du déploiement de votre choix. Sachez que le nom de votre déploiement sera automatiquement utilisé comme nom pour les ressources.
Dans cet exemple, le nom du déploiement est advanced-configuration-l7
. Si vous décidez de le modifier, veillez à utiliser le nouveau nom du déploiement dans tous les exemples suivants.
gcloud deployment-manager deployments create advanced-configuration-l7 --config application.yaml
La réponse doit présenter des ressources semblables aux suivantes :
Waiting for create operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0...done. Create operation operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0 completed successfully. NAME TYPE STATE ERRORS advanced-configuration-l7-application-fw compute.v1.firewall COMPLETED [] advanced-configuration-l7-application-l7lb compute.v1.globalForwardingRule COMPLETED [] advanced-configuration-l7-application-targetproxy compute.v1.targetHttpProxy COMPLETED [] advanced-configuration-l7-application-urlmap compute.v1.urlMap COMPLETED [] advanced-configuration-l7-backend compute.v1.instance COMPLETED [] advanced-configuration-l7-frontend-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-frontend-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-frontend-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-frontend-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-frontend-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-sec-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-static-service-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-static-service-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-static-service-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-sec-igm compute.v1.instanceGroupManager COMPLETED []
Ajouter des libellés de service
Spécifiez ensuite les libellés de service adaptés à vos groupes d'instances gérés. Les libellés de service sont des métadonnées utilisées par le service d'équilibrage de charge pour regrouper des ressources.
Pour ajouter des libellés de service, exécutez les commandes suivantes en indiquant pour les zones principale et secondaire celles que vous avez sélectionnées dans le fichier de configuration du déploiement :
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-pri-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [PRIMARY_ZONE]
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-sec-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [SECONDARY_ZONE]
Tester votre configuration
Pour tester votre configuration, vous devez récupérer l'adresse IP externe qui diffuse le trafic en adressant une requête à la règle de transfert :
gcloud compute forwarding-rules list | grep advanced-configuration-l7-l7lb advanced-configuration-l7-l7lb 107.178.249.126 TCP advanced-configuration-l7-targetproxy
Dans ce cas, l'adresse IP externe est 107.178.249.126
.
Dans un navigateur, accédez à l'adresse IP externe sur le port 8080. Par exemple, si votre adresse IP externe est 107.178.249.126
, l'URL sera la suivante :
http://107.178.249.126:8080
Vous devriez voir une page blanche s'afficher. Publiez ensuite un message sur la page. Accédez à l'URL suivante :
http://107.178.249.126:8080?msg=hello_world!
Une confirmation indiquant que votre message a été ajouté s'affiche. Revenez à l'URL principale. La page devrait afficher le message suivant :
hello_world!
Vous pouvez également consulter la page statique que vous avez créée ou vérifier l'état de votre application en accédant aux URL suivantes :
# Static web page
http://107.178.249.126:8080/static
# Health check
http://107.178.249.126:8080/_ah/health
Félicitations, votre configuration a bien été déployée.
Créer des images Docker (facultatif)
Docker vous permet d'automatiser et d'exécuter des logiciels dans des conteneurs. Les conteneurs vous permettent d'isoler différents services et peuvent tous s'exécuter sur une seule instance Linux.
Cet exemple utilise certaines images Docker existantes, mais vous pouvez également créer vos propres versions de ces images Docker. Pour découvrir comment créer des images de backend MySQL et des images d'interface Node.js, consultez la section Créer vos modèles de ressources.
Pour créer l'image Docker qui diffuse la page Web statique, procédez comme suit :
Créez une instance de VM avec une image optimisée pour les conteneurs :
gcloud compute instances create docker-playground \ --image-family container-vm \ --image-project google-containers \ --zone us-central1-a \ --machine-type f1-micro
Connectez-vous à l'instance :
gcloud compute ssh --zone us-central1-a docker-playground
Créez un fichier nommé
Dockerfile
avec le contenu suivant :FROM node:latest RUN mkdir /var/www/ ADD service.js /var/www/service.js WORKDIR /var/www/ RUN npm install mysql CMD ["node", "service.js"]
Créez un fichier nommé
service.js
avec le contenu suivant :var http = require('http'); var url = require('url'); console.log('Started static node server') http.createServer(function (req, res) { reqUrl = url.parse(req.url, true); res.useChunkedEncodingByDefault = false; res.writeHead(200, {'Content-Type': 'text/html'}); if (reqUrl.pathname == '/_ah/health') { res.end('ok'); } else if (reqUrl.pathname == '/exit') { process.exit(-1) } else { res.end('static server'); } }).listen(8080, '0.0.0.0'); console.log('Static server running at http://127.0.0.1:8080/');
Créez l'image Docker en remplaçant
username
par votre nom d'utilisateur Docker Hub. Si vous ne possédez pas de nom d'utilisateur Docker Hub, créez-en un avant de créer l'image Docker.sudo docker build --no-cache -t username/nodejsservicestatic .
Envoyez les images dans le dépôt Docker :
sudo docker push username/nodejsservicestatic
Vous disposez désormais des images Docker pour exécuter Node.js et MySQL. Vous pouvez afficher ces images dans le dépôt en recherchant leurs noms. Pour tester les images, vous pouvez remplacer toutes les instances de gcr.io/deployment-manager-examples/mysql
et gcr.io/deployment-manager-examples/nodejsservice
par vos images correspondantes.
Étapes suivantes
Une fois cet exemple terminé, vous pouvez effectuer les étapes suivantes :
- Reprenez cet exemple et créez une page Web plus robuste ou ajoutez d'autres services au serveur Web.
- Apprenez-en plus sur les configurations ou les déploiements.
- Essayez de créer vos propres configurations.