CI/CD moderna con Anthos: aplica el flujo de trabajo de los desarrolladores

En este instructivo, se muestra cómo incorporar una aplicación nueva, desarrollar una característica para la aplicación y también implementar la aplicación en producción mediante técnicas modernas de integración continua/entrega continua (IC/CD) con Anthos.

Este documento forma parte de una serie:

En este instructivo, usarás herramientas comoSkaffold, kustomize,Artifact Registry y GitLab para desarrollar e implementar tu aplicación.

Este documento está dirigido a arquitectos empresariales y desarrolladores de aplicaciones, así como a los equipos de ingeniería de confiabilidad de sitios, DevOps y seguridad de TI. Es útil tener experiencia en herramientas y procesos de implementación automatizados para comprender los conceptos de este documento.

Arquitectura

En este instructivo, usarás Skaffold para desarrollar una función nueva y, luego, implementarla en entornos de producción previa y producción mediante un proceso basado en GitOps. La arquitectura de referencia contiene la infraestructura y las herramientas necesarias para implementar el flujo de trabajo de promoción y de implementación de código de estilo GitOps que se muestra en el siguiente diagrama:

El bucle de desarrollo abarca varios repositorios, incluidos los repositorios de entornos de código y aplicaciones.

A partir del repositorio de códigos para la CI, el flujo de trabajo incluye los siguientes pasos:

  1. Compartes el código fuente de la aplicación a través de los repositorios de tu aplicación.
  2. Con el clúster de desarrollo, puedes desarrollar y probar tus cambios en un bucle de desarrollo iterativo.
  3. Combinas los cambios de código de la rama de funciones en la línea principal de código, lo que activa la CI. El proceso de CI crea y envía una imagen de contenedor a Artifact Registry y genera y envía manifiestos de Kubernetes completamente procesados.
  4. Los manifiestos renderizados se envían a la rama de etapa de pruebas del repositorio de entorno de la aplicación, lo que activa la implementación en el clúster de etapa de pruebas.
  5. Los manifiestos renderizados se combinan desde la rama de la etapa de pruebas hasta la rama principal, lo que activa la implementación del cambio de código en los clústeres de producción.

Para obtener más información sobre las herramientas y la infraestructura utilizadas en este flujo de trabajo, consulta CI/CD moderna con Anthos: creación de un sistema de CI/CD.

Objetivos

  • Integrar una aplicación nueva.
  • Usar Skaffold para desarrollar una función nueva y, luego, pruébala en vivo.
  • Implementar la nueva función en un entorno de preproducción.
  • Usar GitOps para implementar la función nueva en varios clústeres de producción.

Costos

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

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

Prepara tu entorno

  1. Si continúas directamente desde CI/CD moderna con Anthos: compila un sistema de CI/CD, ve al paso siguiente. Sin embargo, si tienes una sesión nueva o una vencida, en Cloud Shell, define las variables de entorno que establecerás en la arquitectura de referencia:

    export PROJECT_ID=PROJECT_ID
    export REGION="us-central1"
    
    gcloud config set compute/region ${REGION}
    gcloud config set core/project ${PROJECT_ID}
    
    export GITLAB_HOSTNAME=gitlab.endpoints.${PROJECT_ID}.cloud.goog
    export GITLAB_USER=$(gcloud secrets versions access latest --secret="gitlab-user")
    export GITLAB_PASSWORD=$(gcloud secrets versions access latest --secret="gitlab-password")
    

    Reemplaza PROJECT_ID por el ID de tu proyecto de Cloud.

  2. Si nunca usaste Git en Cloud Shell, configúralo con tu nombre y dirección de correo electrónico: Git usa esta información para identificarte como el autor de las confirmaciones que creas en Cloud Shell.

    git config --global user.email "GIT_EMAIL_ADDRESS"
    git config --global user.name "GIT_USERNAME"
    

    Reemplaza lo siguiente:

    • GIT_EMAIL_ADDRESS: La dirección de correo electrónico asociada a tu cuenta de Git
    • GIT_USERNAME: El nombre de usuario asociado con tu cuenta de Git
  3. Instalar kustomize.

Incorpora una aplicación nueva

La arquitectura de referencia contiene una interfaz de línea de comandos (CLI), anthos-platform-cli, que optimiza los procesos de administración de aplicaciones, como la creación y la eliminación de aplicaciones. anthos-platform-cli usa repositorios de inicio para inicializar la aplicación nueva y aplicar las prácticas recomendadas que administran los equipos de administración de plataformas y operaciones. La CLI también establece la zona de destino para la aplicación nueva mediante la definición del espacio de nombres y las políticas base en el repositorio anthos-config-management.

  1. En Cloud Shell, descarga la CLI de anthos-platform-cli:

    cd $HOME
    wget -O anthos-platform-cli https://storage.googleapis.com/solutions-public-assets/anthos-platform-cli/latest/anthos-platform-cli-vlatest-linux-amd64
    
  2. Haz que la CLI sea ejecutable con el siguiente comando:

    chmod +x anthos-platform-cli
    
  3. Crear una aplicación

    ./anthos-platform-cli add app \
        --name hello-world-golang \
        --gitlab-hostname $GITLAB_HOSTNAME \
        --gitlab-token $GITLAB_PASSWORD \
        --template-name golang-template
    mv hello-world-golang hello-world-golang.bak
    

Agrega una nueva función a la aplicación

Cuando desarrollas una función nueva, debes implementar rápidamente los cambios en una zona de pruebas de desarrollo para probar e iterar en ellos. En este instructivo, usarás Skaffold para supervisar los cambios e implementarlos en una zona de pruebas de desarrollo.

Skaffold genera un archivo de configuración llamado skaffold.yaml. Este archivo define las imágenes de Docker y los manifiestos de Kubernetes que usas para implementar la aplicación. Cuando ejecutas skaffold dev, comienza el bucle de desarrollo continuo. A medida que realizas cambios en la aplicación, Skaffold vuelve a compilar de forma automática las imágenes de Docker necesarias y, luego, implementa la versión más reciente del código de desarrollo en el clúster de desarrollo.

En su trabajo, los desarrolladores compilan muchas imágenes y necesitan un lugar en un registro de contenedores para almacenarlas. Te recomendamos que otorgues a cada desarrollador acceso a una ruta secundaria en Container Registry, en la que almacenan sus imágenes de desarrollo. Por ejemplo, el proyecto podría darles acceso al repositorio gcr.io/my-project/alice en Container Registry. Después de otorgarles acceso de administrador para enviar y extraer imágenes de ese repositorio, pueden establecer la configuración de Skaffold de default-repo a fin de usar ese repositorio con sus imágenes de desarrollo. Para obtener más información sobre el manejo de repositorios de imágenes, consulta Controla el repositorio de imágenes.

Conéctate al clúster de desarrollo

  1. En Cloud Shell, obtén credenciales para el clúster de desarrollo:

    gcloud container clusters --region us-west1 get-credentials dev-us-west1
    
  2. Cambia el nombre de tu contexto:

    kubectx development=gke_${PROJECT_ID}_us-west1_dev-us-west1
    
  3. Cambia al contexto del clúster de desarrollo:

    kubectx development
    

Configura tu entorno de desarrollo

  1. En Cloud Shell, clona el repositorio de tu aplicación.

    git clone git@$GITLAB_HOSTNAME:hello-world-golang/hello-world-golang.git
    cd hello-world-golang
    
  2. Crea un repositorio de Artifact Registry para tu usuario:

    gcloud beta artifacts repositories create $USER --repository-format=Docker \
        --location=us-central1
    gcloud beta artifacts repositories add-iam-policy-binding \
        --member serviceAccount:tf-sa-dev-us-west1@${PROJECT_ID}.iam.gserviceaccount.com \
        --role roles/artifactregistry.reader \
        --location us-central1 $USER
    
  3. Configura la autenticación de Docker para tu repositorio de Artifact Registry:

    gcloud beta auth configure-docker us-central1-docker.pkg.dev
    
  4. Crea tu propio espacio de nombres en el clúster de desarrollo para que funcione como tu zona de pruebas de desarrollo:

    kubectl create namespace $USER
    kubens $USER
    
  5. Crea una cuenta de servicio para tu aplicación:

    kubectl create serviceaccount hello-world-golang-ksa
    
  6. Configura Skaffold para usar tu repositorio de Artifact Registry:

    skaffold config set default-repo us-central1-docker.pkg.dev/$PROJECT_ID/$USER
    
  7. Inicia el bucle de desarrollo de Skaffold:

    skaffold dev --port-forward
    
  8. En la barra de herramientas de Cloud Shell, haz clic en Vista previa en la Web y, luego, en Vista previa en el puerto 8080:

    Comandos de la barra de herramientas de Cloud Shell

    Este es el resultado:

    Hello World!
    

    Mantén abierta esta sesión de Cloud Shell.

Actualiza la aplicación

  1. En la barra de herramientas de Cloud Shell, haz clic en  Abrir una pestaña nueva para activar una sesión nueva.

  2. Crea una rama de funciones para tu trabajo:

    cd hello-world-golang
    git checkout -b my-feature
    
  3. Actualiza la aplicación para que genere un mensaje diferente:

    sed -i "s/Hello World/My new feature/g" main.go
    

    Para ver los cambios, actualiza la vista previa en la Web.

  4. En la sesión original de Cloud Shell, presiona CTRL+C para salir de Skaffold.

  5. Confirma y envía tus cambios a la rama de atributos:

    git add .
    git commit -m "Changed the message"
    git push -u origin my-feature
    
  6. Cierra la otra sesión de Cloud Shell.

Implementa el cambio en el clúster de etapa de pruebas

Después de enviar los cambios correctamente a la rama de funciones del repositorio del código de la aplicación, puedes implementarlos en el clúster de etapa de pruebas. Para implementar en el clúster de etapa de pruebas, combina los cambios en la rama principal del repositorio de la aplicación. Esta acción activa un proceso de CI para probar el código, renderizar los manifiestos de Kubernetes y enviarlos a la rama de etapa de pruebas del repositorio de configuración de la aplicación. Cuando el proceso de CI envía los manifiestos al repositorio de configuración de la aplicación, se inicia un trabajo de CD que implementa los manifiestos en el clúster de etapa de pruebas.

Para implementar los cambios en el clúster de etapa de pruebas, haz lo siguiente:

  1. En un navegador web, ve a GitLab, y accede con la URL y el nombre de usuario y la contraseña de la arquitectura de referencia.
  2. Haz clic en Grupos y, luego, seleccione Tus grupos.
  3. Haz clic en hello-world-golang.
  4. Haz clic en hello-world-golang para ir al repositorio del código de la aplicación.

    Para ver los cambios en el repositorio, selecciona la rama de funciones de la lista Ramas:

    Un cuadro de búsqueda te permite buscar ramas y etiquetas.

  5. En el panel adyacente, haz clic en Combinar solicitudes y, luego, en Crear solicitud de combinación.

  6. Selecciona la opción Borrar la rama de origen cuando se acepta la combinación y, luego, haz clic en Enviar solicitud de combinación.

  7. Haz clic en Combinar.

  8. En el menú, haga clic en CI/CD para ver la ejecución de la canalización de CI.

  9. Haz clic en En ejecución para obtener más detalles.

  10. Haz clic en Grupos y, luego, seleccione Tus grupos.

  11. Haz clic en hello-world-golang.

  12. Haz clic en hello-world-golang-env para ver el repositorio de configuración de la aplicación.

  13. En el menú, haz clic en CI/CD para ver la ejecución de la canalización de EC.

Visualiza los cambios en el clúster de etapa de pruebas

  1. En Cloud Shell, obtén credenciales para el clúster de etapa de pruebas:

    gcloud container clusters --region us-west2 get-credentials staging-us-west2
    
  2. Cambia el nombre de tu contexto:

    kubectx staging=gke_${PROJECT_ID}_us-west2_staging-us-west2
    
  3. Cambia al contexto del clúster de etapa de pruebas:

    kubectx staging
    
  4. Crea una redirección de puertos:

    kubectl port-forward svc/hello-world-golang-app -n hello-world-golang 8080:8080
    
  5. En la barra de herramientas de Cloud Shell, haz clic en Vista previa en la Web y, luego, en Vista previa en el puerto 8080.

    Este es el resultado:

    My new feature!
    
  6. En Cloud Shell, presiona CTRL+C para finalizar la redirección de puertos.

Asciende a los clústeres de producción

Después de verificar los cambios en el clúster de etapa de pruebas, estarás listo para promover los cambios a los clústeres de producción. El repositorio hello-world-golang-env contiene una rama para cada entorno de aplicaciones. Las actualizaciones de la configuración de la aplicación activan de forma automática las canalizaciones de CD, que implementan la aplicación en los entornos asociados con la rama. Por ejemplo, las actualizaciones de la rama de etapa de pruebas activan una implementación en el entorno de etapa de pruebas. El almacenamiento de la configuración de la aplicación en Git y la automatización de la implementación de las aplicaciones forman la base del proceso de GitOps. El almacenamiento de los manifiestos en Git mejora la auditabilidad de los cambios de configuración y las implementaciones.

Para activar la implementación en producción, combina la configuración de la aplicación de la rama de etapa de pruebas con la rama principal del repositorio hello-world-golang-env.

  1. En GitLab, haz clic en Grupos y, luego, selecciona Tus grupos.
  2. Haz clic en hello-world-golang.
  3. Haz clic en hello-world-golang-env.
  4. En el panel adyacente, haz clic en Combinar solicitudes y, luego, en Crear solicitud de combinación.
  5. Anula la selección Borrar la rama de origen cuando se acepte la solicitud de combinación.
  6. Haz clic en Enviar solicitud de combinación.
  7. Haz clic en Combinar.
  8. En el menú, haga clic en CI/CD para ver la ejecución de la canalización.
  9. Una vez que se complete la implementación en el clúster prod-us-central1, haz clic en Reproducir para aprobar el lanzamiento en el clúster prod-us-east1.

Visualiza los cambios en un clúster de producción

  1. En Cloud Shell, obtén credenciales para el clúster de prod-us-central1:

    gcloud container clusters get-credentials prod-us-central1
    
  2. Cambia el nombre de tu contexto:

    kubectx prod-central=gke_${PROJECT_ID}_us-central1_prod-us-central1
    
  3. Cambia al contexto del clúster prod-central:

    kubectx prod-central
    
  4. Crea una redirección de puertos:

    kubectl port-forward svc/hello-world-golang-app -n hello-world-golang 8080:8080
    
  5. En la barra de herramientas de Cloud Shell, haz clic en Vista previa en la Web y, luego, en Vista previa en el puerto 8080.

    Este es el resultado:

    My new feature!
    
  6. En Cloud Shell, presiona CTRL+C para finalizar la redirección de puertos.

Limpia

Para evitar que se generen costos en tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, sigue estos pasos.

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?