GitOps con Argo CD

Hoy he estado jugando con Argo CD, una herramienta que nos facilita GitOps que ahora está tan de moda. En este artículo te cuento cómo probarlo con un ejemplo sencillo.

Desplegar Argo CD en tu clúster de Kubernetes

Lo primero que debes hacer es desplegar Argo CD en tu clúster. Para mi ejemplo he creado uno en AKS con los siguientes comandos:

RESOURCE_GROUP="ArgoCD-Demo"
AKS_NAME="aks-argocd-demo"
LOCATION="North Europe"

az group create -n $RESOURCE_GROUP -l $LOCATION
az aks create -n $AKS_NAME -g $RESOURCE_GROUP --node-count 1 --generate-ssh-keys
az aks get-credentials -n $AKS_NAME -g $RESOURCE_GROUP

Una vez provisionado, necesito lanzar estos dos comandos para desplegar la herramienta:

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

Como ves, he creado un namespace y he desplegado un manifiesto que Argo CD pone a nuestra disposición para que sea lo más sencillo posible.

Ahora que ya lo tienes instalado en tu clúster, ya puedes acceder a su interfaz para ver qué pinta tiene. Como no está expuesto directamente fuera del clúster podemos hacer uso de Port Forwarding para no tener que exponerlo de manera permanente, y que solo sea accesible desde tu máquina:

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

Ahora ya puedes acceder desde http://localhost:8080.

Página de inicio de Argo CD

El usuario con el que debes iniciar sesión es admin. Para recuperar la contraseña necesitas ejecutar el siguiente comando (es recomendable cambiar esta después):

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

Al introducir las credenciales accederás a la interfaz de Argo CD pero todavía no tendrás nada que ver.

Iniciada sesión en Argo CD sin nada que ver

Vale y ahora ¿qué hago con esto? Pues lo siguiente que puedes hacer es desplegar unan aplicación haciendo uso de un repositorio git.

Desplegar una aplicación de ejemplo

En este caso vamos a hacer uso de uno en Github. Para este artículo he creado este 0GiS0/argocd-demo con varios archivos con diferentes recursos. Ahora, en vez de descargarlo en mi local y hacer algo como kubectl apply -f . voy a usar Argo CD para que se ocupe de desplegar todo lo que he definido en este repo. Para ello haz clic en el botón CREATE APPLICATION con esta configuración:

Creación de una aplicación en el clúster de Kubernetes con Argo

Antes de continuar debes indicar también el clúster de Kubernetes de destino, así como el namespace donde se va a instalar.

Configuración del clúster de destino durante la creación de la aplicación

Nota: para tu ejemplo puedes hacer un fork de mi repo y así poder hacer los cambios que consideres.

Si la configuración es correcta, verás que el despliegue comienza:

Desplegando nuestra aplicación en Kubernetes a través de Argo CD

Una vez que finalice (lo sabrás porque aparece con el status Synced y Healthy) podrás seleccionar la aplicación y verás algo como lo siguiente.

Visualización de los recursos desplegados para esta aplicación a través de Argo CD

¿A qué mola? Lo que estás viendo son todos los recursos que se han desplegado provenientes de tu repositorio de Github. Ahora, la magia está en que si modifico cualquiera de los archivos de mi repositorio, por ejemplo el número de instancias que quiero que tenga el frontal de WordPress:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  replicas: 3
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:      
      containers:
        - image: wordpress:4.8-apache
          name: wordpress
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_PASSWORD
              value: wp_password
          ports:
            - containerPort: 80
              name: wordpress
          volumeMounts:
            - name: wordpress-persistent-storage
              mountPath: /var/www/html
      volumes:
        - name: wordpress-persistent-storage
          persistentVolumeClaim:
            claimName: wp-pv-claim

En cuanto haga push de los cambios a mi repo, Argo CD se dará cuenta (comprueba cambios cada 3 minutos):

Argo CD actualiza la aplicación con los cambios del repositorio en GitHub

Para este artículo he elegido la sincronización automática, pero también es posible que esta sea manual y poder comprobar diferencias antes de hacer cualquier cambio. Lo ideal es que tengamos un branch protegido sobre el que no se puedan hacer cambios sin haber pasado antes por una Pull Request, por ejemplo que nos permita validar que todo lo que vamos a sincronizar está en orden.

¡Bienvenido al mundo del GitOps!