Desplegar una aplicación en un destino con la estrategia canary

En esta guía de inicio rápido se muestra cómo usar Cloud Deploy para entregar una imagen de aplicación de muestra en una implementación canaria en Google Kubernetes Engine o en Cloud Run. También puedes llevar a cabo un despliegue canary en GKE Enterprise, pero en esta guía de inicio rápido solo se muestran GKE y Cloud Run.

Una implementación canaria divide el tráfico entre una versión de la aplicación que ya se ha implementado y la nueva versión. Cloud Run asigna el tráfico en función de los porcentajes que configures en el flujo de procesamiento de entrega. GKE despliega la nueva versión en una proporción de pods. Esta guía de inicio rápido se implementa primero en el 50% y, después, en el 100%.

En esta guía de inicio rápido, solo hay un destino (prod). Por lo tanto, solo creamos un clúster de GKE o un servicio de Cloud Run para ejecutar tu aplicación.

En esta guía de inicio rápido, harás lo siguiente:

  1. Crea un clúster de GKE o define un servicio de Cloud Run.

    También puedes hacer un despliegue canary en clústeres de GKE Enterprise, pero en esta guía de inicio rápido solo se usan GKE y Cloud Run.

  2. Crea una configuración de Skaffold y un manifiesto de Kubernetes para especificar la imagen de contenedor (prediseñada) que se va a desplegar.

  3. Define tu flujo de procesamiento de entrega y tu destino de implementación de Cloud Deploy.

  4. Invoca tu flujo de procesamiento de entrega creando una versión, que se desplegará automáticamente en un destino.

    En esta primera versión no se incluye la fase canary.

  5. Consulta la canalización de distribución y la versión en la Google Cloud consola.

  6. Crea una segunda versión y, esta vez, ejecuta la fase canary para desplegar la aplicación al 50%.

  7. Avanza la versión para que se implemente al 100%.

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Si ya tienes instalada la CLI, asegúrate de que estás usando la versión más reciente:

    gcloud components update
    

  15. Comprueba que la cuenta de servicio predeterminada de Compute Engine tenga los permisos suficientes.

    Es posible que la cuenta de servicio ya tenga los permisos necesarios. Estos pasos se incluyen para los proyectos que inhabilitan las concesiones automáticas de roles para las cuentas de servicio predeterminadas.

    1. Primero, añade el rol clouddeploy.jobRunner:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      

    2. Añade el rol de desarrollador para tu tiempo de ejecución específico.
      • En GKE y GKE con la API Gateway:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/container.developer"
        

      • En Cloud Run:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/run.developer"
        

    3. Añade el rol iam.serviceAccountUser, que incluye el permiso actAs para implementar en el tiempo de ejecución:

      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

    Crear el entorno de ejecución

    GKE

    Crea un clúster de Autopilot de GKE:

     gcloud container clusters create-auto canary-quickstart-cluster \
                      --project=PROJECT_ID \
                      --region=us-central1
    

    GKE + API Gateway

    1. Crea un clúster de GKE con los ajustes recomendados para usarlo con Istio:

      gcloud container clusters create canary-quickstart-cluster \
             --machine-type=n1-standard-1 \
             --num-nodes 4 \
             --region=us-central1 \
             --project=PROJECT_ID
      
    2. Obtén las credenciales del clúster:

      gcloud container clusters get-credentials canary-quickstart-cluster \
             --project=PROJECT_ID \
             --region=us-central1
      
    3. Instala los CRDs de la API de Kubernetes Gateway si aún no están presentes en el clúster.

      kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
      
    4. Habilita la implementación del controlador de la pasarela de Istio instalando Istio.

      curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \
      && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
      

    Cloud Run

    Si usas Cloud Run, puedes omitir este comando. No tienes que hacer nada.

    Preparar la configuración de Skaffold y el manifiesto de la aplicación

    Cloud Deploy usa Skaffold para proporcionar los detalles de qué desplegar y cómo hacerlo correctamente en tu destino.

    En esta guía de inicio rápido, crearás un archivo skaffold.yaml, que identifica el manifiesto de Kubernetes o la configuración del servicio de Cloud Run que se va a desplegar.

    1. Abre una ventana de terminal.

    2. Crea un directorio y accede a él.

      GKE

      mkdir deploy-canary-quickstart-gke
      cd deploy-canary-quickstart-gke
      

      GKE + API Gateway

      mkdir deploy-canary-quickstart-gke-gatewayapi
      cd deploy-canary-quickstart-gke-gatewayapi
      

      Cloud Run

      mkdir deploy-canary-quickstart-run
      cd deploy-canary-quickstart-run
      
    3. Crea un archivo llamado skaffold.yaml con el siguiente contenido:

      GKE

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - kubernetes.yaml
      deploy:
        kubectl: {}
      

      GKE + API Gateway

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - kubernetes.yaml
      deploy:
        kubectl: {}
      

      Cloud Run

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - run.yaml
      deploy:
        cloudrun: {}
      

      Este archivo es una configuración mínima de Skaffold que identifica tu manifiesto. En esta guía de inicio rápido, crearás el archivo. Sin embargo, también puedes pedirle a Cloud Deploy que cree uno por ti para aplicaciones sencillas que no sean de producción.

      Consulta la referencia de skaffold.yaml para obtener más información sobre este archivo.

    4. Crea el archivo de manifiesto de tu aplicación.

      GKE

      Crea un archivo llamado kubernetes.yaml en el directorio deploy-canary-quickstart-gke con el siguiente contenido:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-deployment
        labels:
          app: my-app
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-app
        template:
          metadata:
            labels:
              app: my-app
          spec:
            containers:
            - name: nginx
              image: my-app-image
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service
        namespace: default
      spec:
        selector:
          app: my-app
        ports:
          - protocol: TCP
            port: 80
      

      Este archivo es un manifiesto de Kubernetes que se aplica al clúster para desplegar la aplicación. Este manifiesto incluye los recursos Service y Deployment necesarios para el despliegue canary, así como un recurso HTTPRoute y un recurso Gateway necesarios para usar la API Gateway.

      La imagen de contenedor que se va a desplegar se define aquí como marcador de posición, my-app-image, que se sustituye por la imagen específica cuando creas la versión.

      GKE + API Gateway

      Crea un archivo llamado kubernetes.yaml en el directorio deploy-canary-quickstart-gke-gatewayapi con el siguiente contenido:

      kind: Gateway
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: my-gateway
        annotations:
          networking.istio.io/service-type: "ClusterIP"
      spec:
        gatewayClassName: istio
        listeners:
        - name: default
          hostname: "*.example.com"
          port: 80
          protocol: HTTP
          allowedRoutes:
            namespaces:
              from: All
      ---
      kind: HTTPRoute
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: my-httproute
      spec:
        parentRefs:
        - kind: Gateway
          name: my-gateway
        hostnames:
        - "test.example.com"
        rules:
        - backendRefs:
          - name: my-service
            port: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service
      spec:
        selector:
          app: my-app
        ports:
        - name: tcp-port
          protocol: TCP
          port: 80
          targetPort: 8080
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-deployment
        labels:
          app: my-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-app
        template:
          metadata:
            labels:
              app: my-app
          spec:
            containers:
            - name: nginx
              image: my-app-image
      

      Este archivo es un manifiesto de Kubernetes que se aplica al clúster para desplegar la aplicación. Este manifiesto incluye los recursos Service y Deployment necesarios para el despliegue canary, así como un recurso HTTPRoute y un recurso Gateway necesarios para usar la API Gateway.

      La imagen de contenedor que se va a desplegar se define aquí como marcador de posición, my-app-image, que se sustituye por la imagen específica cuando creas la versión.

      Cloud Run

      Crea un archivo llamado run.yaml en el directorio deploy-canary-quickstart-run con el siguiente contenido:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-canary-run-service
      spec:
        template:
          spec:
            containers:
            - image: my-app-image
      

      Este archivo es una definición básica de servicio de Cloud Run, que se aplica en el momento del despliegue para crear el servicio en Cloud Run. La imagen del contenedor que se va a implementar se define aquí como un marcador de posición, my-app-image, que se sustituye por la imagen específica cuando creas la versión.

    Crea tu flujo de procesamiento de entrega y tus objetivos

    Puedes definir tu canal de distribución y tus destinos en un archivo o en archivos independientes. En esta guía de inicio rápido, crearemos un archivo para nuestra canalización y nuestro único destino:

    GKE

    Crea un archivo llamado clouddeploy.yaml en el directorio deploy-canary-quickstart-gke con el siguiente contenido:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-canary-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: prod
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                serviceNetworking:
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [50]
              verify: false
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod
    description: prod GKE cluster
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
    

    GKE + API Gateway

    Crea un archivo llamado clouddeploy.yaml en el directorio deploy-canary-quickstart-gke-gatewayapi con el siguiente contenido:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-canary-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: prod
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                gatewayServiceMesh:
                  httpRoute: "my-httproute"
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [50]
              verify: false
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod
    description: prod GKE cluster
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
    

    Cloud Run

    Crea un archivo llamado clouddeploy.yaml en el directorio deploy-canary-quickstart-run con el siguiente contenido:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-canary-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: prod
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              cloudRun:
                automaticTrafficControl: true
            canaryDeployment:
              percentages: [50]
              verify: false
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod
    description: prod Run Service
    run:
      location: projects/PROJECT_ID/locations/us-central1
    
    1. Registra tu canal y tus destinos en el servicio Cloud Deploy:

      gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
      

      Ahora tienes una canalización con un destino configurado para una estrategia de implementación canary.

    2. Confirma tu flujo de procesamiento y tus objetivos:

      En la Google Cloud consola, ve a la página Pipelines de entrega de Cloud Deploy para ver una lista de los pipelines de entrega disponibles.

      Abre la página Pipelines de entrega.

      Se muestra la canalización de entrega que acaba de crear y el objetivo que ha configurado aparece en la columna Objetivos.

      Visualización del flujo de procesamiento de entrega en la consola Google Cloud

    Crear una versión

    Una versión es el recurso central de Cloud Deploy que representa los cambios que se van a implementar. El flujo de procesamiento de entrega define el ciclo de vida de esa versión. Consulta la arquitectura de servicio de Cloud Deploy para obtener más información sobre ese ciclo de vida.

    Para crear un recurso release que represente la imagen de contenedor que se va a implementar, ejecuta el siguiente comando desde el directorio deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi o deploy-canary-quickstart-run:

    GKE

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=my-canary-demo-app-1 \
       --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    GKE + API Gateway

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=my-canary-demo-app-1 \
       --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    Cloud Run

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=my-canary-demo-app-1 \
       --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
    

    Fíjate en la marca --images=, que se usa para sustituir el marcador de posición (my-app-image) en el manifiesto o la definición de servicio por la imagen específica cualificada por SHA. Google recomienda que conviertas tus manifiestos en plantillas de esta forma y que uses nombres de imágenes cualificados por SHA al crear lanzamientos.

    Cuando creas un lanzamiento, Cloud Deploy también crea automáticamente un recurso de lanzamiento para desplegarlo inmediatamente en tu único destino, prod.

    Pasamos a la fase estable

    En esta primera versión, nos saltamos la fase canary y la implementamos al 100% (fase estable). Esto se debe a que la aplicación no se ha desplegado anteriormente, por lo que no se puede calcular el 50% de los pods (en GKE) ni cómo se divide el tráfico del servicio (en Cloud Run). Los pods (GKE) o las revisiones (Cloud Run) aún no existen.

    Como nos hemos saltado la fase canary, ahora podemos empezar la fase estable, que lleva el tráfico al 100%. Después, crearemos otra versión, que ejecutará la versión canary.

    En una situación real, normalmente ejecutarás una implementación canary en la que tu aplicación ya se esté ejecutando, por lo que esta fase de omisión será poco habitual.

    Ver la versión en la consola Google Cloud

    Ahora que has creado la primera versión, se ha creado el lanzamiento y puedes ver la versión y el lanzamiento en la Google Cloud consola. También puedes ver la visualización de la canalización, que muestra el estado actual de la versión.

    1. En la Google Cloud consola, ve a la página de Cloud Deploy Flujos de procesamiento de entrega para ver el flujo de procesamiento de entrega my-canary-demo-app-1.

      Abre la página Pipelines de entrega.

    2. Haga clic en el nombre de su flujo de procesamiento de entrega "my-canary-demo-app-1".

      La visualización de la canalización muestra el estado de la implementación de la aplicación. Como solo hay una fase en la canalización, la visualización muestra un solo nodo.

      Visualización del flujo de procesamiento de entrega en la consola Google Cloud

      Tu lanzamiento aparecerá en la pestaña Lanzamientos, en Detalles de la canalización de entrega.

    3. Haz clic en el nombre de la versión test-release-001.

      Tus lanzamientos aparecerán en Lanzamientos. Puedes hacer clic en un lanzamiento para ver sus detalles, incluido el registro de implementación.

      lanzamientos en la consola Google Cloud

      Verá que el estado del lanzamiento es "Pendiente de avance" y que el objetivo que se muestra en la visualización de la canalización tiene un enlace a "Avanzar a estable".

    Avanzar la fase de lanzamiento

    Después de la primera versión, se omitió la fase canary y el lanzamiento está esperando para iniciar la fase "estable", que implementa la aplicación al 100%:

    1. En la visualización de la canalización, haz clic en Pasar a estable.

    2. Cuando se te solicite, haz clic en Avanzar para confirmar la acción.

    Al cabo de unos minutos, el lanzamiento se encuentra en la fase "estable" y la aplicación se ha implementado al 100%.

    flujo de procesamiento de entrega en fase estable

    Ejecutar el despliegue canary

    Como en la primera versión se ha omitido la fase canary, ahora crearemos otra versión que sí ejecute una implementación canary.

    1. Para crear un release, ejecuta el siguiente comando desde el directorio deploy-canary-quickstart-gke, deploy-canary-quickstart-gke-gatewayapi o deploy-canary-quickstart-run:

      GKE

      gcloud deploy releases create test-release-002 \
        --project=PROJECT_ID \
        --region=us-central1 \
        --delivery-pipeline=my-canary-demo-app-1 \
        --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
      

      GKE + API Gateway

      gcloud deploy releases create test-release-002 \
        --project=PROJECT_ID \
        --region=us-central1 \
        --delivery-pipeline=my-canary-demo-app-1 \
        --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
      

      Cloud Run

      gcloud deploy releases create test-release-002 \
        --project=PROJECT_ID \
        --region=us-central1 \
        --delivery-pipeline=my-canary-demo-app-1 \
        --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
      

      Al cabo de unos minutos, se crea un lanzamiento y, esta vez, se ejecuta la fase canary:

      Flujo de procesamiento de entrega que empieza la fase canary

      Cuando finalice la primera fase de lanzamiento, se pasará a la fase canary:

      Visualización de la canalización de entrega en la consola Google Cloud , con la aplicación desplegada al 50%

      Esto significa que la aplicación se ha implementado en el 50%. En el caso de GKE basado en serviceNetworking, se implementa en la mitad de tus pods. El tráfico de GKE y Cloud Run basado en la API Gateway se asigna al 50%.

    2. Haz clic en Lanzamiento avanzado y, a continuación, en Avanzar cuando se te solicite.

      De esta forma, el lanzamiento pasa a la fase "estable", en la que la aplicación se implementa al 100%.

      flujo de procesamiento de entrega en fase estable, implementado al 100%

    Limpieza

    Para evitar que se apliquen cargos en tu cuenta de Google Cloud por los recursos utilizados en esta página, sigue estos pasos.

    1. Elimina el clúster canary-quickstart-cluster (solo en GKE):

      gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
      
    2. Elimina el servicio my-canary-run-service (solo en Cloud Run):

      gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
      
    3. Elimina la canalización de distribución, el destino y todos los recursos de lanzamiento y de implementación:

      gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
      
    4. Elimina los segmentos de Cloud Storage que haya creado Cloud Deploy.

      Una termina con _clouddeploy y la otra es [region].deploy-artifacts.[project].appspot.com.

      Abrir la página del navegador de Cloud Storage

    ¡Ya has completado esta guía de inicio rápido!

    Siguientes pasos