Proxy d'interface à l'aide de Nginx

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 service 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 :

Cloud Run mc hello nginx 1

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 :

Cloud Run mc hello nginx 2

Ce service Cloud Run unique accepte les requêtes et les transmet au conteneur (de service) d'entrée, 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

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure 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.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Run and Secret Manager APIs.

    Enable the APIs

  7. Installez et initialisez gcloud CLI.
  8. Mettez à jour Google Cloud CLI : gcloud components update
  9. Configurez Google Cloud CLI : gcloud init
  10. Authentifiez-vous avec Google Cloud CLI : gcloud auth login

Autorisations requises pour déployer

Vous devez disposer de l'un des rôles suivants :

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 sélectionné.

Copiez le code suivant dans un fichier nommé nginx.conf dans le répertoire actuel de votre machine locale.


server {
    # Listen at port 8080
    listen 8080; 
    # Server at localhost
    server_name _;
    # Enables gzip compression to make our app faster
    gzip on;

    location / {
        # Passes initial requests to port 8080 to `hello` container at port 8888
        proxy_pass   http://127.0.0.1:8888;
    }
}

Dans la configuration, procédez comme suit :

  • Vous configurez nginx pour écouter le même port Cloud Run par défaut, 8080, situé sur localhost.
  • 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 port 8888 de l'hôte local.

Créez un secret avec le contenu du fichier nginx.conf.

Console

  1. Accédez à la page Secret Manager dans la console Google Cloud :

    Accéder à Secret Manager

  2. Cliquez sur Créer un secret.

  3. Dans le champ du formulaire name, saisissez nginx_config.

  4. Importez le fichier nginx.conf situé à l'emplacement multi-container/hello-nginx-sample/nginx.conf en tant que valeur du secret.

  5. Conservez les valeurs par défaut (Google-managed encryption key, etc).

  6. Cliquez sur Créer un secret.

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

    Accéder à IAM

  8. Recherchez le compte de service principal nommé Compute Engine default service account, puis cliquez sur Modifier le compte principal.

  9. Cliquez sur Ajouter un autre rôle, puis sélectionnez Accesseur de secrets Secret Manager.

  10. Cliquez sur Enregistrer.

gcloud

  1. 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'

  2. 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'

  3. 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 (de service) d'entrée, 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

  1. 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
  2. Dans service.yaml, ajoutez les éléments suivants :

    metadata:
      name: "MC_SERVICE_NAME"
      labels:
        cloud.googleapis.com/location: "REGION"
      annotations:
        # Required to use Cloud Run multi-containers (preview feature)
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/description: sample tutorial service
        # Externally available
        run.googleapis.com/ingress: all

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 :

spec:
  template:
    metadata:
      annotations:
        # Defines container startup order within multi-container service.
        # Below requires hello container to spin up before nginx container,
        # which depends on the hello container.
        # https://cloud.google.com/run/docs/configuring/containers#container-ordering
        run.googleapis.com/container-dependencies: "{nginx: [hello]}"

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 service 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 service

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 :

spec:
  containers:
    # A) Serving ingress container "nginx" listening at PORT 8080
    # Main entrypoint of multi-container service.
    # Source is stored in nginx_config secret in Secret Manager.
    # Any pings to this container will proxy over to hello container at PORT 8888.
    # https://cloud.google.com/run/docs/container-contract#port
    - image: nginx
      name: nginx
      ports:
        - name: http1
          containerPort: 8080
      resources:
        limits:
          cpu: 500m
          memory: 256Mi
      # Referencing declared volume below,
      # Declaring volume to mount in current ingress container's filesystem
      # https://cloud.google.com/run/docs/reference/rest/v2/Container#volumemount
      volumeMounts:
        - name: nginx-conf-secret
          readOnly: true
          mountPath: /etc/nginx/conf.d/
      startupProbe:
        timeoutSeconds: 240
        periodSeconds: 240
        failureThreshold: 1
        tcpSocket:
          port: 8080

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 :

- image: us-docker.pkg.dev/cloudrun/container/hello
  name: hello
  env:
    - name: PORT
      value: "8888"
  resources:
    limits:
      cpu: 1000m
      memory: 512Mi
  startupProbe:
    timeoutSeconds: 240
    periodSeconds: 240
    failureThreshold: 1
    tcpSocket:
      port: 8888

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 :

volumes:
  - name: nginx-conf-secret
    secret:
      secretName: nginx_config
      items:
        - key: latest
          path: default.conf

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

  1. Accédez à la page Cloud Run de la console Google Cloud.

    Accédez à Cloud Run

  2. Cliquez sur Créer un conteneur et sélectionnez Service pour afficher le formulaire Créer un service.

    1. Sélectionnez Déployer une révision à partir d'une image de conteneur existante, puis saisissez nginx comme URL de l'image de conteneur.
    2. Dans le champ Nom du service, indiquez un nom pour votre service. Par exemple, hello-mc.
    3. Dans la liste Région, sélectionnez un emplacement dans lequel effectuer le déploiement. Par exemple, us-west1.
    4. Sous Authentification, sélectionnez Allow unauthenticated invocations. Si vous ne disposez pas des autorisations nécessaires (rôle Administrateur Cloud Run) pour sélectionner cette option, le service sera déployé et nécessitera une authentification.
  3. Cliquez sur Conteneur(s), volumes, mise en réseau, sécurité pour développer le formulaire de configuration.

    1. Cliquez sur l'onglet Volumes.
    2. Cliquez sur Ajouter un volume.
    3. Dans la liste Type de volume, sélectionnez Secret.
    4. Dans le champ Nom du volume, saisissez nginx-conf-secret.
    5. Dans le champ Secret, saisissez nginx_config.
    6. 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.
    7. Cliquez sur Créer pour créer le volume secret.
  4. Cliquez sur l'onglet Conteneurs pour afficher le formulaire Modifier le conteneur.

    1. Cliquez sur Paramètres puis, sous Ressources, redéfinissez la mémoire sur 256Mio et le processeur sur 1 CPU.
    2. Cliquez sur Installations de volume.
    3. Cliquez sur Installer un volume.
    4. Sélectionnez nginx-conf-secret dans la liste des noms.
    5. Dans le champ Chemin d'installation, saisissez etc/nginx/conf.d.
    6. Cliquez sur Terminé pour terminer la configuration du premier conteneur.
  5. Cliquez sur Ajouter un conteneur pour ajouter le conteneur side-car et afficher le formulaire Nouveau conteneur.

    1. Sélectionnez l'URL de l'image de conteneur par défaut us-docker.pkg.dev/cloudrun/container/hello.
    2. Cliquez sur l'onglet Paramètres puis, sous Ressources, redéfinissez la mémoire sur 256Mio et le processeur sur 1 CPU.
    3. Cliquez sur Variables et secrets.
    4. Cliquez sur Ajouter une variable.
    5. Saisissez PORT comme nom de la nouvelle variable d'environnement et 8888 comme valeur.
    6. Cliquez sur OK.
  6. Accédez au formulaire Modifier le conteneur du premier conteneur (nginx).

    1. Cliquez sur l'onglet Paramètres.
    2. Sous Ordre de démarrage du conteneur, sélectionnez nginx dans la liste Dépend de. Cela signifie que le conteneur nginx ne démarre qu'après le démarrage réussi du conteneur hello.
    3. 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

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

  2. 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 :