Despliega charts de Helm y overlays de Kustomize por entorno
Estructura un repositorio para dev y prod, y evita la trampa del rollout de ConfigMaps.
Las aplicaciones reales se ejecutan en varios entornos que difieren en pequeños detalles: número de réplicas, nombres de host, valores de configuración. Argo CD puede desplegar desde YAML plano, charts de Helm o Kustomize, y detecta cuál usa una carpeta. Esta guía muestra cómo estructurar un repositorio para varios entornos con overlays de Kustomize y con archivos de valores de Helm, y cubre un problema que atrapa a mucha gente con los cambios de configuración. Se apoya en el ejemplo webapp de las guías anteriores.
Elige una estructura: carpetas, no ramas
Puedes modelar los entornos como ramas de larga duración (dev, staging, main), pero eso convierte la promoción en un ejercicio de merge y permite que los entornos se desvíen entre sí. Una sola rama con una carpeta por entorno es más fácil de razonar: todos los entornos se ven lado a lado y un cambio en uno es un diff normal.
Kustomize está pensado para esto: una base compartida más un pequeño overlay por entorno que cambia solo lo que difiere.
Crea una base y overlays de Kustomize
webapp-config/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/
│ └── kustomization.yaml
└── prod/
└── kustomization.yaml
base/kustomization.yaml lista los recursos compartidos:
resources:
- deployment.yaml
- service.yaml
En base/deployment.yaml, haz que el contenedor lea su configuración desde un ConfigMap que cada overlay generará:
envFrom:
- configMapRef:
name: webapp-config
overlays/dev/kustomization.yaml:
resources:
- ../../base
namespace: webapp-dev
replicas:
- name: webapp
count: 2
configMapGenerator:
- name: webapp-config
literals:
- HEADER=Hello from dev
overlays/prod/kustomization.yaml es igual, con namespace: webapp-prod, count: 4 y su propio valor de HEADER.
Apunta una Application a cada overlay
Argo CD detecta un kustomization.yaml en la ruta y lo construye por ti. Crea una Application por entorno:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: webapp-dev
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/webapp-config.git
targetRevision: HEAD
path: overlays/dev
destination:
server: https://kubernetes.default.svc
namespace: webapp-dev
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
prune: true
Para webapp-prod, cambia el nombre, la ruta (overlays/prod) y el namespace, y considera omitir automated para que una persona apruebe las sincronizaciones de producción.
Con Helm, la forma es la misma, pero el origen es un chart y seleccionas el archivo de valores de un entorno:
source:
repoURL: https://github.com/your-org/webapp-config.git
targetRevision: HEAD
path: charts/webapp
helm:
valueFiles:
- values-dev.yaml
Las rutas de valueFiles son relativas a la carpeta del chart, y los archivos posteriores sobrescriben a los anteriores.
Gestiona los cambios de configuración a propósito
Cambia el valor de HEADER en un entorno y compara qué hace cada herramienta:
- Kustomize agrega un hash del contenido a los nombres de los ConfigMaps generados. Un valor nuevo produce un ConfigMap nuevo (
webapp-config-<hash>) y actualiza la referencia del Deployment, lo que desencadena un rollout de los Pods. El ConfigMap anterior queda huérfano, por lo que la aplicación aparece comoOutOfSynchasta que se elimine (prune). Conprune: trueactivado, esto se limpia automáticamente. - Helm actualiza el ConfigMap existente en el mismo lugar. La especificación del Deployment no cambia, así que los Pods en ejecución conservan los valores antiguos y nada le indica a Argo CD ni a Kubernetes que los reinicie.
La solución estándar para Helm es poner un checksum del ConfigMap en la plantilla del Pod, de modo que un cambio de configuración cambie la plantilla y reinicie los Pods. En templates/deployment.yaml:
template:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
Reiniciar el Deployment a mano también funciona una vez, pero no queda registrado en Git, lo que anula el propósito.
Promueve cambios entre entornos
Con esta estructura, la promoción es una secuencia de commits normales. Cambia primero el overlay de dev (por ejemplo, una actualización de imagen con kustomize edit set image webapp=nginx:1.26 ejecutado en overlays/dev), deja que la sincronización automatizada lo aplique y verifica. Luego haz el mismo cambio en overlays/prod y sincroniza, manualmente si has mantenido producción restringida. Un pipeline de CI puede automatizar el commit en dev, y un pull request o una aprobación puede controlar el de producción. Para operar muchos clústeres o entornos desde un solo lugar, mira los ApplicationSets de Argo CD, que generan recursos Application a partir de una plantilla.
Guías populares
-
Push vs Pull: cómo entrega Argo CD en Kubernetes Por qué la entrega basada en pull y dirigida por Git cambia cómo despliegas, proteges y recuperas clústeres. -
Configura multiclúster con Argo CD Gestiona despliegues en varios clústeres. -
Despliega tu primera aplicación con un manifiesto declarativo Apunta Argo CD a un repositorio de Git mediante un recurso Application y observa cómo se sincroniza. -
Controla el comportamiento de sincronización: auto-sync, prune, self-heal y rollback Decide cuándo Argo CD aplica los cambios, qué elimina y cómo deshacer un mal despliegue.