Canalizaciones de entrega continua con Spinnaker y Google Kubernetes Engine

En este instructivo, se muestra cómo crear una canalización de entrega continua con Google Kubernetes Engine (GKE), Cloud Source Repositories, Cloud Build y Spinnaker para Google Cloud. Luego de crear una app de muestra, debes configurar estos servicios para compilarla, probarla e implementarla de forma automática. Cuando modificas el código de la app, los cambios activan la canalización de entrega continua para volver a compilar, probar y, luego, implementar la versión nueva de forma automática.

Los informes State of DevOps identificaron las capacidades que impulsan el rendimiento de la entrega de software. Este instructivo te ayudará con las siguientes funciones:

Arquitectura de la canalización

En el siguiente diagrama, se ilustra la arquitectura de la canalización de entrega continua.

Arquitectura de la canalización para desarrolladores y usuarios.

A fin de brindar una entrega continua de actualizaciones de aplicaciones a sus usuarios, necesita un proceso automatizado que compile, pruebe y actualice su software de forma confiable. Los cambios de código deberían transmitirse automáticamente a través de una canalización que incluya la creación de artefactos, pruebas de unidades, pruebas funcionales y puesta en funcionamiento en producción. En algunos casos, querrá que una actualización de código se aplique solo a un subconjunto de sus usuarios, de modo que se emplee de forma realista antes de enviarla a la base de usuarios completa. Si uno de estos lanzamientos Canary resulta insatisfactorio, su proceso automatizado debe ser capaz de revertir rápidamente los cambios del software.

Con GKE y Spinnaker, puede crear un flujo de entrega sólida y continua que lo ayude a garantizar que su software se envíe en cuanto se desarrolle y valide. A pesar de que su objetivo final es la iteración rápida, primero debe asegurarse de que cada revisión de la aplicación pase por una serie de validaciones automatizadas antes de convertirse en candidata para su lanzamiento en producción. Si un cambio determinado fue aprobado automáticamente, también puede validar la aplicación de forma manual y realizar más pruebas previas al lanzamiento.

Una vez que su equipo decida que la aplicación está lista para producción, un miembro del equipo puede aprobar su implementación en producción.

Canalización de entrega de aplicaciones

En este instructivo, compilarás la canalización de entrega continua que se muestra en el siguiente diagrama.

Arquitectura de la canalización de entrega de la app

Los pasos de alto nivel de esta canalización son los siguientes:

  1. Un desarrollador cambia el código y lo envía a un repositorio.

  2. Cloud Build detecta los cambios y, luego, compila, prueba y envía la imagen de Docker a Spinnaker.

  3. Spinnaker detecta la imagen, la implementa en Canary y prueba la implementación en Canary. Luego de una aprobación manual, Spinnaker implementa la imagen en producción.

Objetivos

  • Iniciar Cloud Shell a fin de configurar el entorno e implementar Spinnaker para Google Cloud
  • Crear un clúster de GKE en el que se implementará la aplicación de muestra
  • Descargar una app de muestra, crear un repositorio de Git y subirlo a Cloud Source Repositories
  • Crear una imagen de Docker
  • Generar activadores para crear imágenes de Docker cada vez que tu aplicación sufra cambios
  • Configurar una canalización de Spinnaker para implementar tu aplicación en GKE de forma confiable y continua
  • Implementar un cambio de código que active la canalización y mirar cómo se pone en funcionamiento en producción

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • GKE
  • Cloud Load Balancing
  • Cloud Build
  • Cloud Source Repositories
  • Container Registry

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita las API de GKE, Cloud Build, and Cloud Source Repositories.

    Habilita las API

Configura el entorno

En esta sección, configurarás la infraestructura necesaria para completar el instructivo.

Implementa Spinnaker para Google Cloud mediante Cloud Shell

Ejecuta todos los comandos de terminal de este instructivo desde Cloud Shell.

Con Spinnaker para Google Cloud, puedes configurar y administrar Spinnaker con una configuración lista para la producción y optimizada para Google Cloud. Spinnaker para Google Cloud configura recursos (GKE, Memorystore, depósitos de Cloud Storage y cuentas de servicio), integra Spinnaker a servicios relacionados, como Cloud Build, y proporciona un entorno de administración basado en Cloud Shell, con asistentes y herramientas comunes como spin y hal.

  1. Abre Spinnaker para Google Cloud en Cloud Shell. De este modo, se clona Spinnaker para el repositorio de Google Cloud en el entorno de Cloud Shell y se inician las instrucciones de instalación detalladas.

    IR A CLOUD SHELL

  2. Configura Git. Si ya configuraste Git, puedes omitir este paso.

    git config --global user.email "EMAIL_ADDRESS"
    git config --global user.name "USERNAME"
    

    Reemplaza los siguientes elementos:

    • EMAIL_ADDRESS: Tu dirección de correo electrónico de Git
    • USERNAME: Tu nombre de usuario de Git
  3. Configura una variable de entorno para definir en qué proyecto de Cloud instalar Spinnaker:

    DEVSHELL_PROJECT_ID=YOUR_PROJECT_ID
    

    Reemplaza YOUR_PROJECT_ID por el proyecto que seleccionaste o creaste para este instructivo.

  4. Instala Spinnaker para Google Cloud.

    PROJECT_ID=${DEVSHELL_PROJECT_ID} ~/cloudshell_open/spinnaker-for-gcp/scripts/install/setup_properties.sh
    ~/cloudshell_open/spinnaker-for-gcp/scripts/install/setup.sh
    
  5. Reinicia Cloud Shell para cargar la configuración del entorno nuevo.

    Opción de reinicio en el menú de Cloud Shell.

  6. Conéctate a Spinnaker.

    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/connect_unsecured.sh
    
  7. En Cloud Shell, haz clic en el ícono de vista previa en la Web y selecciona Vista previa en el puerto 8080 (Preview on port 8080).

    Vista previa en la Web de Cloud Shell

  8. Deberías ver la pantalla de bienvenida, seguida de la IU de Spinnaker:

    Pantalla de bienvenida de Spinnaker

    IU de Spinnaker

Crea un clúster de GKE para implementaciones de aplicaciones

Un patrón común consiste en usar un clúster de GKE para compilaciones, implementaciones, etc. y otros clústeres de GKE para las aplicaciones en ejecución. En esta sección, crearás otro clúster de GKE, app-cluster, en el que se implementará la aplicación de muestra.

  1. En Cloud Shell, crea un clúster de GKE nuevo:

    ZONE=us-east1-c
    gcloud config set compute/zone $ZONE
    gcloud container clusters create app-cluster \
    --machine-type=n1-standard-2
    
  2. Agrega el clúster de GKE nuevo a Spinnaker. Los valores predeterminados deben ser correctos.

    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/add_gke_account.sh
    

    Resultado y valores de ejemplo:

    Please enter the context you wish to use to manage your GKE resources: gke_spinnaker-246920_us-east1-c_app-cluster
    Please enter the id of the project within which the referenced cluster lives: spinnaker-246920
    Please enter a name for the new Spinnaker account: app-cluster-acct
    

  3. Cambia el contexto de Kubernetes al clúster de Spinnaker:

    kubectl config use-context gke_${DEVSHELL_PROJECT_ID}_${ZONE}_spinnaker-1
    
  4. Envía y aplica los cambios de configuración a Spinnaker:

    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/push_and_apply.sh
    

Compila la imagen de Docker

En esta sección, configurará Cloud Build para detectar cambios en el código fuente de su aplicación, compilar una imagen de Docker y enviarla a Container Registry.

Cree su repositorio de código fuente

  1. En Cloud Shell, descarga el código fuente de muestra:

    cd ~
    wget https://gke-spinnaker.storage.googleapis.com/sample-app-v4.tgz
    
  2. Descomprime el código fuente:

    tar xzfv sample-app-v4.tgz
    
  3. Cambia los directorios al código fuente:

    cd sample-app
    
  4. Realiza la confirmación inicial del repositorio de código fuente:

    git init
    git add .
    git commit -m "Initial commit"
    
  5. Crea un repositorio para alojar tu código:

    gcloud source repos create sample-app
    git config credential.helper gcloud.sh
    
  6. Agrega tu nuevo repositorio como remoto:

    export PROJECT=$(gcloud info --format='value(config.project)')
    git remote add origin https://source.developers.google.com/p/$PROJECT/r/sample-app
    
  7. Envía tu código a la rama principal del nuevo repositorio:

    git push origin master
  8. Verifica que el código fuente se vea en la consola:

    IR A LA PÁGINA DEL CÓDIGO FUENTE

Configura el activador de compilación

En el siguiente diagrama, se ilustra el activador que compilarás en esta sección.

Flujo de trabajo de Spinnaker

Debes configurar Cloud Build para compilar y enviar las imágenes de Docker cada vez que envías etiquetas de Git al repositorio de código fuente. Cloud Build verifica el código fuente, compila la imagen de Docker desde el Dockerfile en el repositorio y envía esa imagen a Container Registry de forma automática.

  1. En la sección Cloud Build de Cloud Console, haz clic en Activadores y, luego, en Crear activador.

    IR A LA PÁGINA ACTIVADORES DE COMPILACIÓN

  2. Establece la siguiente configuración para el activador:

    • Nombre (Name): sample-app-tags
    • Evento (Event): Selecciona Enviar etiqueta nueva (Push new tag).
    • Repositorio (Repository): sample-app
    • Etiqueta (regex) (Tag): v.*
    • Configuración de compilación (Build configuration): /cloudbuild.yaml
  3. Haz clic en Crear (Create).

    Configuración del activador cuando se crea.

De ahora en adelante, cada vez que envíes una etiqueta de Git con la letra “v” como prefijo al repositorio de código fuente, Cloud Build compilará tu app de forma automática y la enviará como una imagen de Docker a Container Registry.

Prepare sus manifiestos de Kubernetes para utilizar en Spinnaker

Spinnaker requiere contar con acceso a sus manifiestos de Kubernetes para implementarlos en sus clústeres. En esta sección, se crea un depósito de Cloud Storage al que se propagarán los manifiestos durante el proceso de IC en Cloud Build. Una vez que sus manifiestos se encuentran en Cloud Storage, Spinnaker puede descargarlos y aplicarlos durante la ejecución de su canalización.

  1. Crea un depósito.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-kubernetes-manifests
    
  2. Habilita el control de versiones en el depósito para tener un historial de los manifiestos.

    gsutil versioning set on gs://$PROJECT-kubernetes-manifests
    
  3. Establece el ID del proyecto de Google Cloud correcto en los manifiestos de implementación de Kubernetes:

    sed -i s/PROJECT/$PROJECT/g k8s/deployments/*
    
  4. Confirma los cambios en el repositorio:

    git commit -a -m "Set project ID"
    

Configura las canalizaciones de implementación

Ahora que las imágenes se compilan de forma automática, debes implementarlas en el clúster de Kubernetes.

En el siguiente diagrama, se ilustran los pasos de la canalización de implementación.

Configura la canalización de implementación.

Debes hacer la implementación en un entorno de escala reducida para realizar pruebas de integración. Una vez superadas las pruebas de integración, debes aprobar los cambios de forma manual para implementar el código en los servicios de producción.

Crea la canalización de implementación

  1. Usa spin para crear una app en Spinnaker.

    spin application save --application-name sample \
                          --owner-email example@example.com \
                          --cloud-providers kubernetes \
                          --gate-endpoint http://localhost:8080/gate
    

    Luego, crea la canalización de entrega continua. En este instructivo, la canalización está configurada para detectar cuando una imagen de Docker que tiene una etiqueta con el prefijo v llega a Container Registry.

  2. En una pestaña nueva de Cloud Shell, ejecuta el siguiente comando en el directorio del código fuente para subir una canalización de muestra a la instancia de Spinnaker:

    export PROJECT=$(gcloud info --format='value(config.project)')
    sed s/PROJECT/$PROJECT/g spinnaker/pipeline-deploy.json > pipeline.json
    spin pipeline save --gate-endpoint http://localhost:8080/gate -f pipeline.json
    

Compila la imagen

Envía tu primera imagen con los siguientes pasos:

  1. Ve a tu carpeta de código fuente en Cloud Shell.
  2. Crea una etiqueta de Git:

    git tag v1.0.0
  3. Envía la etiqueta:

    git push --tags
  4. En Cloud Build, haz clic en Build History (Historial de compilaciones) para comprobar que la compilación se haya activado. Si no se activó, verifica que el activador se haya configurado de forma correcta en la sección anterior.

    IR AL HISTORIAL DE COMPILACIONES

    historial de compilaciones

Visualiza la ejecución de la canalización

La configuración que acabas de crear utiliza las notificaciones de las imágenes recién etiquetadas que se envían con el fin de activar una canalización de Spinnaker. En uno de los pasos anteriores, se envió una etiqueta hacia Cloud Source Repositories que hizo que Cloud Build compilara y enviara tu imagen a Container Registry. Ahora puedes verificar la canalización que se activó.

  1. Haz clic en Canalizaciones para regresar a la página de canalizaciones.

  2. Haz clic en Detalles para ver más información sobre el progreso de la canalización. En esta sección, se muestra el estado de la canalización de implementación y sus pasos. Los pasos en color azul son los que se encuentran en ejecución; los verdes se completaron con éxito, y los rojos fallaron. Haz clic en una etapa para ver sus detalles.

    Después de 3 a 5 minutos, la fase de pruebas de integración se completa, y se debe aprobar la canalización de forma manual para continuar con la implementación.

  3. Mantén el cursor sobre Enviar a producción y, luego, haz clic en Continuar (Continue).

    El lanzamiento continúa con las implementaciones de frontend y backend de producción. Tarda unos minutos en completarse.

  4. Para visualizar la app, selecciona Infraestructura > Balanceadores de cargas (Infrastructure > Load Balancers) en la parte superior de la IU de Spinnaker.

    Lista desplegable Infraestructura con la opción Balanceadores de cargas seleccionada

  5. Desplázate hacia abajo en la lista del balanceador de cargas y haz clic en Predeterminado (Default), debajo de sample-frontend-production.

    Balanceador de cargas predeterminado

  6. Desplázate hacia abajo por el panel de detalles de la derecha y copia la dirección IP de tu app. Para ello, haz clic en el botón de portapapeles en la IP de Ingress. Es posible que el vínculo de la IP de Ingress de la IU de Spinnaker use HTTPS de forma predeterminada, pero la aplicación está configurada para usar HTTP.

    Panel de detalles en el que se ve la dirección IP de tu app.

  7. Pega la dirección en el navegador para visualizar la versión de producción de la app.

    Versión de producción de la app.

    Ya activaste la canalización de forma manual para compilar, realizar pruebas e implementar la app.

Cómo activar la canalización mediante cambios de código

En esta sección, realizará pruebas a la canalización de extremo a extremo a través de un cambio en el código y del envío de una etiqueta de Git, y observará cómo se ejecuta la canalización en respuesta a esto. Cuando envía una etiqueta de Git que comienza con “v”, Cloud Build se activa para compilar una nueva imagen de Docker y enviarla a Container Registry. Spinnaker detecta que la nueva etiqueta de la imagen comienza con “v” y activa una canalización para implementar la imagen en canaries, ejecutar pruebas y desplegar la misma imagen en todos los pods de la implementación.

  1. Cambia el color de la aplicación de naranja a azul:

    cd ~/sample-app
    sed -i 's/orange/blue/g' cmd/gke-info/common-service.go
    
  2. Etiqueta el cambio y envíalo al repositorio de código fuente:

    git commit -a -m "Change color to blue"
    git tag v1.0.1
    git push --tags
    
  3. La compilación nueva aparece en el historial de compilaciones de Cloud Build.

  4. Haz clic en Canalizaciones para ver cómo la canalización comienza a implementar la imagen.

  5. Observa las implementaciones de versiones canary. Cuando la implementación esté en pausa, a la espera del lanzamiento a producción, comienza a actualizar la pestaña que contiene la app. Cuatro backends ejecutan la versión anterior de la app, mientras que solo uno ejecuta la versión canary. Deberías ver la versión nueva en azul de la app luego de actualizar la pestaña unas diez veces.

  6. Cuando se complete la etapa de pruebas, vuelve a la pestaña de Spinnaker y aprueba la implementación.

  7. Cuando la canalización se complete, la app se verá como la siguiente captura de pantalla. En el campo Versión (Version), ahora se muestra v1.0.1.

    Versión de producción de la app actualizada.

    Ya lanzaste con éxito la app en todo tu entorno de producción.

  8. De forma opcional, puedes revertir este cambio si anulas la confirmación anterior. Cuando se hace una reversión, se agrega una etiqueta (v1.0.2) nueva y se la vuelve a enviar a través de la misma canalización que usaste para implementar v1.0.1:

    git revert v1.0.1
    git tag v1.0.2
    git push --tags

Realiza una limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Borra Spinnaker para Google Cloud:

    cd ~
    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/generate_deletion_script.sh
    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/delete-all_${DEVSHELL_PROJECT_ID}_spinnaker-1_spinnaker-1.sh
    
  2. Borra el clúster de GKE:

    gcloud container clusters delete app-cluster --zone=us-east1-c
    
  3. Borra el repositorio:

    gcloud source repos delete sample-app
    
  4. Borra el depósito:

    export PROJECT=$(gcloud info --format='value(config.project)')
    export BUCKET=$PROJECT-kubernetes-manifests
    gsutil -m rm -r gs://$BUCKET
    
  5. Borra las imágenes de contenedor:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.0
    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.1
    
  6. Si creaste la versión v1.0.2 en el paso de reversión opcional anterior, borra esa imagen de contenedor:

    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.2
    

Próximos pasos