Kustomize
Kustomize te permite mantener un conjunto de YAMLs "base" y aplicar modificaciones (parches) específicas por entorno (dev, prod) sin duplicar código.
-
Bases y Overlays:
-
Base: El directorio con los YAMLs genéricos de tu aplicación (Deployment, Service) y un archivo
kustomization.yamlque los agrupa. -
Overlay: Un directorio separado (ej.
prod/odev/) que hereda la Base y le aplica cambios específicos. -
Strategic Merge Patches: Son archivos YAML incompletos que Kustomize fusiona inteligentemente con los recursos de la Base. Kustomize sabe, por ejemplo, que si envías un parche de un Deployment con una nueva variable de entorno, debe agregarla a la lista de contenedores existente basándose en el nombre del contenedor.
-
Components:
Imagina que tienes tres entornos:
dev,stagingyprod. Tienes unabase/común.Ahora, el equipo de seguridad te pide que inyectes un sidecar de monitoreo (Datadog) en
devy enprod, pero NO enstaging(para ahorrar costos).Si solo usas overlays tradicionales, tienes dos malas opciones:
-
Duplicar código: Copiar y pegar el mismo
patch.yamldel sidecar en la carpetadev/y en la carpetaprod/. (Rompe la regla de oro: Don't Repeat Yourself). -
Jerarquías complejas: Crear una "sub-base" llamada
base-con-monitoreo/que herede debase/, y hacer quedevyprodhereden de ahí. A medida que sumas más características (ej. "usar base de datos externa", "inyectar caché Redis"), este árbol de herencias se vuelve una pesadilla inmanejable.
Los Components te permiten definir características "a la carta" (como si fueran plugins o mixins). Creas el parche del sidecar una sola vez como un Componente, y luego simplemente le dices a los overlays de
devyprodque "activen" ese componente.Un Componente encapsula un comportamiento específico y reutilizable que no pertenece estrictamente a la ruta vertical de herencia.
-
[!IMPORTANT] Para ver cómo queda tu YAML final fusionado sin aplicarlo en el clúster, NUNCA apliques a ciegas.
Usa siemprekubectl kustomize <directorio>(el equivalente a un dry-run de Kustomize).Usar
kubectl apply -kpara aplicar los cambios.
Laboratorio Práctico
Vamos a armar un escenario real de despliegue multi-entorno.
1. Problema
Tienes una aplicación web básica definida en un directorio base/. El equipo de operaciones te pide crear el entorno de Producción (prod/). En producción, la aplicación no puede correr con la configuración por defecto de la base; necesita alta disponibilidad y una variable de entorno específica.
Aquí tienes la estructura de tu Base:
# base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.21
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
2. Objetivo
Crear el overlay de producción en un nuevo directorio llamado prod/. Este overlay debe aplicar un Strategic Merge Patch sobre el Deployment original para lograr lo siguiente:
- Aumentar las réplicas a
3. - Añadir la variable de entorno
ENV: PRODal contenedor nginx.
3. Restricciones
- No puedes modificar los archivos dentro del directorio
base/. - Debes usar la estructura estándar de Kustomize (un
kustomization.yamly un archivopatch.yamlen el directorioprod/).
4. Tu turno
Para resolver este laboratorio, necesito que me des tu solución para los dos archivos que irán dentro del directorio prod/:
- ¿Cómo escribirías el archivo
prod/patch.yaml(recuerda que es un YAML incompleto, solo con lo necesario para el merge)?
Solución
[embedmd]:# (../k8s-lab/kustomize/overlays/prod/kustomization.yaml) [embedmd]:# (../k8s-lab/kustomize/overlays/prod/patch.yaml)- ¿Qué comando exacto de
kubectlejecutarías para desplegar este overlay en el clúster?