Implementación de GitOps usando Argo CD

Introducción

Argo CD es una implementación de código abierto popular para realizar entrega continua GitOps sobre Kubernetes. Sus aplicaciones, definiciones, configuraciones y entornos deben ser declarativos y versionados. Además, la implementación y gestión del ciclo de vida de las aplicaciones deben ser automatizadas, auditables y fáciles de entender. Todo esto se puede lograr utilizando Argo.

Argo CD sigue los mismos patrones y principios de GitOps, manteniendo así el estado de su clúster utilizando un enfoque declarativo. La sincronización se realiza a través de un repositorio Git, donde se almacenan los manifiestos de Kubernetes. Los manifiestos de Kubernetes pueden especificarse de varias formas:

  • Aplicaciones Kustomize.
  • Gráficos Helm.
  • Aplicaciones Ksonnet.
  • Archivos Jsonnet.
  • Directorio simple de manifiestos YAML/json.
  • Cualquier herramienta personalizada de gestión de configuración configurada como un complemento de gestión de configuración.

Como sucede con cada aplicación que se ejecuta en un clúster de Kubernetes, Argo CD se configura mediante definiciones de recursos personalizados (CRDs) almacenadas en manifiestos YAML. La más importante es la CRD Application. En una aplicación de Argo CD, defines qué repositorio Git se debe usar para sincronizar qué clúster de Kubernetes. Puede ser el mismo clúster de Kubernetes donde se implementa Argo CD, o uno externo.

Argo CD se implementa como un Controlador de Kubernetes que monitorea continuamente las aplicaciones en ejecución y compara el estado actual (o en vivo) con el estado objetivo deseado (como se especifica en el repositorio Git). Una aplicación implementada cuyo estado en vivo se desvía del estado objetivo se considera OutOfSync. Argo CD informa y visualiza las diferencias, al tiempo que proporciona facilidades para sincronizar automáticamente o manualmente el estado en vivo de nuevo al estado objetivo deseado.

Argo CD ofrece muchas características, siendo las más destacadas:

  • Soporte para múltiples herramientas de gestión/configuración, como: Kustomize, Helm, Ksonnet, Jsonnet, plain-YAML.
  • Capacidad para gestionar e implementar en múltiples clústeres.
  • Integración SSO (OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn).
  • Multi-tenencia y políticas de RBAC para autorización.
  • Análisis del estado de salud de los recursos de la aplicación.
  • Revertir/Rodar-en-cualquier-lugar a cualquier configuración de aplicación comprometida en el repositorio Git.
  • Detección de desviación de configuración automatizada y visualización.
  • Interfaz de usuario web que proporciona una vista en tiempo real de la actividad de la aplicación.
  • Interfaz de línea de comandos para automatización e integración CI.
  • Integración de webhook (GitHub, BitBucket, GitLab).
  • Ganchos PreSync, Sync, PostSync para soportar implementaciones complejas de aplicaciones (por ejemplo, actualizaciones azul/verde y canarias).
  • Métricas de Prometheus.

En este tutorial, aprenderás a:

  • Usar Helm para provisionar Argo CD en tu clúster DOKS.
  • Mantener sincronizado el estado de las aplicaciones del clúster de Kubernetes con un repositorio Git (utilizar principios de GitOps).
  • Implementar y gestionar aplicaciones a través de Argo CD.

Después de completar todos los pasos de este tutorial, deberías tener un clúster DOKS con Argo CD desplegado, que:

  • Maneje la reconciliación del clúster, a través de CRDs de Aplicación.
  • Maneje las versiones de Helm, utilizando fuentes de Helm definidas dentro de los CRDs de la aplicación.

Visión general de DOKS y Argo CD para lanzamientos de Helm

El diagrama siguiente muestra cómo Argo CD gestiona las aplicaciones Helm alojadas utilizando un repositorio Git:

Tabla de Contenidos

Prerrequisitos

Para completar este tutorial, necesitarás:

  1. A working DOKS cluster that you have access to. Please follow the Starter Kit DOKS Setup Guide to find out more.to find out more.
  2. A GitHub repository and branch, to store Argo CD and your applications manifests. Must be created beforehand.
  3. A Git client, for cloning the Starter Kit repository.
  4. La CLI de Kubectl, para interactuar con Kubernetes. Siga estas instrucciones para conectarse a su clúster con kubectl y doctl.
  5. La CLI de Argo, para interactuar con Argo CD usando la interfaz de línea de comandos.
  6. Kubeseal, para cifrar secretos e interacción con el controlador de Secretos Sellados.
  7. Helm, para gestionar versiones y actualizaciones de Argo CD (opcional, pero recomendado en general para sistemas de producción).

Entendiendo los Conceptos de Argo CD para el Despliegue de Aplicaciones

Argo CD utiliza el concepto central de Aplicación para gestionar el despliegue y el ciclo de vida de las aplicaciones. Dentro de un manifiesto de aplicación de Argo CD, se define el repositorio Git que aloja las definiciones de tu aplicación, así como el clúster de Kubernetes correspondiente para desplegar las aplicaciones. En otras palabras, una aplicación de Argo CD define la relación entre un repositorio fuente y un clúster de Kubernetes. Es un diseño muy conciso y escalable, donde puedes asociar múltiples fuentes (repositorios Git) y clústeres de Kubernetes correspondientes.

A major benefit of using applications is that you don’t need to deploy Argo to each cluster individually. You can use a dedicated cluster for Argo, and deploy applications to all clusters at once from a single place. This way, you avoid Argo CD downtime or loss, in case other environments have issues or get decommissioned.

Además, puedes agrupar aplicaciones similares en un Proyecto. Los proyectos permiten agrupar lógicamente aplicaciones y roles/permisos asociados cuando se trabaja con varios equipos. Cuando no se especifica, cada nueva aplicación pertenece al proyecto default. El proyecto default se crea automáticamente y no tiene restricciones. Se puede modificar el proyecto predeterminado, pero no se puede eliminar.

El Starter Kit utiliza el proyecto default para comenzar rápidamente con Argo CD. Luego, aprenderás cómo crear una Aplicación para cada componente del Starter Kit, y utilizar charts de Helm como la fuente de la aplicación. Argo CD no se limita solo a las fuentes de Helm, y también puedes aprovechar el poder de Kustomize, Ksonnet, Jsonnet, etc. Por favor, echa un vistazo a la página de fuentes de la aplicación para más detalles.

Aunque puedes utilizar la interfaz gráfica de usuario (interfaz web) de Argo CD para crear aplicaciones, el Starter Kit se basa en el enfoque declarativo de GitOps, mediante manifiestos YAML. Cada configuración YAML actúa como una receta para cada aplicación, por lo que puede almacenarse en un repositorio Git. Esto significa que siempre puedes recrear tu configuración de Argo CD si vuelves a crear tu entorno o te mudas a otro clúster. Más importante aún, puedes realizar auditorías y hacer un seguimiento de cada cambio a través del historial de Git. Es una buena práctica tener también los archivos de configuración de Argo CD en un repositorio Git separado al utilizado para el desarrollo de tu aplicación. Puedes leer la mejor página de prácticas en el sitio web oficial de documentación de Argo CD para obtener más información sobre el tema.

Nota importante:
Un aspecto importante a tener en cuenta es que por defecto Argo CD no sincroniza automáticamente tus nuevas aplicaciones. Cuando se crea por primera vez una Aplicación de ArgoCD, su estado es OutOfSync. Significa que el estado del repositorio Git apuntado por la Aplicación de ArgoCD no coincide con el estado del clúster de Kubernetes. La creación de una nueva Aplicación de ArgoCD no desencadena un despliegue automático en el clúster de destino.

Para habilitar la sincronización automática y la eliminación de recursos huérfanos (poda), es necesario crear una syncPolicy. También puedes configurar Argo CD para revertir automáticamente los cambios manuales realizados a través de kubectl. Puedes leer más sobre las políticas de sincronización automática en el sitio de documentación oficial.

Un CRD de Aplicación típico que utiliza una fuente de repositorio Git se ve así:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-apps
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: my-apps
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Explicaciones para la configuración anterior:

  • spec.project: Indica a Argo CD qué proyecto usar para la aplicación (default en este ejemplo).
  • spec.source.repoURL: URL del repositorio Git utilizada para sincronizar el estado del clúster.
  • spec.source.targetRevision: Revisión del repositorio Git utilizada para la sincronización (también puede ser un nombre de rama o etiqueta).
  • spec.source.path: Ruta del repositorio Git donde se almacenan los archivos fuente (manifiestos YAML).
  • spec.destination.server: Dirección del clúster de Kubernetes de destino. Normalmente apunta a https://kubernetes.default.svc, si Argo CD está utilizando el mismo clúster donde está desplegado.
  • spec.destination.namespace: Espacio de nombres de Kubernetes que se utilizará para su aplicación.
  • spec.syncPolicy.automated: Habilita la sincronización automatizada de aplicaciones en su clúster con un repositorio Git.
  • spec.syncPolicy.automated.prune: Prune especifica si se deben eliminar recursos del clúster que ya no se encuentran en las fuentes como parte de la sincronización automatizada.
  • spec.syncPolicy.automated.selfHeal: Especifica si se deben revertir los recursos a su estado deseado después de una modificación manual en el clúster (por ejemplo, a través de kubectl).

También puede utilizar repositorios Helm como fuente para instalar aplicaciones en su clúster. Un CRD de aplicación típico que utiliza una fuente de repositorio Helm se ve así (similar al ejemplo de repositorio Git, excepto que se utiliza un repositorio de gráficos Helm):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sealed-secrets
  namespace: argocd
spec:
  project: default
  source:
    chart: sealed-secrets
    repoURL: https://bitnami-labs.github.io/sealed-secrets
    targetRevision: 2.4.0
    helm:
      releaseName: sealed-secrets
      values: |
        replicaCount: 2
  destination:
    server: "https://kubernetes.default.svc"
    namespace: kubeseal

Explicaciones para la configuración anterior:

  • spec.source.chart: Gráfico Helm que se utilizará como fuente para la aplicación.
  • spec.source.repoURL: URL del repositorio de gráficos Helm.
  • spec.source.targetRevision: Versión del gráfico Helm que se utilizará para la aplicación.
  • spec.source.helm.releaseName: Nombre de la versión de Helm que se creará en su clúster de Kubernetes.
  • spec.source.helm.values: Especifica los valores de Helm que se pasarán a la plantilla de helm, normalmente definidos como un bloque.
  • spec.destination.server: Dirección del clúster de Kubernetes de destino. Normalmente apunta a https://kubernetes.default.svc, si Argo CD está utilizando el mismo clúster donde está desplegado.
  • spec.destination.namespace: Espacio de nombres de Kubernetes para utilizar en tu aplicación.

Por favor, continúa leyendo más sobre los conceptos fundamentales de Argo CD en el sitio web de documentación oficial. A continuación, descubrirás las opciones de instalación disponibles para implementar Argo CD en tu clúster de Kubernetes.

Instalando Argo CD

Argo CD se puede instalar usando kubectl o Helm:

  1. Usando kubectl y un archivo de manifiesto de instalación. Este método no ofrece control directo para varios parámetros de instalación. Si no estás muy familiarizado con las instalaciones basadas en Helm, esta es la opción más directa para comenzar.
  2. Instalación basada en Helm. Ofrece un control más granular para la implementación y el ciclo de vida de la aplicación Argo CD. Recomendado para configuraciones de HA (Alta Disponibilidad) y si Argo CD se utiliza en producción.

A continuación, dependiendo de las funciones que desees disponibles, tienes dos opciones:

  • Modo Multi-Tenante. Este tipo de instalación se utiliza típicamente para atender a múltiples equipos de desarrollo de aplicaciones en la organización y es mantenido por un equipo de plataforma. Los usuarios finales pueden acceder a Argo CD a través del servidor API utilizando la Interfaz de Usuario Web o el CLI argocd.
  • Modo solo Core. Esta es una instalación reducida, sin la interfaz de usuario gráfica, servidor API, SSO, etc., e instala la versión liviana (no-HA) de cada componente.

El Kit de Inicio está utilizando los modos Multi-Tenant y Alta Disponibilidad para instalar Argo CD en su clúster DOKS. De esta manera, tendrá una configuración confiable y explorará todas las funciones disponibles, incluida la interfaz de usuario. Por favor, visite la página de documentación de métodos de instalación para obtener más información sobre el tema.

Instalación basada en Kubectl

Este método requiere kubectl, y es un proceso de dos pasos:

  1. Crear un namespace para desplegar Argo CD en sí mismo.
  2. Ejecutar el manifiesto de instalación de alta disponibilidad, a través de kubectl.

Por favor, ejecute los siguientes comandos en orden:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

Ahora, por favor, proceda a verificar si la instalación fue exitosa. Primero, verifique si todos los despliegues de Argo CD están saludables:

kubectl get deployments -n argocd

La salida se ve similar a (verifique la columna READY – todos los Pods deben estar en ejecución):

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 51s argocd-dex-server 1/1 1 1 50s argocd-notifications-controller 1/1 1 1 50s argocd-redis-ha-haproxy 3/3 3 3 50s argocd-repo-server 2/2 2 2 49s argocd-server 2/2 2 2 49s

El servidor de Argo CD debe tener un valor mínimo de 2 para el replicaset en el modo HA. Si por alguna razón algunos despliegues no están saludables, por favor, verifique los eventos de Kubernetes y los registros de los Pods del componente afectado.

Instalación basada en Helm

Este método requiere que Helm esté instalado en su máquina local. El Kit de inicio proporciona un archivo de valores de Helm listo para usar para comenzar e instala Argo CD en modo HA (sin escalado automático).

Por favor, siga los siguientes pasos para completar la instalación basada en Helm:

  1. Primero, clone el directorio del Kit de inicio (si aún no lo ha hecho) y cambie al directorio de su copia local:
git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git
cd Kubernetes-Starter-Kit-Developers
  1. A continuación, agregue el repositorio de Helm de Argo CD:
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update argo 
  1. Ahora, busque en el repositorio Helm de argo los gráficos disponibles para instalar:
helm search repo argo

La salida se parece a:

Output
NAME CHART VERSION APP VERSION DESCRIPTION argo/argo 1.0.0 v2.12.5 A Helm chart for Argo Workflows argo/argo-cd 4.9.4 v2.4.0 A Helm chart for Argo CD, a declarative, GitOps... ...
  1. Luego, abra e inspeccione el archivo de valores de Helm de Argo CD proporcionado en el repositorio del Kit de inicio utilizando un editor de su elección (preferiblemente con soporte para lint YAML). Por ejemplo, puede usar VS Code:
code 14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v4.9.4.yaml
  1. Finalmente, despliegue Argo CD en su clúster DOKS:
HELM_CHART_VERSION="4.9.4"
helm install argocd argo/argo-cd --version "${HELM_CHART_VERSION}" \
  --namespace argocd \
  --create-namespace \
  -f "14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v${HELM_CHART_VERSION}.yaml"

–create-namespace \

Nota:
Se utiliza una versión específica para el gráfico de Helm. En este caso, se elige la versión 4.9.4, que corresponde a la versión 2.4.0 de la aplicación. Es una buena práctica en general bloquear en una versión específica. Esto ayuda a tener resultados predecibles y permite el control de versiones a través de Git.

helm ls -n argocd

Ahora, verifique si el lanzamiento de Helm fue exitoso:

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
argocd  argocd          1               2022-03-23 11:22:48.486199 +0200 EET    deployed        argo-cd-4.9.4   v2.4.0

La salida se parece a (el valor de la columna STATUS debe establecerse en deployed):

kubectl get deployments -n argocd

Finalmente, verifique el estado del despliegue de la aplicación Argo CD:

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 2m9s argocd-dex-server 1/1 1 1 2m9s argocd-notifications-controller 1/1 1 1 2m9s argocd-redis-ha-haproxy 3/3 3 3 2m9s argocd-repo-server 2/2 2 2 2m9s argocd-server 2/2 2 2 2m9s

La salida se parece a (verifique la columna READY – todos los Pods deben estar en ejecución):

El servidor Argo CD debe tener un valor mínimo de replicaset de 2 para el modo HA. Si, por alguna razón, algunos despliegues no están saludables, verifique los eventos de Kubernetes y los registros de los Pods del componente afectado.

También puede encontrar más información sobre el gráfico Helm de Argo CD accediendo al repositorio mantenido por la comunidad.

A continuación, aprenderás cómo acceder y explorar las principales características de la interfaz de usuario gráfica proporcionada por Argo CD.

Accediendo y Explorando la Interfaz Web de Argo CD

Una de las características interesantes que Argo CD ofrece es la interfaz web, utilizada para realizar varias tareas administrativas y ver el estado del despliegue de la aplicación. Puedes crear aplicaciones utilizando la interfaz gráfica de usuario e interactuar con Argo CD de diversas formas. Otra característica importante es la capacidad de inspeccionar el estado de cada aplicación y acceder a los eventos de Kubernetes, así como a los registros de tu aplicación. Además, Argo CD proporciona una representación visual de todos los objetos de Kubernetes (replicasets, pods, etc.) que está utilizando cada despliegue de aplicación.

kubectl port-forward svc/argocd-server -n argocd 8080:443

La interfaz web se puede acceder mediante el reenvío de puertos del servicio Kubernetes argocd-server. Por favor, ejecuta el siguiente comando en una terminal:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

A continuación, abre un navegador web y navega a localhost:8080 (ignora por ahora los certificados TLS no válidos). Serás recibido con la página de inicio de sesión de Argo CD. El nombre de usuario de administrador predeterminado es admin, y la contraseña se genera aleatoriamente en el momento de la instalación. Puedes obtenerla ejecutando el siguiente comando:

A continuación, serás redirigido a la página del panel de aplicaciones. Desde aquí, puedes ver, crear o gestionar aplicaciones a través de la interfaz de usuario (también está disponible un editor YAML), así como realizar operaciones de sincronización o actualización:

Si haces clic en cualquier mosaico de aplicación, también se muestra una representación visual de todos los objetos involucrados:

En la siguiente sección, puedes gestionar tus proyectos de aplicación, repositorios y clústeres:

Por último, la sección de información de usuario muestra los usuarios disponibles y permite actualizar la contraseña de administrador:

Puedes jugar y explorar cada sección y subsección en detalle para ver todas las funciones disponibles. A continuación, aprenderás cómo usar el contraparte de la interfaz de línea de comandos (CLI), llamado argocd.

Conociendo la CLI de Argo CD

argocd
Usage:
  argocd [flags]
  argocd [command]

Available Commands:
  account     Manage account settings
  admin       Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access
  app         Manage applications
  cert        Manage repository certificates and SSH known hosts entries
  cluster     Manage cluster credentials
  completion  output shell completion code for the specified shell (bash or zsh)
  context     Switch between contexts
  gpg         Manage GPG keys used for signature verification
  help        Help about any command
...

Argo CD permite utilizar el mismo conjunto de funciones tanto a través de la interfaz web como mediante la CLI. Para usar la CLI argocd, necesitas abrir una ventana de terminal separada y simplemente escribir argocd sin ningún argumento. Por defecto, mostrará los comandos y opciones disponibles:

argocd app --help

Para cualquier comando o subcomando, puedes invocar la página de ayuda correspondiente utilizando el siguiente patrón: argocd <comando/subcomando> --help. Por ejemplo, si deseas verificar qué opciones están disponibles para el comando app:

Manage Applications
Usage:
  argocd app [flags]
  argocd app [command]

Examples:
  La salida se verá similar a:
  argocd app list
  
  # Listar todas las aplicaciones.
  argocd app get my-app
...

# Obtener los detalles de una aplicación

Por favor, continúa y explora otros comandos/subcomandos también para ver todas las opciones disponibles. A continuación, aprenderás cómo configurar tu primera aplicación de Argo CD, que desplegará automáticamente todos los componentes del Kit de Inicio.

Inicializando Aplicaciones de Argo CD

En una instalación nueva, Argo CD no sabe de dónde sincronizar las aplicaciones ni qué repositorios Git están disponibles para obtener los manifiestos de la aplicación. Por lo tanto, el primer paso es realizar una operación única llamada inicialización. Puedes realizar todas las operaciones presentadas en esta sección utilizando tanto la CLI de argocd como la interfaz gráfica de usuario.

Existen múltiples formas de inicializar tu clúster (por ejemplo, mediante scripts), pero normalmente, los usuarios de Argo CD utilizan el patrón de aplicación de aplicaciones. Esto significa que comenzarás creando una aplicación principal utilizando la CLI de argocd (o la interfaz web), la cual a su vez hará referencia e inicializará el resto de las aplicaciones en tu clúster de Kubernetes.

Preparando la Estructura del Repositorio Git

clusters
└── dev
    └── helm
        ├── cert-manager-v1.8.0.yaml
        ├── nginx-v4.1.3.yaml
        ├── prometheus-stack-v35.5.1.yaml
        ├── sealed-secrets-v2.4.0.yaml
        └── velero-v2.29.7.yaml

Primero necesitas preparar tu repositorio Git para utilizar una estructura consistente. En el siguiente ejemplo, crearás una estructura de layout para tu repositorio Git similar a:

  1. Por favor, abre una terminal y sigue los siguientes pasos para crear el layout de tu repositorio Git:
git clone <YOUR_ARGOCD_GIT_REPOSITORY_ADDRESS>
  1. Primero, clona tu repositorio de git utilizado para probar Argo CD (asegúrate de reemplazar los marcadores <> correspondientemente):
cd <YOUR_GIT_REPO_LOCAL_COPY_DIRECTORY>
mkdir -p clusters/dev/helm
  1. A continuación, cambia al directorio de tu copia local y crea la estructura de directorios (asegúrate de reemplazar los marcadores <> correspondientemente):
CERT_MANAGER_CHART_VERSION="1.8.0"
NGINX_CHART_VERSION="4.1.3"
PROMETHEUS_CHART_VERSION="35.5.1"
SEALED_SECRETS_CHART_VERSION="2.4.0"
VELERO_CHART_VERSION="2.29.7"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml" > "clusters/dev/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/nginx-v${NGINX_CHART_VERSION}.yaml" > "clusters/dev/helm/nginx-v${NGINX_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml" > "clusters/dev/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml" > "clusters/dev/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/velero-v${VELERO_CHART_VERSION}.yaml" > "clusters/dev/helm/velero-v${VELERO_CHART_VERSION}.yaml"
  1. Copia los manifiestos de aplicación proporcionados para cada componente en el repositorio de Starter Kit (también puedes echar un vistazo y ver cómo está estructurado cada manifiesto):

Finalmente, realiza los cambios y haz un commit, y luego haz un push al origen.

A continuación, crearás la implementación de la aplicación principal y permitirás que Argo CD sincronice automáticamente todas las aplicaciones del Starter Kit en tu clúster DOKS.

Usando el Patrón de Aplicaciones a través de la CLI de Argo CD

En esta sección, aprenderás cómo utilizar la CLI de argocd para crear y utilizar el patrón app of apps para implementar todos los componentes del Starter Kit en tu clúster DOKS. La siguiente imagen ilustra el concepto principal:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Primero, necesitas redirigir el servidor principal de Argo CD en tu máquina local en una ventana de terminal separada:

ADMIN_USER="admin"
ADMIN_PASSWD="$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)"
argocd login localhost:8080 --username $ADMIN_USER --password $ADMIN_PASSWD --insecure

A continuación, se requiere acceso al servidor API de Argo CD para que funcione la CLI de argocd. Utilizando otra ventana de terminal, necesitas autenticar el cliente argocd con tu instancia del servidor Argo CD:

Output
'admin:login' logged in successfully Context 'localhost:8080' updated

La salida se verá similar a:

argocd app create starter-kit-apps \
    --dest-namespace argocd \
    --dest-server https://kubernetes.default.svc \
    --repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
    --path clusters/dev/helm

Luego, por favor ejecuta el siguiente comando para crear la aplicación principal starter-kit-apps (asegúrate de reemplazar los marcadores <> correspondientemente):

  • –dest-namespace argocd \
  • –dest-server https://kubernetes.default.svc \
  • El comando anterior creará una nueva aplicación Argo CD llamada starter-kit-apps en el espacio de nombres argocd, configurada para:

Apuntar al mismo clúster de Kubernetes donde está desplegado Argo CD, porque --dest-server está configurado como https://kubernetes.default.svc.

argocd app sync starter-kit-apps 

Usar el repositorio de GitHub establecido por el argumento --repo para sincronizar tu clúster.

Output
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd sealed-secrets-controller OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd velero OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd ingress-nginx OutOfSync Missing ... ... GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE argoproj.io Application argocd sealed-secrets-controller Synced application.argoproj.io/sealed-secrets-controller created argoproj.io Application argocd ingress-nginx Synced application.argoproj.io/ingress-nginx created argoproj.io Application argocd kube-prometheus-stack Synced application.argoproj.io/kube-prometheus-stack created argoproj.io Application argocd velero Synced application.argoproj.io/velero created argoproj.io Application argocd cert-manager Synced application.argoproj.io/cert-manager created

Escanear y aplicar todos los manifiestos de aplicación encontrados en el directorio clusters/dev/helm (argumento --path).

A continuación, necesitas sincronizar la aplicación starter-kit-apps (recuerda que Argo CD no sincroniza nada por defecto a menos que se especifique):

argocd app list

La salida se verá similar a:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY ... ingress-nginx https://kubernetes.default.svc ingress-nginx default OutOfSync Missing Auto-Prune ... cert-manager https://kubernetes.default.svc cert-manager default OutOfSync Missing Auto-Prune ... kube-prometheus-stack https://kubernetes.default.svc monitoring default OutOfSync Missing Auto-Prune ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default OutOfSync Missing Auto-Prune ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune ...

Después de que finalice el comando anterior, deberías ver una nueva aplicación presente en el panel principal de tu servidor de Argo CD. Por favor, abre un navegador web y navega a http://localhost:8080. Luego selecciona la pestaña Aplicaciones, y haz clic en el mosaico starter-kit-apps (nota el patrón aplicación de aplicaciones al observar el gráfico de composición):

argocd app sync -l argocd.argoproj.io/instance=starter-kit-apps

También puedes inspeccionar las nuevas aplicaciones a través de la CLI:

La salida se parece a:

argocd app list

La aplicación principal starter-kit-apps aparecerá como sincronizada pero las aplicaciones secundarias estarán fuera de sincronización. A continuación, puedes sincronizar todo usando la interfaz web o mediante la CLI:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS ... ingress-nginx https://kubernetes.default.svc ingress-nginx default Synced Healthy Auto-Prune <none> ... cert-manager https://kubernetes.default.svc cert-manager default Synced Healthy Auto-Prune <none> ... kube-prometheus-stack https://kubernetes.default.svc monitoring default Synced Healthy Auto-Prune <none> ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default Synced Healthy Auto-Prune <none> ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune SyncError ...

La operación de sincronización puede tardar un tiempo en completarse (incluso hasta 5-10 minutos), dependiendo de la complejidad y el número de objetos de Kubernetes de todas las aplicaciones que se estén implementando.

Después de un tiempo, por favor lista todas las aplicaciones nuevamente:

argocd app create starter-kit-apps \
  --dest-namespace argocd \
  --dest-server https://kubernetes.default.svc \
  -repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
  --path clusters/dev/helm \
   --sync-policy automated \
  --auto-prune \
  --self-heal
  • La salida se parece a (nota que todas las aplicaciones están sincronizadas ahora):
argocd app get velero

El despliegue de la aplicación Velero fallará y quedará intencionalmente en el estado SyncError como ejercicio para que el lector se familiarice y aprenda a diagnosticar problemas de aplicación en Argo CD. Consulta la sección de Pistas a continuación para ver cómo diagnosticar problemas de aplicación en Argo CD.

La inicialización del la aplicación principal es una operación única. En los cambios de Git subsiguientes para cada aplicación, Argo CD detectará la desviación y aplicará los cambios requeridos. Argo CD utiliza un mecanismo de sondeo de forma predeterminada para detectar cambios en tu repositorio de Git. El intervalo de actualización predeterminado está configurado en 3 minutos. En lugar de depender de un mecanismo de sondeo, también puedes aprovechar el poder de los ganchos de Git. Visita el sitio web de documentación oficial para aprender cómo crear y configurar Argo CD para usar ganchos de Git.

Output
Name: velero Project: default Server: https://kubernetes.default.svc Namespace: velero URL: https://argocd.example.com/applications/velero Repo: https://vmware-tanzu.github.io/helm-charts Target: 2.27.3 Path: SyncWindow: Sync Allowed Sync Policy: Automated (Prune) Sync Status: OutOfSync from 2.27.3 Health Status: Missing CONDITION MESSAGE LAST TRANSITION SyncError Failed sync attempt to 2.27.3: one or more objects failed to apply (dry run) (retried 5 times). 2022-03-24 12:14:21 +0200 EET GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE velero.io VolumeSnapshotLocation velero default Failed SyncFailed PostSync error validating data: ValidationError(VolumeSnapshotLocation.spec): missing required field "provider" in io.velero.v1.VolumeSnapshotLocation.spec velero.io BackupStorageLocation velero default Failed SyncFailed PostSync error validating data: [ValidationError(BackupStorageLocation.spec.objectStorage): missing required field "bucket" in io.velero.v1.BackupStorageLocation.spec.objectStorage, ValidationError(BackupStorageLocation.spec): missing required field "provider" in io.velero.v1.BackupStorageLocation.spec] ...

Pistas: Si lo deseas, puedes configurar la aplicación principal para que se sincronice automáticamente (y también habilitar la auto-curación y la poda automática), puedes usar el siguiente comando (no olvides reemplazar los marcadores <> según corresponda):

–dest-namespace argocd \

–dest-server https://kubernetes.default.svc \

–sync-policy automated \

–auto-prune \

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

En caso de cualquier fallo de sincronización, siempre puedes inspeccionar los eventos de Kubernetes para la aplicación en cuestión (a través de argocd app get <nombre_aplicación>):

La salida se ve similar a:

  • A continuación, aprenderás cómo usar el patrón de aplicación de aplicaciones y realizar los mismos pasos a través de la interfaz gráfica de usuario de Argo CD.
  • Uso del Patrón de Aplicación de Aplicaciones a través de la Interfaz Web de Argo CD
  • En esta sección, aprenderás cómo usar la interfaz web de Argo CD para crear y utilizar el patrón de aplicación de aplicaciones para implementar todos los componentes del Starter Kit en tu clúster DOKS. La siguiente imagen ilustra el concepto principal:
  • Como muestra el diagrama anterior, el inicio de una nueva aplicación a través de la interfaz web es muy similar a su contraparte de línea de comandos. La única diferencia es que navegarás entre diferentes paneles/ventanas y usarás operaciones de apuntar y hacer clic. Detrás de escena, Argo CD creará los CRDs de aplicación necesarios y aplicará cambios a tu clúster de Kubernetes.
  • Primero, por favor abre un navegador web e inicia sesión en la consola web de Argo CD. El nombre de usuario predeterminado es admin, y la contraseña predeterminada se obtiene a través de:
  • Una vez iniciada la sesión, serás redirigido a la página del panel de aplicaciones (en una instalación nueva, el panel de aplicaciones estará vacío). A continuación, haz clic en el botón Crear Aplicación. Se abrirá un nuevo panel que solicitará los detalles de la aplicación:
  • Por favor, completa cada campo de manera apropiada:

Nombre de la Aplicación: El nuevo nombre de la aplicación (por ejemplo, starter-kit-apps).

Proyecto: El nombre del proyecto al que pertenece esta aplicación (cuando uses Argo CD por primera vez, puedes usar default).

Política de Sincronización y Opciones de Sincronización: Configura la política de sincronización y las opciones (por ejemplo, Manual, Automático, número de intentos, intervalo entre intentos, etc.).

URL del Repositorio Fuente: La dirección URL de tu repositorio en GitHub, por ejemplo, https://github.com/<TU_NOMBRE_DE_USUARIO_EN_GITHUB>/<NOMBRE_DEL_REPO_DE_ARGOCD_EN_GITHUB>.git.

Ruta del Repositorio Fuente: La ruta del directorio del repositorio en GitHub donde se almacenan los manifiestos de la aplicación (por ejemplo, clusters/dev/helm).

URL del Cluster de Destino: El clúster de Kubernetes de destino para sincronizar con tu repositorio en GitHub (por ejemplo, https://kubernetes.default.svc para el clúster local donde está desplegado Argo CD).

Namespace de Destino: El espacio de nombres del clúster de Kubernetes de destino para usar en las aplicaciones de Argo CD (argocd, generalmente).

Después de completar todos los detalles de la aplicación, haz clic en el botón Crear en la parte superior. Se mostrará un nuevo mosaico de aplicación en la página del panel de aplicaciones:

Si haces clic en el mosaico de la aplicación, puedes observar el patrón de aplicación de aplicaciones, al mirar el gráfico de composición:

Si observas la imagen anterior, notarás que todas las aplicaciones están marcadas como OutOfSync. El siguiente paso es iniciar una operación de sincronización en la aplicación principal. Luego, todas las aplicaciones secundarias también se sincronizarán. Por favor, presiona el botón Sync en el mosaico de la aplicación principal. Aparecerá un nuevo panel en el lado derecho (nota que todas las aplicaciones secundarias están seleccionadas abajo):

Deja los valores predeterminados, luego presiona el botón Synchronize en la parte superior y observa cómo Argo CD cascada la operación de sincronización a todas las aplicaciones:

La implementación de la aplicación Velero fallará y se dejará intencionalmente en el estado SyncError como ejercicio para que el lector se familiarice y aprenda a diagnosticar problemas de aplicación en Argo CD. Consulta la sección de Sugerencias a continuación para ver cómo diagnosticar problemas de aplicación en Argo CD.

Si todo va bien, todas las aplicaciones deberían tener un borde verde y el estado debería ser Saludable y Sincronizado. El proceso de arranque es una operación única. En cambios posteriores de Git para cada aplicación, Argo CD detectará la desviación y aplicará los cambios necesarios. Argo CD utiliza un mecanismo de sondeo de forma predeterminada para detectar cambios en tu repositorio Git. El intervalo de actualización predeterminado está establecido en 3 minutos. En lugar de depender de un mecanismo de sondeo, también puedes aprovechar el poder de los webhooks de Git. Visita el sitio web de documentación oficial para aprender cómo crear y configurar Argo CD para usar webhooks.

Pistas: Si lo deseas, puedes configurar la aplicación principal para que se sincronice automáticamente estableciendo el valor del campo Política de sincronización en Automático. Para habilitar la auto-curación y la poda automática, marca las casillas de verificación Recursos de poda y Auto curación:

En caso de fallos de sincronización, siempre puedes inspeccionar los eventos de Kubernetes para la aplicación en cuestión. Utilizando la interfaz web, puedes navegar hasta el mosaico de la aplicación afectada:

Luego, haz clic en el enlace del mensaje Sync failed marcado en color rojo, desde la sección LAST SYNC RESULT en el encabezado de la página de la aplicación. Se abrirá un nuevo panel que muestra información útil sobre por qué falló la operación de sincronización:

Conjuntos de aplicaciones es otra característica poderosa ofrecida por Argo CD. El Controlador de ApplicationSet es un subproyecto de Argo CD, que agrega automatización de aplicaciones a través de definiciones templadas. Esta función te ayuda a evitar repeticiones en los manifiestos de tu aplicación (haciendo uso del principio DRY).

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app
spec:
  generators:
    - list:
        elements:
          - cluster: dev
            url: https://kubernetes.dev.svc
          - cluster: qa
            url: https://kubernetes.qa.svc
          - cluster: prod
            url: https://kubernetes.prod.svc
  template:
    metadata:
      name: '{{cluster}}-app'
    spec:
      project: default
      source:
        repoURL: https://github.com/myrepo/my-applicationset.git
        targetRevision: HEAD
        path: clusters/{{cluster}}/my-apps
      destination:
        server: '{{url}}'
        namespace: argocd

El controlador de ApplicationSet se instala junto con Argo CD (dentro del mismo espacio de nombres), y genera automáticamente aplicaciones de Argo CD basadas en el contenido de un nuevo Recurso Personalizado (CR) de ApplicationSet.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-app
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-applicationset.git
    targetRevision: HEAD
    path: clusters/dev/my-apps
  destination:
    server: https://kubernetes.dev.svc
    namespace: argocd

Nota:
A partir de la versión 2.3.x de Argo CD, no es necesario instalar el Controlador de ApplicationSet por separado porque es parte de la instalación principal de Argo CD. Starter Kit está utilizando versión >= 2.3.1, así que no necesitas hacer nada.

La idea principal de un ApplicationSet se basa en tener una lista de valores que actúan como un generador, y una plantilla que se completa con los valores de la lista de entrada. Para cada elemento de la lista, se genera una nueva plantilla de aplicación en secuencia. Básicamente, defines un CRD de ApplicationSet y luego lo dejas generar tantos CRDs de Aplicación ArgoCD como desees, basados en los valores de entrada. Así, en lugar de crear y manejar múltiples manifiestos de Aplicación, gestionas todo mediante un único manifiesto – el ApplicationSet.

Este concepto también simplifica la gestión de configuraciones multi-cluster y multi-entorno mediante el uso de plantillas de aplicación parametrizadas. Los conjuntos de aplicaciones también incluyen otros generadores, además de los Generadores de Lista:

Generador de Clúster: Utiliza los clústeres definidos por Argo CD para plantillas de aplicaciones.

argocd app delete starter-kit-apps

Generador de Git: Utiliza los archivos/directorios de un repositorio Git para plantillas de aplicaciones.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
...

Un CRD de ApplicationSet típico que utiliza un Generador de Lista se ve así:

Aplicar el ApplicationSet anterior a tu clúster de Kubernetes generará tres aplicaciones de Argo CD. Por ejemplo, la aplicación del entorno dev se representa de la siguiente manera:

Los motores de plantillas son muy poderosos por naturaleza y ofrecen muchas posibilidades. Por favor, visita el sitio web principal de documentación de ApplicationSet para aprender más sobre esta función.

Desinstalación de Aplicaciones de Argo CD

La desinstalación (o eliminación) de aplicaciones gestionadas por Argo CD se realiza eliminando el manifiesto correspondiente de la fuente del repositorio Git. En caso de aplicaciones creadas usando el patrón de aplicación de aplicaciones, solo necesitas eliminar la aplicación principal (ya sea a través de la CLI o la interfaz web). Entonces, todas las aplicaciones secundarias se eliminarán como parte del proceso.

  • Cómo eliminar la aplicación principal starter-kit-apps (incluidas las aplicaciones secundarias) usando la CLI de argocd:
  • Si deseas asegurarte de que las aplicaciones secundarias y todos sus recursos se eliminen cuando se elimine la aplicación principal, asegúrate de agregar el finalizador apropiado a tu definición de aplicación:

Source:
https://www.digitalocean.com/community/developer-center/implementing-gitops-using-argo-cd