GitOps con Flux CD

Hace unas semanas te hablé de Argo CD y cómo esta herramienta nos ayuda con la filosofía GitOps en nuestros entornos con Kubernetes. Hoy quiero hablarte de su mayor contrincante, Flux CD, para que tengas más opciones a la hora de adentrarte en este mundo.

Instalar la herramienta de Flux CD

Antes de comenzar a trabajar con esta herramienta, lo primero que debes hacer es instalarla en tu máquina local. En mi caso voy a utilizar Homebrew para hacerlo en MacOs:

brew install fluxcd/tap/flux

Pero aquí puedes encontrar el resto de instalaciones para otros sistemas operativos.

Generar un Personal Access Token para tu usuario de GitHub

En este ejemplo voy a utilizar GitHub para alojar los repositorios de código fuente. Es por ello que necesito unas credenciales que me permitan trabajar con ellos. Para ello necesitas el nombre de usuario y un Personal Access Token, que puedes crear yendo al menú > Settings:

y dentro de este, selecciona la opción Developer settings y Personal Access Tokens. También puedes acceder directamente desde aquí: https://github.com/settings/tokens/new

Dentro de este apartado deberías de crear un PAT con los permisos de repo:

Crea un PAT para que FluxCD interactúe con tus repos de GitHub

Configura estas dos variables de entorno con tu usuario y el token generado:

# Configure GitHub variables
export GITHUB_TOKEN=<YOUR_PERSONAL_ACCESS_TOKEN>
export GITHUB_USER=<YOUR_USER_NAME>

Configurar Flux CD en tu clúster de Kubernetes

En mi ejemplo estoy usando AKS, pero también puedes usar entornos de desarrollo como kind o k3d. Una vez que tengas un clúster con el que probar, utiliza la herramienta que acabas de instalar de la siguiente manera:

flux bootstrap github \
  --owner=$GITHUB_USER \
  --repository=gitops-demo \
  --branch=main \
  --path=./clusters/aks-cluster \
  --personal

Esto generará un nuevo repositorio en tu cuenta de GitHub donde alojará los archivos necesarios para el despliegue de Flux CD en tu clúster. Clona el mismo y accede a él para continuar:

git clone https://github.com/$GITHUB_USER/gitops-demo
cd gitops-demo

Si ahora compruebas el namespace flux-system verás que tienes varios recursos dentro de él:

kubectl get all -n flux-system

Ahora ya solo queda desplegar alguna aplicación para que veas cómo sería el proceso.

Desplegar aplicación de ejemplo

Para este artículo voy a aprovechar el ejemplo que te mostré con Kustomize, el cuál despliega un WordPress. Lo primero que debes hacer es dar de alta el repositorio en la configuración de Flux CD:

flux create source git kustomize-demo \
  --url=https://github.com/0GiS0/kustomize-demo \
  --branch=main \
  --interval=30s \
  --export > ./clusters/aks-cluster/apps/kustomize-demo.yaml

Esto generará un nuevo archivo en tu repositorio llamado kustomize-demo.yaml como el que sigue:

---
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: GitRepository
metadata:
  name: kustomize-demo
  namespace: flux-system
spec:
  interval: 30s
  ref:
    branch: main
  url: https://github.com/0GiS0/kustomize-demo

Ahora, para ver reflejados los cambios en tu clúster haz commit del archivo:

git add -A && git commit -m "Add kustomize demo source"
git push

Después de unos segundos, puedes comprobar a través del comando flux get all que ya está registrado en la configuración:

➜ flux get all
NAME                            READY   MESSAGE                                                         REVISION                                        SUSPENDED 
gitrepository/flux-system       True    Fetched revision: main/3607aaeaca956d0e07eaa02229c51f5521892929 main/3607aaeaca956d0e07eaa02229c51f5521892929   False    
gitrepository/kustomize-demo    True    Fetched revision: main/9840c1fc39156cc02d1aac3a92f0202c677172df main/9840c1fc39156cc02d1aac3a92f0202c677172df   False    
NAME                            READY   MESSAGE                                                         REVISION                                        SUSPENDED 
kustomization/flux-system       True    Applied revision: main/3607aaeaca956d0e07eaa02229c51f5521892929 main/3607aaeaca956d0e07eaa02229c51f5521892929   False    

Ahora que ya lo tienes, lo siguiente que necesitas es generar el manifiesto que despliegue el entorno de dev definido con Kustomize:

flux create kustomization kustomize-demo-dev \
  --source=kustomize-demo \
  --path="./dev" \
  --prune=true \
  --interval=5m \
  --export > ./clusters/aks-cluster/kustomize-demo-dev.yaml

Con ello obtendrás de nuevo un YAML con la configuración definida a través de la herramienta (podrías generarlo de forma manual, pero al iniciarse es mucho más sencillo así):

---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: kustomize-demo-dev
  namespace: flux-system
spec:
  interval: 5m0s
  path: ./dev
  prune: true
  sourceRef:
    kind: GitRepository
    name: kustomize-demo

Publica los cambios en el repo:

git add -A && git commit -m "Deploy kustomize demo - dev enviroment"
git push

y utiliza el siguiente comando para saber cuándo los cambios han sido aplicados en el clúster:

flux get kustomizations --watch

La salida que verás después de unos segundos será la siguiente:

➜ flux get kustomizations --watch
NAME            READY   MESSAGE                                                         REVISION                                        SUSPENDED 
flux-system     True    Applied revision: main/3607aaeaca956d0e07eaa02229c51f5521892929 main/3607aaeaca956d0e07eaa02229c51f5521892929   False    
flux-system     Unknown reconciliation in progress      main/3607aaeaca956d0e07eaa02229c51f5521892929   False
kustomize-demo-dev      False   waiting to be reconciled                False
kustomize-demo-dev      False   waiting to be reconciled                False
kustomize-demo-dev      Unknown reconciliation in progress              False
flux-system     True    Applied revision: main/31fdb000dff3d2b6c8a162f3c3fb33d9b75a8eb5 main/31fdb000dff3d2b6c8a162f3c3fb33d9b75a8eb5   False
kustomize-demo-dev      True    Applied revision: main/9840c1fc39156cc02d1aac3a92f0202c677172df main/9840c1fc39156cc02d1aac3a92f0202c677172df   False

Ahora comprueba que efectivamente tu WordPress está correctamente desplegado en el namespace dev:

kubectl get all -n dev

A partir de ahora, cada vez que hagas cualquier cambio en el repositorio kustomize-demo, tu clúster con Flux CD estará atento y aplicará los cambios, en este caso, para la configuración del entorno dev. Lo ideal es seguir una estructura para el repositorio como la que se detalla en la documentación oficial.

A diferencia de Argo CD, Flux CD está pensando para ser utilizado a través de la línea de comandos, aunque hay una interfaz web en fase experimental que por ahora no está en las prioridades del proyecto.

¡Saludos!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.