HomelabKubernetes

GitOps en casa: despliega tu homelab con ArgoCD (2026)

Si tienes un clúster Kubernetes y sigues aplicando cambios a mano con kubectl apply, este artículo es para ti. Te voy a contar cómo montar un pipeline GitOps completo con ArgoCD, el estándar de facto para despliegue declarativo en Kubernetes.

¿Qué es GitOps y por qué te interesa?

GitOps es un modelo de operaciones donde tu repositorio de Git es la fuente de verdad única para todo lo que se ejecuta en tu clúster. Cada cambio que haces en el repo se refleja automáticamente en Kubernetes. Esto significa:

Instalando ArgoCD en K3s

ArgoCD se instala en su propio namespace. Es tan sencillo como:

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

En mi clúster K3s tuve que usar --server-side=true porque ArgoCD tiene CRDs con anotaciones que superan el límite de 262KB de K3s. Es un detalle importante si montas el cluster en Raspberry Pis.

Acceso a la UI de ArgoCD

Por defecto, el servidor de ArgoCD no está expuesto. La forma más rápida de acceder:

# Obtener la contraseña inicial
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

# Port-forward para acceder a la UI
kubectl port-forward -n argocd svc/argocd-server 8080:443

Usuario: admin. La UI es potente: puedes ver el estado de cada aplicación, sincronizar manualmente, ver diferencias entre Git y el clúster, y hacer rollbacks con un click.

Patrón App of Apps

El patrón App of Apps es la forma correcta de organizar un repo GitOps. En lugar de tener una Application de ArgoCD por cada servicio, tienes una Application raíz que despliega todas las demás:

k8s-repo/
├── applications/       # Apps de ArgoCD (1 por servicio)
│   ├── root.yaml       # App raíz que despliega las demás
│   ├── authelia.yaml
│   ├── wordpress.yaml
│   ├── vault.yaml
│   ├── nextcloud.yaml
│   └── ...
├── manifests/          # Manifiestos YAML de cada app
│   ├── authelia/
│   ├── wordpress/
│   ├── vault/
│   └── ...
├── values/             # Valores de Helm (para charts multi-source)
└── namespaces/         # Namespaces declarativos

La App raíz se parece a esto:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/tu-user/tu-repo.git
    targetRevision: HEAD
    path: applications
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Cada Application hija apunta a su propio directorio de manifests:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: wordpress
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/tu-user/tu-repo.git
    targetRevision: HEAD
    path: manifests/wordpress
  destination:
    server: https://kubernetes.default.svc
    namespace: wordpress
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Helm multi-source en ArgoCD

ArgoCD 2.6+ soporta fuentes múltiples. Esto es perfecto para apps que usan charts de Helm con valores personalizados:

spec:
  sources:
    - repoURL: https://charts.bitnami.com/bitnami
      chart: wordpress
      targetRevision: 18.*
      helm:
        valueFiles:
          - $values/values/wordpress.yaml
    - repoURL: https://github.com/tu-user/tu-repo.git
      ref: values

Auto-reparación: la magia de GitOps

Lo mejor de ArgoCD es el auto-healing. Si alguien entra al clúster y borra un pod o modifica un deployment, ArgoCD lo detecta y lo restaura al estado definido en Git en cuestión de segundos. Esto da una tranquilidad enorme.

Conclusión

GitOps con ArgoCD cambia la forma de gestionar un clúster. Pasas de operar a base de comandos a operar a base de commits. Y en un homelab con recursos limitados como un clúster de Raspberry Pis, tener un sistema que se auto-repare y gestione los despliegues por ti es una bendición.

En mi setup, cada servicio está en su propio directorio de manifests, con su Application de ArgoCD, todo versionado en GitHub. Y lo mejor: puedo hacer cambios desde el móvil con un commit y ArgoCD lo aplica solo. Eso es libertad.