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!