Implementa la aplicación de Cloud Run con Cloud Deploy

1. Descripción general

En este lab, implementarás una aplicación .NET en Cloud Run con Cloud Deploy. Compilarás una imagen de contenedor con Cloud Build sin usar Dockerfile. Configurarás una canalización con tres entornos de destino con Cloud Deploy y seguirás los pasos para promover el lanzamiento a través de los entornos. Por último, aprobarás la versión que se implementará en el entorno de producción.

916a54f51af5ee54.png

¿Qué es Cloud Build?

Con Cloud Build, puedes compilar software rápidamente en todos los lenguajes de programación.

¿Qué es Cloud Deploy?

Cloud Deploy es un servicio de entrega continua completamente administrado. Con Cloud Deploy, puedes crear canalizaciones de implementación para GKE, Anthos y Cloud Run.

¿Qué es Cloud Run?

Con Cloud Run, puedes implementar aplicaciones escalables alojadas en contenedores escritas en cualquier lenguaje (como Go, Python, Java, Node.js, .NET y Ruby) en una plataforma completamente administrada.

¿Qué es Skaffold?

Skaffold es una herramienta de línea de comandos que permite el desarrollo continuo para aplicaciones nativas de Kubernetes. Cloud Deploy usa Skaffold para las operaciones de renderización y de implementación.

Qué aprenderás

En este lab, aprenderás a realizar las siguientes tareas:

  • Crea una canalización de Cloud Deploy
  • Crea una imagen de contenedor para la aplicación .NET con Cloud Build sin usar Dockerfile
  • Implementa la aplicación en Cloud Run con Cloud Deploy
  • Promover versiones de Cloud Deploy

Requisitos previos

  • Para este lab, se da por sentado que el usuario tiene conocimientos previos sobre los entornos de shell y la consola de Cloud.

2. Configuración y requisitos

Configuración del proyecto de Cloud

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. por lo general, no te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se te facture más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Configuración del entorno

Para activar Cloud Shell, haz clic en el ícono que se encuentra a la derecha de la barra de búsqueda.

eb0157a992f16fa3.png

En Cloud Shell, ejecuta el siguiente comando para establecer las variables de entorno del proyecto:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

Habilita las API:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

Crea un repositorio de Artifact Registry para almacenar imágenes de contenedor de aplicaciones:

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. Revisa los archivos de configuración

29c2533441779de0.png

Clona el código fuente de la aplicación:

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

Revisa la configuración de la canalización de Cloud Deploy:

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

Revisa el archivo skaffold.yaml que define tres entornos y usa Cloud Run como servicio de destino.

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

Revisa los archivos de configuración del servicio.

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

Revisa el archivo cloudbuild.yaml con los pasos para compilar una imagen de contenedor y crear una versión de Cloud Deploy:

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. Crear canalización de Cloud Deploy

Reemplaza el valor _PROJECT_ID en clouddeploy.yaml:

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

Crea una canalización de Cloud Deploy:

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Revisa la canalización creada en Cloud Deploy.

5. Compila una imagen de contenedor y crea una versión

Agrega permisos de operador de Cloud Deploy a la cuenta de servicio de Cloud Build:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

Crea una imagen de contenedor y una versión de Cloud Deploy:

export RELEASE_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Revisa la versión creada en Cloud Deploy. Espera hasta que se complete la implementación en el entorno de desarrollo.

6. Promover el lanzamiento a entornos de QA y PROD

Con la consola de Cloud o Cloud Shell, promueve el lanzamiento al siguiente target(qa-env).

Promover la versión con Cloud Shell y ejecutar el comando de gcloud para promover la versión

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Esperar hasta que se complete la implementación en el entorno de QA Promueve la versión al siguiente destino(prod-env).

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Abre Cloud Deploy en la consola de Cloud y aprueba la versión para la implementación de producción.

838b60770e9691.png

Revisa el estado de la canalización de Cloud Deploy y las métricas de DORA disponibles (“recuento de implementaciones”, “frecuencia de implementación”, “tasa de fallas de implementación”).

Métrica

Descripción

Cantidad de implementaciones

La cantidad total de implementaciones exitosas y fallidas en el destino final de tu canalización de entrega.

Frecuencia de implementación

Es la frecuencia con la que la canalización de entrega se implementa en el destino final de tu canalización de entrega.Una de las cuatro métricas clave definidas por el programa de investigación y evaluación de DevOps (DORA).

Tasa de fallas de implementación

El porcentaje de lanzamientos con errores en el destino final de tu canalización de entrega.

Revisa las aplicaciones implementadas en Cloud Run:

d6372b5350f10875.png

7. ¡Felicitaciones!

¡Felicitaciones! Completaste el codelab.

Temas abordados:

  • Cómo crear una canalización de Cloud Deploy
  • Cómo crear una imagen de contenedor para una aplicación .NET con Cloud Build
  • Cómo implementar una aplicación en Cloud Run con Cloud Deploy
  • Cómo promocionar la versión de Cloud Deploy

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

8. ¿Qué sigue?