Usa revisiones en Cloud Run para la división del tráfico, los lanzamientos graduales y las reversiones

Usa revisiones en Cloud Run para la división del tráfico, los lanzamientos graduales y las reversiones

Acerca de este codelab

subjectÚltima actualización: abr 5, 2025
account_circleEscrito por un Googler

1. Introducción

Descripción general

Las revisiones de Cloud Run te permiten especificar qué revisiones deben recibir tráfico y qué porcentaje de tráfico se debe enviar a cada revisión. Las revisiones te permiten revertir a una revisión anterior, lanzar una revisión de forma gradual y dividir el tráfico entre varias revisiones.

En estos codelabs, se muestra cómo usar las revisiones para administrar el tráfico a tu servicio de Cloud Run. Obtén más información sobre las revisiones en la documentación de Cloud Run.

Qué aprenderás

  • Cómo dividir el tráfico entre dos o más revisiones de un servicio de Cloud Run
  • Cómo lanzar una nueva revisión de forma gradual
  • Cómo revertir a una revisión anterior

2. Configuración y requisitos

Requisitos previos

  • Accediste a la consola de Cloud.
  • Ya implementaste un servicio de Cloud Run. Por ejemplo, puedes seguir los pasos para implementar un servicio de Cloud Run para comenzar.

Configura las variables de entorno

Puedes configurar las variables de entorno que se usarán en este codelab.

PROJECT_ID=YOUR-PROJECT-ID
REGION
=YOUR_REGION

BG_COLOR
=darkseagreen
SERVICE_NAME
=traffic-revisions-color
AR_REPO
=traffic-revisions-color-repo

Crea un repositorio de Artifact Registry para el servicio

gcloud artifacts repositories create $AR_REPO \
   
--repository-format=docker \
   
--location=$REGION \
   
--description="codelab for finetuning using CR jobs" \
   
--project=$PROJECT_ID

3. División del tráfico

En esta muestra, se muestra cómo crear un servicio de Cloud Run que lee una variable de entorno de color y responde con el nombre de la revisión usando ese color de fondo.

Aunque en este codelab se usa Python, puedes usar cualquier entorno de ejecución.

Configura las variables de entorno

Puedes configurar las variables de entorno que se usarán en este codelab.

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Cómo crear el servicio

Primero, crea un directorio para el código fuente y ábrelo con el comando cd.

mkdir traffic-revisions-codelab && cd $_

Luego, crea un archivo main.py con el siguiente contenido:

import os
from flask import Flask, render_template_string

app = Flask(__name__)

TEMPLATE = """
<!doctype html>
<html lang="en">
<head>
    <title>Cloud Run Traffic Revisions</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 50vh;
            background-color: {{ bg_color }}; /* Set by environment variable */
            font-family: sans-serif;
        }
        .content {
            background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */
            padding: 2em;
            border-radius: 8px;
            text-align: center;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <div class="content">
        <p>background color: <strong>{{ color_name }}</strong></p>
    </div>
</body>
</html>
"""

@app.route('/')
def main():
    """Serves the main page with a background color from the ENV."""
    # Get the color from the 'BG_COLOR' environment variable.
    # Default to 'white' if the variable is not set.
    color = os.environ.get('BG_COLOR', 'white').lower()

    return render_template_string(TEMPLATE, bg_color=color, color_name=color)

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(debug=True, host='0.0.0.0', port=port)

A continuación, crea un archivo requirements.txt con el siguiente contenido:

Flask>=2.0.0
gunicorn>=20.0.0

Por último, crea un Dockerfile.

FROM python:3.12-slim

WORKDIR
/app

COPY requirements
.txt .

RUN pip install
--no-cache-dir -r requirements.txt

COPY
. .

EXPOSE
8080

ENV PYTHONPATH
/app

CMD
["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]

Crea la imagen en Artifact Registry con Buildpacks mediante Cloud Build:

gcloud builds submit \
   
--tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME

Y, luego, implementa la primera revisión en Cloud Run con un color verde oscuro:

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars BG_COLOR=darkseagreen

Para probar el servicio, puedes abrir el extremo directamente en tu navegador web para ver el color de fondo como verde azulado oscuro.

Ahora, implementa una segunda revisión con un color de fondo marrón claro.

# update the env var
BG_COLOR=tan

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --set-env-vars BG_COLOR=tan

Ahora, cuando actualices el sitio web, verás el color de fondo marrón claro.

Divide el tráfico 50/50

Para dividir el tráfico entre las revisiones verde oscuro y marrón claro, debes encontrar los IDs de revisión de los servicios subyacentes de Cloud Run. Para ver los IDs de revisión, ejecuta este comando:

gcloud run revisions list --service $SERVICE_NAME \
  --region $REGION --format 'value(REVISION)'

Deberías ver resultados similares a los que se muestran a continuación.

traffic-revisions-color-00003-qoq
traffic-revisions-color-00002-zag

Para dividir el tráfico 50/50 entre las dos revisiones, ejecuta el siguiente comando con tus revisiones:

gcloud run services update-traffic $SERVICE_NAME \
  --region $REGION \
  --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50

Prueba la división del tráfico

Para probar el servicio, actualiza la página en tu navegador.

La mitad de las veces, deberías ver la revisión de color verde oscuro y, la otra mitad, la revisión de color marrón claro. También verás el nombre de la revisión en el resultado, p.ej.,

<html><body style="background-color:tan;"><div><p>Hello traffic-revisions-color-00003-qoq</p></div></body></html>

4. Lanzamientos graduales

En esta sección, aprenderás a lanzar gradualmente los cambios en una nueva revisión de Cloud Service. Puedes obtener más información sobre los lanzamientos graduales en la documentación.

Usarás el mismo código que en la sección anterior, pero lo implementarás como un nuevo servicio de Cloud Run.

Primero, establece el color de fondo en beige y, luego, implementa la función con el nombre gradual-rollouts-colors.

Para implementar una función de Cloud Run directamente en Cloud Run, ejecuta el siguiente comando:

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Ahora supongamos que queremos lanzar gradualmente una nueva revisión con el color de fondo lavanda.

Primero, configuremos la revisión actual en beige para que reciba el 100% del tráfico. Esto garantizará que tus revisiones futuras no reciban tráfico. De forma predeterminada, Cloud Run establece el 100% del tráfico en la revisión con la marca latest. Si especificas manualmente que esta revisión beige actual debe recibir todo el tráfico, la revisión con la marca latest ya no recibirá el 100% del tráfico. Consulta la documentación.

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-colors \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

gcloud run services update-traffic gradual-rollouts-colors \
  --to-revisions=$BEIGE_REVISION=100 \
  --region $REGION

Verás un resultado similar a Traffic: 100% radual-rollouts-colors-00001-yox.

Ahora puedes implementar una revisión nueva que no recibirá tráfico. En lugar de hacer cambios en el código, puedes actualizar la variable de entorno BG_COLOR para esta revisión.

Para implementar una función de Cloud Run directamente en Cloud Run, ejecuta el siguiente comando:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Ahora, cuando visites el sitio web en tu navegador, verás el color beige, aunque lavanda fue la revisión implementada más recientemente.

Prueba una revisión que publica un 0% de tráfico

Supongamos que verificaste que tu revisión se implementó correctamente y que entrega el 0% del tráfico. Aunque pasó las verificaciones de estado, debes verificar que esta revisión use el color de fondo lavanda.

Para probar la revisión lavanda, puedes aplicarle una etiqueta. El etiquetado te permite probar directamente la revisión nueva en una URL específica, sin entregar tráfico.

Primero, obtén la URL de la imagen de esa revisión más reciente (que es lavanda).

IMAGE_URL_LAVENDER=$(gcloud run services describe gradual-rollouts-colors --region $REGION --format 'value(IMAGE)')

Ahora etiqueta esa imagen con su color asociado.

gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION

Verás un resultado similar al siguiente:

The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Ahora, cuando visites esa URL de revisión específica, verás el color lavanda.

Aumenta el tráfico de forma gradual

Ahora, puedes comenzar a enviar tráfico a la revisión lavanda. En el siguiente ejemplo, se muestra cómo enviar el 1% del tráfico a lavender.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=1

Para enviar el 50% del tráfico a lavender, puedes usar el mismo comando, pero especifica el 50%.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=50

Deberías ver una lista del tráfico que recibe cada revisión.

Traffic:
  50% gradual-rollouts-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Cuando tengas todo listo para lanzar el color lavanda por completo, puedes establecerlo en un 100% para reemplazar el beige.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=100

y ahora, cuando visites el sitio web, solo verás el color lavanda.

5. Reversiones

Supongamos que llegaron los primeros comentarios de UX, que indican que los clientes prefieren el beige al lavanda, y debes revertir al beige.

Para revertir a la revisión anterior (beige), ejecuta este comando:

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-revisions $BEIGE_REVISION=100

y ahora, cuando visites el sitio web, verás el color beige como color de fondo.

Puedes obtener más información sobre las reversiones en la documentación.

6. ¡Felicitaciones!

¡Felicitaciones por completar el codelab!

Te recomendamos que revises la documentación sobre lanzamientos, reversiones y migración de tráfico.

Temas abordados

  • Cómo dividir el tráfico entre dos o más revisiones de un servicio de Cloud Run
  • Cómo lanzar una nueva revisión de forma gradual
  • Cómo revertir a una revisión anterior

7. Limpia

Para evitar cargos imprevistos (por ejemplo, si esta función de Cloud Run se invoca de forma inadvertida 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 un servicio de Cloud Run, ve a Cloud Run en la consola de Cloud en https://console.cloud.google.com/run/ y borra las funciones que creaste en este codelab.

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 los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.