Ce tutoriel explique comment créer un service Knative serving personnalisé qui transforme un paramètre d'entrée de description de graphe en un schéma au format d'image PNG
. Il utilise l'outil de visualisation Graphviz, qui est installé en tant que package système dans l'environnement de conteneur du service.
Graphviz est accessible via les utilitaires de ligne de commande pour le traitement des requêtes.
Objectifs
- Écrire et créer un conteneur personnalisé avec un fichier Dockerfile.
- Écrire, créer et déployer un service Knative serving
- Utiliser l'utilitaire Graphviz dot pour générer des diagrammes.
- Tester le service en publiant un schéma dans la syntaxe DOT à partir de la collection ou de votre création.
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.
Avant de commencer
- Dans ce tutoriel, nous partons du principe que Knative serving est installé et configuré sur votre cluster.
- Assurez-vous que votre environnement de ligne de commande est configuré et que les outils sont à jour.
Récupérer l'exemple de code
Pour récupérer l’exemple de code à utiliser, procédez comme suit :
Clonez le dépôt de l'exemple d'application sur votre machine locale :
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.
Accédez au répertoire contenant l'exemple de code Knative serving :
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
Visualiser l'architecture
L'architecture de base est semblable à ceci :
L'utilisateur adresse une requête HTTP au service Knative serving, lequel exécute un utilitaire Graphviz pour transformer la requête en image. Cette image est transmise à l'utilisateur sous forme de réponse HTTP.
Comprendre le code
Définir la configuration de votre environnement avec le fichier Dockerfile
Le fichier Dockerfile
est spécifique au langage et à l'environnement d'exploitation de base que votre service utilisera, par exemple Ubuntu.
Ce service nécessite un ou plusieurs packages système supplémentaires qui ne sont pas disponibles par défaut.
Ouvrez le fichier
Dockerfile
dans un éditeur.Recherchez une instruction
Dockerfile
RUN
. Cette instruction permet d'exécuter des commandes de shell arbitraires pour modifier l'environnement. Si le fichierDockerfile
comporte plusieurs étapes, identifiées par plusieurs instructionsFROM
, vous le trouverez à la dernière étape.Les packages spécifiques requis et le mécanisme pour les installer varient en fonction du système d'exploitation déclaré dans le conteneur.
Pour obtenir les instructions relatives à votre système d'exploitation ou à votre image de base, cliquez sur l'onglet correspondant.
Debian/Ubuntu Alpine Alpine nécessite un deuxième package pour la prise en charge des polices.Pour déterminer le système d'exploitation de votre image de conteneur, vérifiez le nom dans l'instruction
FROM
ou dans un fichier README associé à votre image de base. Par exemple, en cas d'extension depuisnode
, vous trouverez la documentation et le fichierDockerfile
parent sur Docker Hub.Créez l'image pour tester votre personnalisation, en utilisant
docker build
localement ou Cloud Build.
Traiter les requêtes entrantes
L'exemple de service utilise les paramètres de la requête HTTP entrante pour effectuer un appel système qui exécute la commande appropriée de l'utilitaire dot
.
Dans le gestionnaire HTTP ci-dessous, un paramètre d'entrée de description de graphe est extrait de la variable de chaîne de requête dot
.
Les descriptions de graphe peuvent inclure des caractères qui doivent être encodés au format URL pour pouvoir être utilisés dans une chaîne de requête.
Node.js
Python
Go
Java
Vous devrez faire la distinction entre les erreurs de serveur internes et les entrées utilisateur non valides. Cet exemple de service renvoie une erreur de serveur interne pour toutes les erreurs de ligne de commande dot, sauf si le message d'erreur contient la chaîne syntax
, ce qui indique un problème de saisie de la part de l'utilisateur.
Générer un schéma
La logique de base de la génération de schéma utilise l'outil de ligne de commande dot pour traiter le paramètre d'entrée de description de graphe dans un schéma au format d'image PNG.
Node.js
Python
Go
Java
Concevoir un service sécurisé
Toutes les failles de l'outil dot
constituent des failles potentielles du service Web. Pour réduire ces risques, utilisez des versions à jour du package graphviz
en recréant régulièrement l'image de conteneur.
Si vous étendez l'exemple actuel pour accepter les entrées utilisateur en tant que paramètres de ligne de commande, vous devez fournir une protection contre les attaques par injection de commande. Des moyens existent pour prévenir les attaques par injection, parmi lesquels :
- Mapper les entrées dans un dictionnaire de paramètres compatibles.
- Valider les entrées correspondant à une plage de valeurs connues, en utilisant éventuellement des expressions régulières.
- Échapper les entrées pour s'assurer que la syntaxe du shell n'est pas évaluée.
Transmettre le code
Pour transmettre votre code, créez-le avec Cloud Build, importez-le dans Container Registry, puis déployez-le dans Knative serving :
Exécutez la commande suivante pour créer votre conteneur et publier sur Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID correspond à votre ID de projet Google Cloud et
graphviz
au nom que vous souhaitez attribuer à votre service.En cas de réussite, un message SUCCESS apparaît contenant l'ID, l'heure de création et le nom de l'image. Celle-ci est stockée dans Container Registry et peut être réutilisée au besoin.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID correspond à votre ID de projet Google Cloud et
graphviz
au nom que vous souhaitez attribuer à votre service.En cas de réussite, un message SUCCESS apparaît contenant l'ID, l'heure de création et le nom de l'image. Celle-ci est stockée dans Container Registry et peut être réutilisée au besoin.
Accéder
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID correspond à votre ID de projet Google Cloud et
graphviz
au nom que vous souhaitez attribuer à votre service.En cas de réussite, un message SUCCESS apparaît contenant l'ID, l'heure de création et le nom de l'image. Celle-ci est stockée dans Container Registry et peut être réutilisée au besoin.
Java
Cet exemple utilise Jib pour créer des images Docker à l'aide d'outils Java courants. Jib optimise les builds de conteneurs sans requérir de fichier Dockerfile ni d'installation Docker. Découvrez comment créer des conteneurs Java avec Jib.À l'aide du fichier Dockerfile, configurez et créez une image de base avec les packages système installés pour remplacer l'image de base par défaut de Jib :
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
où PROJECT_ID correspond à l’ID de votre projet Google Cloud.
Créez votre conteneur final avec Jib et publiez-le sur Container Registry :
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base
où PROJECT_ID correspond à l’ID de votre projet Google Cloud.
Utilisez la commande suivante pour effectuer le déploiement :
gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz
Où PROJECT_ID correspond à l'ID du projet Google Cloud,
graphviz
correspond au nom du conteneur ci-dessus etgraphviz-web
correspond au nom du service.Patientez jusqu'à la fin du déploiement, soit environ 30 secondes.
Si vous souhaitez déployer une mise à jour de code sur le service, répétez les opérations précédentes. Chaque déploiement sur un service crée une nouvelle révision et commence automatiquement à acheminer le trafic une fois prêt.
Essayer
Testez votre service en envoyant des requêtes HTTP POST
contenant des descriptions de syntaxe DOT dans la charge utile de la requête.
Envoyez une requête HTTP à votre service.
Le schéma peut être intégré dans une page Web :
-
Pour obtenir l'adresse IP externe de l'équilibreur de charge, exécutez la commande suivante :
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Remplacez ASM-INGRESS-NAMESPACE par l'espace de noms où se trouve votre entrée Cloud Service Mesh. Spécifiez
istio-system
si vous avez installé Cloud Service Mesh à l'aide de sa configuration par défaut.La sortie ressemble à ceci :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
où la valeur EXTERNAL-IP est votre adresse IP externe de l'équilibreur de charge.
Exécutez une commande curl en utilisant cette adresse
EXTERNAL-IP
dans l'URL : N'incluez pas le protocole (par exemple,http://
) dansSERVICE_DOMAIN
.curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
-
Ouvrez le fichier
diagram.png
obtenu dans une application compatible avec les fichiersPNG
, telle que Chrome.Elle devrait se présenter comme ceci :
Vous pouvez explorer une petite collection de descriptions de schéma prêtes à l'emploi.
- Copiez le contenu du fichier
.dot
sélectionné. Collez-le dans une commande
curl
:curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
Effectuer un nettoyage
Vous pouvez supprimer les ressources créées pour ce tutoriel afin d'éviter que des frais ne vous soient facturés.
Supprimer les ressources du tutoriel
Supprimez le service Knative serving que vous avez déployé dans ce tutoriel :
gcloud run services delete SERVICE-NAME
Où SERVICE-NAME est le nom de service que vous avez choisi.
Vous pouvez également supprimer les services Knative serving à partir de la console Google Cloud.
Supprimez les configurations gcloud par défaut que vous avez ajoutées lors de la configuration du tutoriel :
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
Supprimez la configuration du projet :
gcloud config unset project
Supprimez les autres ressources Google Cloud créées dans ce tutoriel :
- Supprimez l'image de conteneur nommée
gcr.io/<var>PROJECT_ID</var>/graphviz
de Container Registry. - Si vous avez créé un cluster pour ce tutoriel, supprimez-le.
- Supprimez l'image de conteneur nommée
Étape suivante
- Testez votre application graphviz :
- Assurez la compatibilité pour d'autres utilitaires graphviz appliquant différents algorithmes pour générer les schémas.
- Enregistrez les schémas dans Cloud Storage. Voulez-vous enregistrer l'image ou la syntaxe DOT ?
- Ajoutez une protection contre les contenus abusifs avec l'API Cloud Natural Language.
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.