Capitulo 19: GitOps con Flux

Por: Artiko
k3skubernetesgitopsfluxcd

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

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:

  1. Crea el repositorio si no existe
  2. Instala los componentes de Flux en el cluster
  3. Configura Flux para observar el path clusters/mi-cluster del repositorio
  4. 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

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:

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:

  1. Desarrollador modifica un manifest (ej: actualizar imagen de un deployment)
  2. git push al repositorio GitOps
  3. Flux detecta el cambio en el siguiente ciclo de reconciliacion
  4. Flux aplica el cambio al cluster con kubectl apply
  5. 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 —>