1. Présentation
Introduction
Dans cet atelier de programmation, vous allez apprendre à déployer un service Cloud Run qui utilise plusieurs conteneurs. Vous allez créer une application Node.js qui sera utilisée comme conteneur d'entrée Cloud Run et une application Node.js supplémentaire qui sera utilisée comme side-car.
Présentation technique
Lorsque vous utilisez plusieurs conteneurs dans une instance Cloud Run, l'un d'eux est utilisé comme conteneur principal pour l'entrée Web. Ces conteneurs supplémentaires sont appelés "sidecars".
Il existe deux façons pour plusieurs conteneurs de communiquer entre eux :
- Les conteneurs partagent l'interface réseau localhost. Tous les conteneurs peuvent donc écouter un port, par exemple localhost:port.
- Vous pouvez également utiliser des volumes en mémoire et les monter sur les conteneurs pour partager des fichiers.
Cas d'utilisation
Étant donné que tous les conteneurs de l'instance Cloud Run partagent l'interface réseau localhost, vous pouvez utiliser un side-car devant votre conteneur principal pour transférer les requêtes. Ces proxys peuvent fournir une couche d'abstraction supplémentaire pour un flux de trafic plus efficace vers l'application entre le client et les serveurs en interceptant les requêtes et en les transmettant au point de terminaison approprié. Par exemple, vous pouvez utiliser l'image Nginx officielle de DockerHub (comme indiqué ici).
Étant donné que plusieurs conteneurs peuvent communiquer en partageant des fichiers via des volumes partagés, vous ajoutez différentes applications side-car à votre service. Par exemple, vous pouvez instrumenter votre service Cloud Run pour qu'il utilise des agents personnalisés tels qu'OpenTelemetry afin d'exporter des journaux, des métriques et des traces (exemple OpenTelemetry). Vous pouvez également utiliser un side-car pour vous connecter à une base de données Cloud Spanner PostgreSQL (exemple Cloud Spanner Postgress).
Exemples dans cet atelier de programmation
Dans cet atelier de programmation, vous allez d'abord déployer un service Cloud Run dont le conteneur d'entrée communique avec un side-car via un port localhost. Vous allez ensuite mettre à jour le conteneur d'entrée et le side-car pour partager un fichier via un montage de volume.
Points abordés
- Créer un conteneur qui utilise un side-car
- Comment un conteneur d'entrée peut communiquer avec un side-car à l'aide de localhost
- Comment un conteneur d'entrée et un side-car peuvent partager un fichier via un volume installé
2. Préparation
Prérequis
- Vous êtes connecté à la console Cloud.
- Vous avez déjà déployé un service Cloud Run. Par exemple, vous pouvez suivre le guide de démarrage rapide pour déployer un service Web à partir du code source pour commencer.
Activer Cloud Shell
- Dans Cloud Console, cliquez sur Activer Cloud Shell
.

Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire s'affiche pour vous expliquer de quoi il s'agit. Si cet écran s'est affiché, cliquez sur Continuer.

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un navigateur.
Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est défini avec votre ID de projet.
- Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
Résultat de la commande
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet :
gcloud config list project
Résultat de la commande
[core] project = <PROJECT_ID>
Si vous obtenez un résultat différent, exécutez cette commande :
gcloud config set project <PROJECT_ID>
Résultat de la commande
Updated property [core/project].
3. Créer l'application d'entrée
Définir des variables d'environnement
Dans cet atelier de programmation, vous allez créer quelques variables d'environnement pour améliorer la lisibilité des commandes gcloud utilisées.
REGION=<YOUR-REGION> PROJECT_ID=<YOUR-PROJECT-ID> SERVICE_NAME=sidecar-codelab REPO_NAME=sidecar-codelab
Créez un dépôt Artifact Registry pour stocker vos images de conteneurs.
Vous pouvez créer un dépôt dans Artifact Registry pour stocker vos images de conteneurs pour cet atelier de programmation.
gcloud artifacts repositories create $REPO_NAME --repository-format=docker \ --location=$REGION --description="sidecar codelab"
Créez ensuite un fichier package.json avec le contenu suivant :
{
"name": "sidecar-codelab",
"version": "1.0.0",
"private": true,
"description": "demonstrates how to use sidecars in cloud run",
"main": "index.js",
"author": "Google LLC",
"license": "Apache-2.0",
"scripts": {
"start": "node ingress.js"
},
"dependencies": {
"axios": "^1.6.2",
"express": "^4.18.2"
}
}
Créez ensuite un fichier nommé ingress.js avec le contenu suivant :
const express = require('express');
const app = express();
const axios = require("axios");
app.get('/', async (req, res) => {
let response = await axios.get("http://localhost:5000");
res.send("The sidecar says: " + response.data);
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
console.log(`Ingress container listening on port ${port}`);
});
Créer un fichier Dockerfile pour le conteneur d'entrée
FROM node:20.10.0-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --production # Copy local code to the container image. COPY . . # Run the web service on container startup. ENV PORT=8080 CMD [ "npm", "start" ]
Créez un fichier ``.dockerignore`` pour le conteneur d'entrée.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Vous pouvez maintenant créer l'image de votre conteneur d'entrée en exécutant la commande suivante :
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
4. Créer l'application side-car
Dans cette section, vous allez créer une deuxième application Node.js qui sera utilisée comme side-car dans le service Cloud Run.
Accédez au répertoire sidecar.
cd ../sidecar
Créez un fichier package.json avec le contenu suivant :
{
"name": "sidecar-codelab",
"version": "1.0.0",
"private": true,
"description": "demonstrates how to use sidecars in cloud run",
"main": "index.js",
"author": "Google LLC",
"license": "Apache-2.0",
"scripts": {
"start": "node sidecar.js"
},
"dependencies": {
"axios": "^1.6.2",
"express": "^4.18.2"
}
}
Créez ensuite un fichier nommé sidecar.js avec le contenu suivant :
const express = require('express');
const app = express();
app.get('/', async (req, res) => {
res.send("Hello ingress container! I'm the sidecar.");
});
const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
console.log(`Sidecar container listening on port ${port}`);
});
Créer un Dockerfile pour le conteneur side-car
FROM node:20.10.0-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --production # Copy local code to the container image. COPY . . # Run the web service on container startup. ENV PORT=5000 CMD [ "npm", "start" ]
Créez un fichier ".dockerignore" pour le conteneur side-car.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Vous pouvez maintenant créer l'image de votre conteneur d'entrée en exécutant la commande suivante :
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Déployer le service Cloud Run
Vous allez déployer le service Cloud Run à l'aide d'un fichier YAML.
Accédez au répertoire parent.
cd ..
Créez un fichier nommé sidecar-codelab.yaml avec le contenu suivant :
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
annotations:
name: sidecar-codelab
labels:
cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
template:
spec:
containers:
- image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
ports:
- containerPort: 8080
- image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
env:
- name: PORT
value: "5000"
Déployez ensuite le service à l'aide de la commande suivante. Vous devez utiliser gcloud beta, car les montages de volumes sont disponibles en version bêta publique.
gcloud beta run services replace sidecar-codelab.yaml
Une fois le service déployé, enregistrez son URL dans une variable d'environnement.
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)')
5. Appeler le service Cloud Run
Vous pouvez désormais appeler votre service en fournissant votre jeton d'identité.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Vos résultats devraient ressembler à l'exemple de résultat ci-dessous :
The sidecar says: Hello ingress container! I'm the sidecar.
6. Partager un fichier via l'installation d'un volume
Dans cette section, vous allez mettre à jour les conteneurs pour partager un fichier via un montage de volume. Dans cet exemple, le conteneur d'entrée écrit dans un fichier sur un volume partagé. Le side-car lit le fichier et renvoie son contenu au conteneur d'entrée.
Vous allez d'abord mettre à jour le code du conteneur d'entrée. Accédez au répertoire d'entrée.
cd ../ingress
Remplacez ensuite le contenu du fichier ingress.js par le code suivant :
const express = require('express');
const app = express();
const fs = require('fs');
const axios = require("axios");
const filename = "test.txt"
let path = "/my-volume-mount";
app.use(path, express.static(path));
try {
fs.writeFileSync(`${path}/${filename}`, "The ingress container created this file.");
} catch (err) {
console.error(err);
}
app.get('/', async (req, res) => {
let response = await axios.get("http://localhost:5000");
res.send("The sidecar says: " + response.data);
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
console.log(`Ingress container listening on port ${port}`);
});
Créez ensuite la nouvelle image pour votre conteneur d'entrée en exécutant la commande suivante :
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
Accédez maintenant au répertoire sidecar :
cd ../sidecar
Mettez à jour sidecar.js avec le contenu suivant :
const express = require('express');
const app = express();
const fs = require('fs');
const filename = "test.txt"
let path = "/my-volume-mount";
app.use(path, express.static(path));
async function readFile() {
try {
return await fs.readFileSync(`${path}/${filename}`, { encoding: 'utf8' });
} catch (err) {
console.log(err);
}
}
app.get('/', async (req, res) => {
let contents = await readFile();
res.send(contents);
});
const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
console.log(`Sidecar container listening on port ${port}`);
});
Créez ensuite la nouvelle image pour votre conteneur side-car en exécutant la commande suivante :
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Mettez à jour sidecar-codelab.yaml avec les éléments suivants pour partager un volume :
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
annotations:
name: sidecar-codelab
labels:
cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
template:
spec:
containers:
- image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /my-volume-mount
name: in-memory-1
- image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
env:
- name: PORT
value: "5000"
volumeMounts:
- mountPath: /my-volume-mount
name: in-memory-1
volumes:
- emptyDir:
medium: Memory
name: in-memory-1
Déployer le fichier sidecar-codelab.yaml mis à jour
gcloud beta run services replace sidecar-codelab.yaml
Vous pouvez désormais appeler votre service en fournissant votre jeton d'identité.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Vos résultats devraient ressembler à l'exemple de résultat ci-dessous :
The sidecar says: the ingress container created this file.
7. Félicitations !
Bravo ! Vous avez terminé cet atelier de programmation.
Nous vous recommandons de consulter la documentation sur Cloud Run, en particulier sur le déploiement de multiconteneurs et l'utilisation d'installations de volume en mémoire.
Points abordés
- Créer un conteneur qui utilise un side-car
- Comment un conteneur d'entrée peut communiquer avec un side-car à l'aide de localhost
- Comment un conteneur d'entrée et un side-car peuvent-ils partager un volume installé ?
8. Effectuer un nettoyage
Pour éviter des frais involontaires (par exemple, si cette fonction Cloud est invoquée par inadvertance plus de fois que votre allocation mensuelle d'invocations Cloud Run dans le niveau sans frais), vous pouvez supprimer le service Cloud Run ou le projet que vous avez créé à l'étape 2.
Pour supprimer la fonction Cloud Functions, accédez à la console Cloud Functions à l'adresse https://console.cloud.google.com/run/, puis supprimez le service sidecar-codelab (ou $SERVICE_NAME si vous avez utilisé un autre nom).
Si vous choisissez de supprimer l'intégralité du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir "Supprimer". Si vous supprimez le projet, vous devrez changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.