Descripción general
Google Cloud Deploy es un servicio administrado que automatiza la entrega de tus aplicaciones a una serie de entornos de destino en una secuencia de promoción definida. Cuando desees implementar tu aplicación actualizada, deberás crear una versión, cuyo ciclo de vida se administra a través de una canalización de entrega.
En este lab, crearás una canalización de entrega con Google Cloud Deploy. Luego, crearás una versión para una aplicación básica y ascenderás la aplicación por medio de una serie de destinos de Google Kubernetes Engine (GKE).
La aplicación de ejemplo es una app web sencilla que escucha en un puerto, proporciona un código de respuesta HTTP y agrega una entrada de registro.
Objetivos
En este lab, aprenderás a realizar las siguientes tareas:
- Implementar una imagen de contenedor en Google Cloud Artifact Registry usando Skaffold
- Crear una canalización de entrega de Google Cloud Deploy
- Crear un lanzamiento para la canalización de entrega
- Ascender la aplicación a través de los objetivos en la canalización de entrega
Configuración del lab
Accede a Qwiklabs
En cada lab, recibirás un proyecto de Google Cloud y un conjunto de recursos nuevos por tiempo limitado y sin costo adicional.
-
Haz clic en el botón Comenzar lab. Si debes pagar por el lab, se abrirá una ventana emergente para que selecciones tu forma de pago.
A la izquierda, se encuentra el panel Detalles del lab, que tiene estos elementos:
- El botón Abrir la consola de Google Cloud
- El tiempo restante
- Las credenciales temporales que debes usar para el lab
- Otra información para completar el lab, si es necesaria
-
Haz clic en Abrir la consola de Google Cloud (o haz clic con el botón derecho y selecciona Abrir el vínculo en una ventana de incógnito si ejecutas el navegador Chrome).
El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.
Sugerencia: Ordena las pestañas en ventanas separadas, una junto a la otra.
Nota: Si ves el diálogo Elegir una cuenta, haz clic en Usar otra cuenta.
-
De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.
{{{user_0.username | "Username"}}}
También puedes encontrar el nombre de usuario en el panel Detalles del lab.
-
Haz clic en Siguiente.
-
Copia la contraseña que aparece a continuación y pégala en el diálogo Te damos la bienvenida.
{{{user_0.password | "Password"}}}
También puedes encontrar la contraseña en el panel Detalles del lab.
-
Haz clic en Siguiente.
Importante: Debes usar las credenciales que te proporciona el lab. No uses las credenciales de tu cuenta de Google Cloud.
Nota: Usar tu propia cuenta de Google Cloud para este lab podría generar cargos adicionales.
-
Haga clic para avanzar por las páginas siguientes:
- Acepta los Términos y Condiciones.
- No agregues opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
- No te registres para obtener pruebas gratuitas.
Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.
Nota: Para ver un menú con una lista de productos y servicios de Google Cloud, haz clic en el menú de navegación que se encuentra en la parte superior izquierda o escribe el nombre del servicio o producto en el campo Búsqueda.
Después de completar los pasos iniciales de acceso, aparecerá el panel del proyecto.
Activa Google Cloud Shell
Google Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud.
Google Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.
-
En la consola de Cloud, en la barra de herramientas superior derecha, haz clic en el botón Abrir Cloud Shell.

-
Haz clic en Continuar.
El aprovisionamiento y la conexión al entorno demorarán unos minutos. Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. Por ejemplo:

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con el completado de línea de comando.
- Puedes solicitar el nombre de la cuenta activa con este comando:
gcloud auth list
Resultado:
Credentialed accounts:
- @.com (active)
Resultado de ejemplo:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- Puedes solicitar el ID del proyecto con este comando:
gcloud config list project
Resultado:
[core]
project =
Resultado de ejemplo:
[core]
project = qwiklabs-gcp-44776a13dea667a6
Nota:
La documentación completa de gcloud está disponible en la
guía de descripción general de gcloud CLI
.
Tarea 1. Crea tres clústeres de GKE
En esta tarea, crearás los tres clústeres de GKE que serán los destinos de la canalización de entrega.
Se crearán tres clústeres de GKE, lo cual indica los tres destinos de la canalización de entrega:
- prueba
- etapa de pruebas
- producción
- Declara las variables de entorno que usarán los diversos comandos:
export PROJECT_ID=$(gcloud config get-value project)
export REGION={{{ project_0.default_region | "REGION" }}}
gcloud config set compute/region $REGION
- Habilita la API de Google Kubernetes Engine:
gcloud services enable \
container.googleapis.com \
clouddeploy.googleapis.com
- Configura el completado de línea de comando de kubectl en Cloud Shell:
source <(kubectl completion bash)
- Crea los tres clústeres de GKE:
gcloud container clusters create-auto test --async
gcloud container clusters create-auto staging --async
gcloud container clusters create-auto prod --async
Nota: La marca --async también indica los clústeres que se deben aprovisionar en segundo plano, a la vez que el usuario puede seguir con la configuración de otros elementos de la canalización.
- Verifica el estado de los tres clústeres:
gcloud container clusters list --format="csv(name,status)"
Nota: Dado que usamos la marca --async, este comando es una manera de obtener el estado de la implementación del clúster.
Resultado
name,status
prod,PROVISIONING
staging,PROVISIONING
test,RUNNING
La creación de los clústeres puede demorar unos minutos. No debes esperar a que los clústeres estén listos. Continúa el lab.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear tres clústeres de GKE
Tarea 2. Prepara la imagen de contenedor de la aplicación web
En esta tarea, se creará un repositorio en Artifact Registry para guardar las imágenes de contenedor de la aplicación web.
- Habilita la API de Artifact Registry:
gcloud services enable artifactregistry.googleapis.com
- Crea el repositorio de app web para guardar las imágenes de contenedor:
gcloud artifacts repositories create web-app \
--description="Image registry for sample web app" \
--repository-format=docker \
--location=$REGION
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear el repositorio de app web
Tarea 3. Compila e implementa las imágenes de contenedor en Artifact Registry
En esta tarea, clonarás el repositorio de Git que contiene la aplicación web y, también, implementarás las imágenes de contenedor de la aplicación en Artifact Registry.
Prepara la configuración de la aplicación
- Clona el repositorio para el lab en el directorio principal:
cd ~/
git clone https://github.com/GoogleCloudPlatform/cloud-deploy-tutorials.git
cd cloud-deploy-tutorials
git checkout c3cae80 --quiet
cd tutorials/base
- Crea la configuración
skaffold.yaml
:
envsubst < clouddeploy-config/skaffold.yaml.template > web/skaffold.yaml
cat web/skaffold.yaml
Nota: El comando envsubst es un comando de búsqueda y reemplazo.
El directorio web ahora contiene el archivo de configuración skaffold.yaml
, en el que se proporcionan instrucciones para que Skaffold compile una imagen de contenedor para tu aplicación. En esta configuración, se describen los siguientes elementos.
En la sección de compilación, se configura lo siguiente:
- Las dos imágenes de contenedor que se compilarán (artefactos)
- El proyecto de Google Cloud Build que se usará para compilar las imágenes
En la sección deploy
, se configuran los manifiestos de Kubernetes necesarios para implementar la carga de trabajo en un clúster.
La configuración portForward
se usa para definir el servicio de Kubernetes para la implementación.
Resultado
apiVersion: skaffold/v2beta7
kind: Config
build:
artifacts:
- image: leeroy-web
context: leeroy-web
- image: leeroy-app
context: leeroy-app
googleCloudBuild:
projectId: {{project-id}}
deploy:
kubectl:
manifests:
- leeroy-web/kubernetes/*
- leeroy-app/kubernetes/*
portForward:
- resourceType: deployment
resourceName: leeroy-web
port: 8080
localPort: 9000
Nota: Para ver los archivos, usa vi, emacs, nano o el editor de código de Cloud Shell; para ello, haz clic en el ícono Abrir editor en Cloud Shell.
Compila la aplicación web
La herramienta skaffold se encargará del envío de la base de código a Cloud Build.
- Habilita la API de Cloud Build:
gcloud services enable cloudbuild.googleapis.com
- Ejecuta el comando skaffold para compilar la aplicación y, luego, implementar la imagen de contenedor en el repositorio de Artifact Registry creado anteriormente:
cd web
skaffold build --interactive=false \
--default-repo $REGION-docker.pkg.dev/$PROJECT_ID/web-app \
--file-output artifacts.json
cd ..
- Una vez que se haya completado la compilación de skaffold, verifica las imágenes de contenedor en Artifact Registry:
gcloud artifacts docker images list \
$REGION-docker.pkg.dev/$PROJECT_ID/web-app \
--include-tags \
--format yaml
El parámetro yaml --format
devuelve el resultado en formato YAML para facilitar la lectura. El resultado debería verse así:
Resultado
---
createTime: '2024-09-11T02:07:54.995807Z'
package: us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-app
tags: '9181623'
updateTime: '2024-09-11T02:07:54.995807Z'
version: sha256:6af6a0a72d13dd6597c0fc0191f697e2da2c3892d1bf8e87a3df8d96612e1495
---
createTime: '2024-09-11T02:07:53.629263Z'
package: us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-web
tags: '9181623'
updateTime: '2024-09-11T02:07:53.629263Z'
version: sha256:a0179673d1876f205875b223557c83162e56e91c5e3313f5e99465a224adb6c9
De forma predeterminada, Skaffold configura la etiqueta de una imagen como su etiqueta Git relacionada, si hay una disponible. Puedes encontrar información similar en el archivo artifacts.json
que creó el comando skaffold.
Skaffold genera el archivo web/artifacts.json
con los detalles de las imágenes implementadas:
cat web/artifacts.json | jq
Resultado
{
"builds": [
{
"imageName": "leeroy-web",
"tag": "us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-web:9181623@sha256:a0179673d1876f205875b223557c83162e56e91c5e3313f5e99465a224adb6c9"
},
{
"imageName": "leeroy-app",
"tag": "us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-app:9181623@sha256:6af6a0a72d13dd6597c0fc0191f697e2da2c3892d1bf8e87a3df8d96612e1495"
}
]
Haz clic en Revisar mi progreso para verificar el objetivo.
Compilar e implementar las imágenes de contenedor en Artifact Registry
Tarea 4. Crea la canalización de entrega
En esta tarea, configurarás la canalización de entrega. La canalización ascenderá las apps de prueba a etapa de pruebas y de etapa de pruebas a producción.
- Habilita la API de Google Cloud Deploy:
gcloud services enable clouddeploy.googleapis.com
- Crea el recurso de canalización de entrega con el archivo
delivery-pipeline.yaml
:
gcloud config set deploy/region $REGION
cp clouddeploy-config/delivery-pipeline.yaml.template clouddeploy-config/delivery-pipeline.yaml
gcloud deploy apply --file=clouddeploy-config/delivery-pipeline.yaml
- Verifica que se haya creado la canalización de entrega:
gcloud deploy delivery-pipelines describe web-app
La canalización de entrega será similar al siguiente resultado:
Resultado
Unable to get target test
Unable to get target staging
Unable to get target prod
Delivery Pipeline:
createTime: '2024-09-11T14:03:18.294884547Z'
description: web-app delivery pipeline
etag: 2539eacd7f5c256d
name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app
serialPipeline:
stages:
- targetId: test
- targetId: staging
- targetId: prod
uid: eb0601aa03ac4b088d74c6a5f13f36ae
updateTime: '2024-09-11T14:03:18.680753520Z'
Targets: []
Observa las primeras tres líneas del resultado. Actualmente, la canalización de entrega hace referencia a tres entornos de destino que aún no se han creado. En la siguiente tarea, crearás esos destinos.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear la canalización de entrega
Tarea 5. Configura los destinos de implementación
Se crearán tres destinos de canalización de entrega: uno para cada uno de los clústeres de GKE.
Asegúrate de que los clústeres estén listos
Los tres clústeres de GKE ya deberían estar en ejecución, pero es útil verificarlo.
- Ejecuta lo siguiente para obtener el estado de los clústeres:
gcloud container clusters list --format="csv(name,status)"
Los tres clústeres deben estar en el estado RUNNING, como se indica en el resultado que figura a continuación. Si aún no están marcados como RUNNING, vuelve a ejecutar el comando anterior hasta que su estado se haya cambiado a RUNNING.
Resultado
name,status
prod,RUNNING
staging,RUNNING
test,RUNNING
Una vez que todos los clústeres tengan el estado "RUNNING", continúa el lab.
Crea un contexto para cada clúster
Usa los siguientes comandos para obtener las credenciales de cada clúster y crear un contexto kubectl
fácil de usar para hacer referencia a los clústeres más adelante:
CONTEXTS=("test" "staging" "prod")
for CONTEXT in ${CONTEXTS[@]}
do
gcloud container clusters get-credentials ${CONTEXT} --region ${REGION}
kubectl config rename-context gke_${PROJECT_ID}_${REGION}_${CONTEXT} ${CONTEXT}
done
Crea un espacio de nombres en cada clúster
Usa los siguientes comandos para crear un espacio de nombres de Kubernetes (app web) en cada uno de los tres clústeres:
for CONTEXT in ${CONTEXTS[@]}
do
kubectl --context ${CONTEXT} apply -f kubernetes-config/web-app-namespace.yaml
done
La aplicación se implementará en el espacio de nombres (app web).
Crea los destinos de la canalización de entrega
- Envía una definición del destino para cada uno de los destinos:
for CONTEXT in ${CONTEXTS[@]}
do
envsubst < clouddeploy-config/target-$CONTEXT.yaml.template > clouddeploy-config/target-$CONTEXT.yaml
gcloud deploy apply --file clouddeploy-config/target-$CONTEXT.yaml
done
Los destinos se describen en un archivo YAML. En cada destino, se configura la información de clúster pertinente para ese destino. La configuración de los destinos de prueba y etapa de pruebas son prácticamente las mismas.
- Visualiza los detalles para el destino de prueba:
cat clouddeploy-config/target-test.yaml
Resultado
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: test
description: test cluster
gke:
cluster: projects/{{project-id}}/locations/us-central1/clusters/test
El destino de producción es algo diferente, ya que requiere aprobación (consulta la configuración requireApproval
en el resultado) antes de que una versión pueda ascenderse al clúster.
- Visualiza los detalles para el destino de producción:
cat clouddeploy-config/target-prod.yaml
Resultado
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: prod
description: prod cluster
requireApproval: true
gke:
cluster: projects/{{project-id}}/locations/us-central1/clusters/prod
- Verifica que se hayan creado los tres destinos (prueba, etapa de pruebas y producción):
gcloud deploy targets list
Ya se crearon todos los destinos de Google Cloud Deploy para la canalización de entrega.
Haz clic en Revisar mi progreso para verificar el objetivo.
Configurar los destinos de implementación
Tarea 6. Crea una versión
En esta tarea, crearás una versión de la aplicación.
Una versión de Google Cloud Deploy es una versión específica de una o más imágenes de contenedor asociadas a una canalización de entrega determinada. Una vez que se crea una versión, se puede ascender a través de múltiples destinos (la secuencia de promoción). Además, cuando creas una versión, se procesa tu aplicación con skaffold y el resultado se guarda como una referencia de un momento determinado que se usa mientras dure la versión.
Ya que se trata de la primera versión de tu aplicación, le asignarás el nombre web-app-001
.
- Ejecuta el siguiente comando para crear la versión:
gcloud deploy releases create web-app-001 \
--delivery-pipeline web-app \
--build-artifacts web/artifacts.json \
--source web/
El parámetro --build-artifacts
hace referencia al archivo artifacts.json
que creó skaffold anteriormente. El parámetro --source
hace referencia al directorio del código fuente de la aplicación en el que se puede encontrar skaffold.yaml.
Cuando se crea una versión, también se lanza automáticamente en el primer destino de la canalización (a menos que se requiera aprobación, lo que se abordará más adelante en este lab).
- Para confirmar que el destino de prueba tenga implementada tu aplicación, ejecuta el siguiente comando:
gcloud deploy rollouts list \
--delivery-pipeline web-app \
--release web-app-001
Resultado
---
approvalState: DOES_NOT_NEED_APPROVAL
createTime: '2024-09-11T14:05:21.961604Z'
deployEndTime: '2024-09-11T14:06:35.278604Z'
deployStartTime: '2024-09-11T14:06:22.420091744Z'
deployingBuild: projects/{{project-id}}/locations/us-central1/builds/4815b788-ec5e-4185-9141-a5b57c71b001
enqueueTime: '2024-09-11T14:06:21.760830Z'
etag: 5cb7b6c342b5f29b
name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app/releases/web-app-001/rollouts/web-app-001-to-test-0001
state: SUCCEEDED
targetId: test
uid: cccd9525d3a0414fa60b2771036841d9
El primer lanzamiento de una versión tarda varios minutos, ya que Google Cloud Deploy procesa los manifiestos para todos los destinos cuando se crea la versión. El clúster de GKE también puede tardar unos minutos para proporcionar los recursos que necesita la implementación.
Si no ves state: SUCCEEDED
en el resultado del comando anterior, espera un momento y vuelve a ejecutar el comando de forma periódica hasta que se complete el lanzamiento.
- Para confirmar que la aplicación se haya implementado en el clúster de GKE de prueba, ejecuta los siguientes comandos:
kubectx test
kubectl get all -n web-app
Resultado
NAME READY STATUS RESTARTS AGE
pod/leeroy-app-5547cf9d9b-rgc2l 1/1 Running 0 3m27s
pod/leeroy-web-6768b49c46-w7vt9 1/1 Running 0 3m27s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/leeroy-app ClusterIP None <none> 50051/TCP 3m28s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/leeroy-app 1/1 1 1 3m28s
deployment.apps/leeroy-web 1/1 1 1 3m28s
NAME DESIRED CURRENT READY AGE
replicaset.apps/leeroy-app-5547cf9d9b 1 1 1 3m28s
replicaset.apps/leeroy-web-6768b49c46 1 1 1 3m28s
Nota: El comando kubectx nos permite cambiar entre contextos con facilidad.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear una versión
Tarea 7. Asciende la aplicación a la etapa de pruebas
En esta tarea, ascenderás la aplicación desde el destino de prueba y hacia el destino de etapa de pruebas.
- Asciende la aplicación al destino de etapa de pruebas:
gcloud deploy releases promote \
--delivery-pipeline web-app \
--release web-app-001
Se te solicitará que continúes antes de que comience la promoción.
- Presiona INTRO para aceptar la configuración predeterminada (Y = sí).
- Para confirmar que el destino de etapa de pruebas tenga implementada tu aplicación, ejecuta el siguiente comando:
gcloud deploy rollouts list \
--delivery-pipeline web-app \
--release web-app-001
Revisa el resultado
Busca la sección marcada como targetId: staging
. Como antes, si no ves state: SUCCEEDED
en el resultado del comando anterior, espera un momento y vuelve a ejecutar el comando de forma periódica hasta que se complete el lanzamiento.
Resultado
---
approvalState: DOES_NOT_NEED_APPROVAL
createTime: '2024-09-11T02:19:32.539468Z'
deployEndTime: '2024-09-11T02:19:45.970949Z'
deployStartTime: '2024-09-11T02:19:33.111948770Z'
deployingBuild: projects/743805075658/locations/us-central1/builds/2316517c-3a2f-4cd3-80ad-6d133b653746
etag: 1109b802ff586df5
name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app/releases/web-app-001/rollouts/web-app-001-to-staging-0001
state: SUCCEEDED
targetId: staging
uid: 80a35a5f044844708d2050f8c556e07e
Haz clic en Revisar mi progreso para verificar el objetivo.
Ascender la aplicación a la etapa de pruebas
Tarea 8. Asciende la aplicación a la producción
En esta tarea, ascenderás nuevamente la aplicación, pero también brindarás la aprobación.
- Asciende la aplicación al destino de producción:
gcloud deploy releases promote \
--delivery-pipeline web-app \
--release web-app-001
Se te solicitará que continúes antes de que comience la promoción.
- Presiona INTRO para aceptar la configuración predeterminada (Y = sí).
- Para revisar el estado del destino de producción, ejecuta el siguiente comando:
gcloud deploy rollouts list \
--delivery-pipeline web-app \
--release web-app-001
En el resultado, ten en cuenta que approvalState
es NEEDS_APPROVAL
y que el estado es PENDING_APPROVAL
.
Resultado
---
approvalState: NEEDS_APPROVAL
createTime: '2024-09-11T14:12:07.466989Z'
etag: 6e9303e5a1b04084
name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app/releases/web-app-001/rollouts/web-app-001-to-prod-0001
state: PENDING_APPROVAL
targetId: prod
uid: a5c7d6007fee4d80904d49142581aaa7
- Aprueba el lanzamiento con el siguiente comando:
gcloud deploy rollouts approve web-app-001-to-prod-0001 \
--delivery-pipeline web-app \
--release web-app-001
Se te solicitará que apruebes el lanzamiento antes de que comience la promoción.
- Presiona INTRO para aceptar la configuración predeterminada (Y = sí).
- Para confirmar que el destino de producción tenga implementada tu aplicación, ejecuta el siguiente comando:
gcloud deploy rollouts list \
--delivery-pipeline web-app \
--release web-app-001
Como en el caso de los lanzamientos anteriores, localiza la entrada del destino (targetId: prod
) y verifica que se haya completado el lanzamiento (state: SUCCEEDED
). Vuelve a ejecutar el comando periódicamente hasta que se complete el lanzamiento.
- Usa
kubectl
para verificar el estado de la aplicación implementada:
kubectx prod
kubectl get all -n web-app
Haz clic en Revisar mi progreso para verificar el objetivo.
Ascender la aplicación a la producción
¡Felicitaciones!
Ahora, puedes usar Cloud Deploy para crear canalizaciones de entrega continua.
Copyright 2025 Google LLC. Todos los derechos reservados. Google y el logotipo de Google son marcas de Google LLC. El resto de los nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que están asociados.