1. Descripción general
Introducción
En este codelab, aprenderás a implementar un servicio de Cloud Run que usa varios contenedores. Crearás una app de Node.js que se usará como contenedor de entrada de Cloud Run y otra app de Node.js que se usará como sidecar.
Descripción técnica general
Cuando se usan varios contenedores dentro de una instancia de Cloud Run, uno de ellos se usa como el contenedor principal para la entrada web. Los uno o más contenedores adicionales se conocen como sidecars.
Existen dos formas en que varios contenedores pueden comunicarse entre sí:
- Los contenedores comparten la interfaz de red localhost, por lo que todos los contenedores pueden escuchar un puerto, p.ej., localhost:puerto.
- También puedes usar volúmenes en memoria y montarlos en los contenedores para compartir archivos.
Casos de uso
Dado que todos los contenedores dentro de la instancia de Cloud Run comparten la interfaz de red localhost, puedes usar un sidecar delante de tu contenedor principal para redireccionar solicitudes. Estos proxies pueden proporcionar una capa adicional de abstracción para un flujo de tráfico más eficiente hacia la aplicación entre el cliente y los servidores, ya que interceptan las solicitudes y las reenvían al extremo adecuado. Por ejemplo, puedes usar la imagen oficial de Nginx de DockerHub (como se muestra aquí).
Dado que varios contenedores pueden comunicarse compartiendo archivos a través de volúmenes compartidos, puedes agregar varias aplicaciones de sidecar a tu servicio. Por ejemplo, puedes instrumentar tu servicio de Cloud Run para que use agentes personalizados, como OpenTelemetry, para exportar registros, métricas y seguimientos (ejemplo de OpenTelemetry). Otro ejemplo es usar un sidecar para conectarse a una base de datos de PostgreSQL de Cloud Spanner (ejemplo de Cloud Spanner PostgreSQL).
Ejemplos en este codelab
En este codelab, primero implementarás un servicio de Cloud Run en el que su contenedor de entrada se comunica con un sidecar a través de un puerto localhost. Luego, actualizarás el contenedor de entrada y el sidecar para compartir un archivo a través de un volumen activado.
Qué aprenderás
- Cómo crear un contenedor que usa un sidecar
- Cómo un contenedor de entrada puede comunicarse con un sidecar usando localhost
- Cómo un contenedor de entrada y un sidecar pueden compartir un archivo a través de un volumen activado
2. Configuración y requisitos
Requisitos previos
- Accediste a la consola de Cloud.
- Ya implementaste un servicio de Cloud Run. Por ejemplo, puedes seguir la guía de inicio rápido para implementar un servicio web a partir del código fuente para comenzar.
Activar Cloud Shell
- En la consola de Cloud, haz clic en Activar Cloud Shell
.

Si es la primera vez que inicias Cloud Shell, aparecerá una pantalla intermedia en la que se describirá qué es. Si apareció una pantalla intermedia, haz clic en Continuar.

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer con un navegador.
Una vez que te conectes a Cloud Shell, deberías ver que te autenticaste y que el proyecto se configuró con tu ID del proyecto.
- En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list
Resultado del comando
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto:
gcloud config list project
Resultado del comando
[core] project = <PROJECT_ID>
De lo contrario, puedes configurarlo con el siguiente comando:
gcloud config set project <PROJECT_ID>
Resultado del comando
Updated property [core/project].
3. Crea la app de entrada
Configura variables de entorno
En este codelab, crearás algunas variables de entorno para mejorar la legibilidad de los comandos de gcloud que se usan en este codelab.
REGION=<YOUR-REGION> PROJECT_ID=<YOUR-PROJECT-ID> SERVICE_NAME=sidecar-codelab REPO_NAME=sidecar-codelab
Crea un repositorio de Artifact Registry para almacenar tus imágenes de contenedor
Puedes crear un repositorio en Artifact Registry para almacenar tus imágenes de contenedor para este codelab.
gcloud artifacts repositories create $REPO_NAME --repository-format=docker \ --location=$REGION --description="sidecar codelab"
Luego, crea un archivo package.json con el siguiente contenido:
{
"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"
}
}
Ahora crea un archivo llamado ingress.js con el siguiente contenido:
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}`);
});
Crea un Dockerfile para el contenedor de entrada
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" ]
Y crea un archivo ``.dockerignore`` para el contenedor de entrada.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Ahora puedes compilar la imagen para tu contenedor de entrada ejecutando el siguiente comando:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
4. Crea la app de sidecar
En esta sección, crearás una segunda app de Node.js que se usará como sidecar en el servicio de Cloud Run.
Navega al directorio de sidecar.
cd ../sidecar
Crea un archivo package.json con el siguiente contenido:
{
"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"
}
}
Ahora crea un archivo llamado sidecar.js con el siguiente contenido:
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}`);
});
Crea un Dockerfile para el contenedor sidecar
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" ]
Además, crea un archivo ``.dockerignore`` para el contenedor secundario.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Ahora puedes compilar la imagen para tu contenedor de entrada ejecutando el siguiente comando:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Implementa el servicio de Cloud Run
Implementarás el servicio de Cloud Run con un archivo YAML.
Navega al directorio principal.
cd ..
Crea un archivo sidecar-codelab.yaml con el siguiente contenido:
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"
Luego, implementa el servicio con el siguiente comando. Debes usar gcloud beta porque los volúmenes de almacenamiento están en versión preliminar pública.
gcloud beta run services replace sidecar-codelab.yaml
Una vez que se implemente, guarda la URL del servicio en una variable de entorno.
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)')
5. Llama al servicio de Cloud Run
Ahora puedes llamar a tu servicio proporcionando tu token de identidad.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Tus resultados deberían ser similares al siguiente ejemplo:
The sidecar says: Hello ingress container! I'm the sidecar.
6. Cómo compartir un archivo a través de una activación de volumen
En esta sección, actualizarás los contenedores para compartir un archivo a través de un volumen activado. En este ejemplo, el contenedor de entrada escribirá en un archivo en un volumen compartido. El sidecar leerá el archivo y devolverá su contenido al contenedor de entrada.
Primero, actualizarás el código del contenedor de entrada. Navega al directorio de entrada.
cd ../ingress
y, luego, reemplaza el contenido del archivo ingress.js por lo siguiente:
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}`);
});
Compila la nueva imagen para tu contenedor de entrada ejecutando el siguiente comando:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
Ahora, navega al directorio de sidecar:
cd ../sidecar
Actualiza sidecar.js con el siguiente contenido:
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}`);
});
Compila la nueva imagen para tu contenedor secundario ejecutando el siguiente comando:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Actualiza sidecar-codelab.yaml con lo siguiente para compartir un volumen:
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
Implementa el archivo sidecar-codelab.yaml actualizado
gcloud beta run services replace sidecar-codelab.yaml
Ahora puedes llamar a tu servicio proporcionando tu token de identidad.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Tus resultados deberían ser similares al siguiente ejemplo:
The sidecar says: the ingress container created this file.
7. ¡Felicitaciones!
¡Felicitaciones por completar el codelab!
Te recomendamos que revises la documentación sobre Cloud Run, específicamente sobre la implementación de varios contenedores y el uso de activaciones de volúmenes en memoria.
Temas abordados
- Cómo crear un contenedor que usa un sidecar
- Cómo un contenedor de entrada puede comunicarse con un sidecar usando localhost
- Cómo un contenedor de entrada y un sidecar pueden compartir un volumen montado
8. Limpia
Para evitar cargos involuntarios (por ejemplo, si esta Cloud Function se invoca de forma accidental más veces que tu asignación mensual de invocaciones de Cloud Run en el nivel gratuito), puedes borrar el servicio de Cloud Run o el proyecto que creaste en el paso 2.
Para borrar la función de Cloud, ve a la consola de Cloud Functions en https://console.cloud.google.com/run/ y borra el servicio sidecar-codelab (o $SERVICE_NAME en caso de que hayas usado un nombre diferente).
Si decides borrar todo el proyecto, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Si borras el proyecto, deberás cambiar de proyecto en el SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.