Cette page explique comment utiliser NGINX en tant que proxy d'interface pour votre conteneur d'applications. Cela est utile si vous souhaitez traiter des requêtes ou des réponses. Vous pouvez ajouter la compression gzip, ou traduire HTTP/2 en HTTP/1 si vos conteneurs d'applications n'acceptent que HTTP/1 et que vous devez utiliser HTTP/2 de bout en bout pour des raisons de performances.
Dans l'exemple fourni sur cette page, un conteneur Nginx s'exécute sur chaque instance Cloud Run en tant que conteneur de diffusion principal, et il est configuré pour transférer les requêtes vers le conteneur d'applications, qui s'exécute en tant que conteneur side-car, comme illustré dans ce schéma :
Le moyen le plus efficace d'envoyer des données par proxy d'interface dans Cloud Run consiste à déployer le conteneur du serveur proxy Nginx et le conteneur de l'application Web en tant que service Cloud Run unique :
Ce service Cloud Run unique accepte les requêtes et les transmet au conteneur d'entrée (de diffusion), qui, dans ce cas, est le serveur proxy. Le serveur proxy envoie ensuite des requêtes à l'application Web via l'interface réseau localhost
, ce qui évite l'utilisation d'un réseau externe.
Le déploiement en tant que service Cloud Run unique réduit les latences, les coûts associés à la gestion du service et élimine l'exposition aux réseaux externes. Notez que Cloud Run n'interagit pas directement avec les conteneurs side-car, excepté pour les démarrer ou les arrêter à chaque démarrage ou arrêt du service.
Notez également que le conteneur de l'application Web et tous les conteneurs side-car peuvent être écrits dans différents langages de programmation. Pour obtenir un exemple écrit en PHP, consultez l'exemple nginx PHP dans GitHub.
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.
-
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 Cloud Run and Secret Manager APIs.
- Installez et initialisez gcloud CLI.
- Mettez à jour Google Cloud CLI :
gcloud components update
- Configurez la Google Cloud CLI :
gcloud init
- Authentifiez-vous avec la Google Cloud CLI :
gcloud auth login
Autorisations requises pour déployer
Vous devez disposer de l'un des rôles suivants :
- Les rôles Administrateur Cloud Run et Utilisateur du compte de service
- Tout rôle personnalisé incluant cette liste spécifique d'autorisations
Présentation de la configuration
Ces instructions utilisent des images de conteneur prédéfinies. La seule chose requise pour le proxy d'interface consiste à configurer les conteneurs et le service lui-même.
Configurer le conteneur d'entrée Nginx
L'image de conteneur est nginx
. Elle est disponible dans Docker Hub.
Elle est quasiment prête à être utilisée telle quelle, sauf qu'elle doit être configurée pour s'exécuter en tant que service proxy. Pour ce faire, transmettez les requêtes par proxy au port sur lequel le conteneur side-car écoute sur localhost
. L'exemple de cette page active également la compression gzip pour les requêtes et les réponses.
La configuration est fournie à l'aide d'un fichier texte installé dans /etc/nginx/conf.d/nginx.conf
. Étant donné que vous ne pouvez pas modifier directement les fichiers dans le conteneur, vous devez installer un volume dans /etc/nginx/conf.d/
qui contient le fichier de configuration. Pour installer un fichier à un emplacement spécifique dans un conteneur exécuté sur Cloud Run, vous pouvez stocker le contenu du fichier dans un secret Secret Manager et installer ce secret à l'emplacement souhaité. Le volume est chargé au moment de l'exécution.
Copiez le code suivant dans un fichier nommé nginx.conf
dans le répertoire actuel de votre machine locale.
Dans la configuration, procédez comme suit :
- Vous configurez
nginx
pour écouter le même port Cloud Run par défaut,8080
, situé surlocalhost
. - Vous appliquez la compression gzip pour améliorer les performances.
- Vous exigez via
proxy_pass
de transmettre toutes les requêtes adressées à ce conteneur d'entrée vers le conteneur side-car de l'application Web sur le port8888
de l'hôte local.
Créez un secret avec le contenu du fichier nginx.conf
.
Console
Accédez à la page Secret Manager dans la console Google Cloud :
Cliquez sur Créer un secret.
Dans le champ du formulaire
name
, saisissez nginx_config.Importez le fichier
nginx.conf
situé à l'emplacementmulti-container/hello-nginx-sample/nginx.conf
en tant que valeur du secret.Conservez les valeurs par défaut (
Google-managed encryption key, etc
).Cliquez sur Créer un secret.
Accordez au compte de service Compute du projet l'accès à ce nouveau code secret. Pour ce faire, accédez à la page IAM de la console Google Cloud :
Recherchez le compte de service principal nommé
Compute Engine default service account
, puis cliquez sur Modifier le compte principal.Cliquez sur Ajouter un autre rôle, puis sélectionnez Accesseur de secrets Secret Manager.
Cliquez sur Enregistrer.
gcloud
Dans un terminal, utilisez la commande suivante pour créer un secret
nginx_config
dans Secret Manager :gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'
Accordez au compte de service Compute du projet l'accès à ce nouveau code secret à l'aide de la commande suivante :
export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)') gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'
Vérifiez que votre secret a été créé en exécutant la commande
gcloud secrets list
.
À propos de l'exemple d'image side-car de l'application Web
Ces instructions utilisent l'exemple d'image de conteneur situé dans us-docker.pkg.dev/cloudrun/container/hello
. Vous devez spécifier le numéro de port sur lequel le conteneur écoutera et localhost
en tant qu'hôte, comme décrit sous Spécifier la configuration du conteneur side-car et les sections suivantes.
Configurer le service multiconteneur
Vous pouvez utiliser la console Google Cloud ou le fichier YAML Cloud Run pour configurer un service Cloud Run avec plusieurs conteneurs.
Dans la configuration du service, vous devez spécifier le serveur proxy Nginx en tant que conteneur d'entrée (de diffusion), ainsi que le port sur lequel il écoutera, s'il accepte les requêtes HTTP 1 ou HTTP 2, ainsi que l'ordre de démarrage des conteneurs. Le conteneur d'entrée (serveur proxy) dépend du side-car de l'application Web. Par conséquent, celui-ci doit être démarré en premier.
Ces configurations sont décrites dans les sections suivantes.
Ajouter des métadonnées YAML
Console
Accédez à Déployer le service pour obtenir des instructions complètes sur la console.
YAML
Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :
gcloud run services describe SERVICE --format export > service.yaml
Dans
service.yaml
, ajoutez les éléments suivants :
Cette section décrit la révision du service, qui inclut des propriétés susceptibles de varier d'une révision à l'autre.
Spécifier l'ordre de démarrage du conteneur
Console
Accédez à Déployer le service pour obtenir des instructions complètes sur la console.
YAML
Dans service.yaml
, ajoutez les éléments suivants :
Notez l'annotation container-dependencies
qui indique à Cloud Run d'attendre que le conteneur hello démarre avant de démarrer le conteneur nginx. Sinon, si le conteneur nginx démarre en premier, il pourrait tenter d'envoyer une requête Web par proxy au conteneur de l'application Web qui n'est pas prêt, ce qui générerait des réponses d'erreur Web.
Chaque conteneur peut éventuellement avoir une propriété de nom définie, qui peut être utilisée pour y faire référence dans d'autres instructions.
Le conteneur de diffusion exécute le serveur proxy nommé nginx
. Il s'agit du conteneur vers lequel Cloud Run envoie les requêtes entrantes. Vous devez donc spécifier la version de HTTP
et le port du conteneur vers lequel les distribuer.
Spécifier la configuration du conteneur de diffusion
Console
Accédez à Déployer le service pour obtenir des instructions complètes sur la console.
YAML
Dans le fichier service.yaml
, ajoutez les éléments suivants :
Le serveur nginx
requiert un fichier de configuration dans le répertoire /etc/nginx/conf.d/
. Pour ce faire, installez un volume contenant le fichier à cet emplacement. La section volumeMount
spécifie un volume appelé configuration
à placer là. Le volume lui-même est défini dans sa propre section plus tard dans le fichier.
Spécifier la configuration du conteneur side-car
Console
Accédez à Déployer le service pour obtenir des instructions complètes sur la console.
YAML
Dans service.yaml
, ajoutez les éléments suivants :
L'application hello
a également besoin d'informations concernant la configuration. Elle écoute les requêtes entrantes sur le port spécifié dans la variable d'environnement PORT
. Ce nom et cette valeur sont spécifiés dans la section env
.
Spécifier le volume secret
Console
Accédez à Déployer le service pour obtenir des instructions complètes sur la console.
YAML
Dans le fichier service.yaml
, ajoutez les éléments suivants :
Spécifiez la configuration du volume
installé dans la section volumeMount
. Elle contient un seul fichier nommé nginx.conf
dont le contenu est défini comme la valeur du secret nommé nginx-conf-secret
.
Déployer le service
Console
Accédez à la page Cloud Run de la console Google Cloud.
Cliquez sur Déployer le conteneur, puis sélectionnez Service pour afficher le formulaire Créer un service.
- Sélectionnez Déployer une révision à partir d'une image de conteneur existante, puis saisissez
nginx
comme URL de l'image de conteneur. - Dans le champ Nom du service, indiquez un nom pour votre service. Par exemple,
hello-mc
. - Dans la liste Région, sélectionnez un emplacement dans lequel effectuer le déploiement. Par exemple,
us-west1
. - Sous Authentification, sélectionnez
Allow unauthenticated invocations
.
- Sélectionnez Déployer une révision à partir d'une image de conteneur existante, puis saisissez
Cliquez sur Conteneur(s), volumes, mise en réseau, sécurité pour développer le formulaire de configuration.
- Cliquez sur l'onglet Volumes.
- Cliquez sur Ajouter un volume.
- Dans la liste Type de volume, sélectionnez Secret.
- Dans le champ Nom du volume, saisissez
nginx-conf-secret
. - Dans le champ Secret, saisissez nginx_config.
- Sous Chemins spécifiés pour les versions des secrets, spécifiez default.conf comme chemin d'accès et la plus récente pour la version.
- Cliquez sur Créer pour créer le volume secret.
Cliquez sur l'onglet Conteneurs pour afficher le formulaire Modifier le conteneur.
- Cliquez sur Paramètres puis, sous Ressources, redéfinissez la mémoire sur 256Mio et le processeur sur 1 CPU.
- Cliquez sur Installations de volume.
- Cliquez sur Monter le volume.
- Sélectionnez nginx-conf-secret dans la liste des noms.
- Dans le champ Chemin d'installation, saisissez etc/nginx/conf.d.
- Cliquez sur Terminé pour terminer la configuration du premier conteneur.
Cliquez sur Ajouter un conteneur pour ajouter le conteneur side-car et afficher le formulaire Nouveau conteneur.
- Sélectionnez l'URL de l'image de conteneur par défaut us-docker.pkg.dev/cloudrun/container/hello.
- Cliquez sur l'onglet Paramètres puis, sous Ressources, redéfinissez la mémoire sur 256Mio et le processeur sur 1 CPU.
- Cliquez sur Variables et secrets.
- Cliquez sur Ajouter une variable.
- Saisissez PORT comme nom de la nouvelle variable d'environnement et PORT comme valeur.
- Cliquez sur OK.
Accédez au formulaire Modifier le conteneur du premier conteneur (
nginx
).- Cliquez sur l'onglet Paramètres.
- Sous Ordre de démarrage du conteneur, sélectionnez
nginx
dans la liste Dépend de. Cela signifie que le conteneurnginx
ne démarre qu'après le démarrage réussi du conteneurhello
. - Cliquez sur Créer et attendez que votre service soit déployé.
gcloud
Pour déployer le conteneur de serveur proxy et le conteneur de l'application Web en tant que service unique, procédez comme suit :
gcloud run services replace service.yaml
Vérifier le service déployé
gcloud
Pour vérifier que le déploiement a abouti, copiez l'URL Cloud Run générée et ouvrez-la dans un navigateur, ou exécutez cette commande pour envoyer une requête authentifiée :
curl --header "Authorization: Bearer $(gcloud auth print-identity-token)"
Vous devriez recevoir un proxy nginx transféré avec succès vers le conteneur side-car hello avec l'état de réponse 200
.
Essayer vous-même
Pour suivre ce tutoriel :
gcloud
Dans un terminal, clonez le dépôt de l'exemple d'application sur votre machine locale :
git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
Accédez au répertoire contenant l'exemple de code Cloud Run :
cd cloud-run-samples/multi-container/hello-nginx-sample/
Étapes suivantes
Pour en savoir plus sur l'utilisation des side-cars dans un service Cloud Run :
- Les side-cars Cloud Run permettent d'utiliser des modèles multiconteneurs avancés
- Déployer sur Cloud Run