Capitulo 19: GitOps con Flux
Capitulo 19: GitOps con Flux
< Volver al Indice del Tutorial
Que es GitOps
GitOps es un modelo operativo donde Git es la unica fuente de verdad para la infraestructura y las aplicaciones. En lugar de ejecutar kubectl apply manualmente o desde un pipeline CI, un agente dentro del cluster observa un repositorio Git y aplica automaticamente cualquier cambio.
El flujo tradicional:
Desarrollador → CI Pipeline → kubectl apply → Cluster
El flujo GitOps:
Desarrollador → git push → Git Repo ← Agente GitOps → Cluster
La diferencia clave es la direccion: en GitOps, el cluster pull los cambios desde Git en lugar de que alguien push cambios al cluster.
Por que GitOps
Auditoria Completa
Cada cambio en la infraestructura queda registrado como un commit en Git. Sabes quien cambio que, cuando y por que. No mas “alguien modifico algo en produccion y no sabemos quien”.
Rollback Instantaneo
Si un cambio rompe algo, reviertes el commit en Git y el agente restaura el estado anterior automaticamente. No necesitas recordar el estado previo ni ejecutar comandos manuales.
Consistencia
El cluster siempre refleja lo que esta en Git. Si alguien hace un cambio manual con kubectl, el agente lo detecta y lo revierte. Esto elimina la deriva de configuracion.
Automatizacion
Una vez configurado, los despliegues ocurren automaticamente al hacer push. Los equipos de desarrollo pueden desplegar sin acceso directo al cluster.
Flux CD
Flux es una herramienta GitOps para Kubernetes, graduada en la CNCF. Se instala dentro del cluster como un conjunto de controladores que observan repositorios Git, charts de Helm y otros origenes.
Componentes de Flux
- Source Controller: Gestiona origenes de datos (repos Git, Helm repos, OCI)
- Kustomize Controller: Aplica manifests Kubernetes usando Kustomize
- Helm Controller: Instala y actualiza releases de Helm
- Notification Controller: Envia alertas sobre eventos de reconciliacion
Instalar Flux
Prerequisitos
# Instalar el CLI de Flux
curl -s https://fluxcd.io/install.sh | sudo bash
# Verificar prerequisitos
flux check --pre
Bootstrap con GitHub
El bootstrap instala Flux en el cluster y configura el repositorio Git:
export GITHUB_TOKEN=tu-token-personal
flux bootstrap github \
--owner=tu-usuario \
--repository=mi-cluster-gitops \
--branch=main \
--path=clusters/mi-cluster \
--personal
Este comando:
- Crea el repositorio si no existe
- Instala los componentes de Flux en el cluster
- Configura Flux para observar el path
clusters/mi-clusterdel repositorio - Hace commit de la configuracion de Flux al repositorio
Bootstrap con GitLab
export GITLAB_TOKEN=tu-token
flux bootstrap gitlab \
--owner=tu-grupo \
--repository=mi-cluster-gitops \
--branch=main \
--path=clusters/mi-cluster
Estructura del Repositorio GitOps
Una estructura recomendada para el repositorio:
mi-cluster-gitops/
├── clusters/
│ └── mi-cluster/
│ ├── flux-system/ # Configuracion de Flux (auto-generada)
│ ├── apps.yaml # Kustomization que apunta a apps/
│ └── infrastructure.yaml # Kustomization que apunta a infrastructure/
├── apps/
│ ├── mi-app/
│ │ ├── kustomization.yaml
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── ingress.yaml
│ └── otra-app/
│ ├── kustomization.yaml
│ └── helmrelease.yaml
└── infrastructure/
├── cert-manager/
│ ├── kustomization.yaml
│ └── helmrelease.yaml
└── monitoring/
├── kustomization.yaml
└── helmrelease.yaml
- clusters/: Configuracion por cluster. Si tienes varios clusters, cada uno tiene su directorio.
- apps/: Manifests de las aplicaciones.
- infrastructure/: Componentes compartidos (cert-manager, monitoring, ingress).
Kustomization: Reconciliacion Automatica
Una Kustomization de Flux observa un directorio del repositorio y aplica los manifests periodicamente:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
interval: 5m
sourceRef:
kind: GitRepository
name: flux-system
path: ./apps
prune: true
timeout: 3m
Parametros clave:
- interval: Cada cuanto Flux verifica cambios en Git (5 minutos)
- path: Directorio dentro del repositorio a observar
- prune: Eliminar recursos que ya no estan en Git
- sourceRef: Referencia al repositorio Git configurado por Flux
Con prune: true, si eliminas un archivo del repositorio, Flux elimina el recurso correspondiente del cluster.
HelmRelease: Charts de Helm Declarativos
Para instalar charts de Helm via GitOps, defines un HelmRelease:
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 1h
url: https://charts.bitnami.com/bitnami
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: default
spec:
interval: 10m
chart:
spec:
chart: redis
version: "18.x"
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
values:
architecture: standalone
auth:
enabled: true
password: mi-password-seguro
Flux instala el chart, y si cambias los values en Git, Flux actualiza el release automaticamente.
Flujo Completo: Push a Produccion
El ciclo completo de un cambio con GitOps:
- Desarrollador modifica un manifest (ej: actualizar imagen de un deployment)
- git push al repositorio GitOps
- Flux detecta el cambio en el siguiente ciclo de reconciliacion
- Flux aplica el cambio al cluster con
kubectl apply - Flux reporta el resultado (exito o error)
Ejemplo Practico
Desplegar una aplicacion completa via GitOps. Crea los archivos en el repositorio:
apps/web-app/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
apps/web-app/service.yaml:
apiVersion: v1
kind: Service
metadata:
name: web-app
namespace: default
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
apps/web-app/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
Haz push y Flux despliega la aplicacion. Para actualizar la imagen:
# Editar deployment.yaml, cambiar image a nginx:1.28
git add . && git commit -m "feat: actualizar web-app a nginx 1.28"
git push
Flux aplica el cambio automaticamente en el siguiente ciclo.
Verificar Estado de Flux
# Estado general
flux get all
# Estado de las Kustomizations
flux get kustomizations
# Estado de los HelmReleases
flux get helmreleases
# Forzar reconciliacion inmediata
flux reconcile kustomization apps
# Ver logs de Flux
flux logs
Ventajas de GitOps en K3s
K3s y GitOps son una combinacion natural. K3s simplifica el cluster y GitOps simplifica las operaciones. El equipo no necesita acceso SSH a los servers ni conocer kubectl avanzado. Todo se gestiona via pull requests en Git, con revision de codigo y aprobaciones antes de que los cambios lleguen al cluster.
Siguiente: Capitulo 20: Tips de Produccion —>