Un chart, muchos entornos: archivos de valores para dev, staging y prod
Sobrescribe solo lo que difiere entre entornos y entiende el orden en que se fusionan los valores.
El values.yaml de un chart contiene valores predeterminados razonables, pero dev, staging y producción rara vez comparten un namespace, un número de réplicas o un valor de configuración. Esta guía cubre cómo superponer archivos de valores adicionales por entorno, sin mantener copias separadas del propio chart. Se apoya en el chart webapp de la guía anterior.
Mantén values.yaml como base compartida
Deja en values.yaml todo lo que deba ser idéntico en todas partes, el nombre de la aplicación, el repositorio de imágenes. Solo lo específico de cada entorno pertenece a un archivo de sobrescritura:
# values-dev.yaml
namespace: dev
config:
customHeader: "welcome to dev"
# values-prod.yaml
namespace: prod
replicaCount: 5
config:
customHeader: "welcome to production"
Un archivo pasado con -f no reemplaza a values.yaml, se fusiona encima de él. values-dev.yaml solo necesita mencionar namespace y config.customHeader; todo lo demás, appName, image, pasa del archivo base sin cambios.
Haz referencia al namespace en tus plantillas
Añade el valor y úsalo dondequiera que un manifiesto necesite declarar su namespace:
# values.yaml (añade un valor predeterminado)
namespace: default
# templates/deployment.yaml, templates/service.yaml, templates/configmap.yaml
metadata:
name: {{ .Values.appName }}
namespace: {{ .Values.namespace }}
Instala con el archivo de valores de un entorno
kubectl create namespace dev
kubectl create namespace prod
helm install web-dev ./webapp -f values-dev.yaml -n dev
helm install web-prod ./webapp -f values-prod.yaml -n prod
Aquí hay dos cosas que hacen trabajos relacionados pero distintos: -n dev le dice a Helm en qué namespace guardar los metadatos propios del release, y metadata.namespace dentro de las plantillas le dice a Kubernetes en qué namespace va cada recurso. Mantenerlos iguales, que el release viva en el mismo namespace que lo que desplegó, es práctica estándar y evita confusiones más adelante cuando ejecutes helm list -n dev y esperes ver todo lo que realmente se está ejecutando allí.
helm list -A
kubectl get all -n dev
kubectl get all -n prod
curl <dev-pod-ip> # o kubectl port-forward, según NOTES.txt
Confirma que cada entorno muestra su propio customHeader y su propio número de réplicas.
El orden completo de precedencia
Helm fusiona valores de varias fuentes, cada una sobrescribiendo a las anteriores:
values.yaml, los valores predeterminados del propio chart.- El
values.yamlde un chart padre, si este chart se usa como dependencia (no se cubre aquí). - Cualquier archivo pasado con
-f, en el orden dado; los posteriores ganan a los anteriores. - Los flags
--set,--set-stringo--set-json, que ganan a todos los archivos.
helm upgrade web-dev ./webapp -f values-dev.yaml --set replicaCount=1
--set es cómodo para una sobrescritura puntual o una prueba rápida, pero para cualquier cosa que quieras reproducir, ponla en un archivo y súbela al control de versiones. Un flag --set escrito en una terminal no deja ningún registro de lo que realmente se desplegó.
Dos formas de comprobar lo que produjo una fusión
Antes de confiar en una instalación o una actualización, mira el resultado:
helm template ./webapp -f values-prod.yaml
helm get values web-prod
helm template -f renderiza el chart con un archivo de valores dado exactamente como lo haría install, sin tocar el clúster, así que puedes comparar directamente (diff) la salida de dos entornos. helm get values (tras la instalación) muestra los valores realmente registrados en un release en vivo, que es lo que hay que comprobar cuando un release en ejecución no coincide con lo que esperas que produzca un archivo.
Una nota sobre secretos
Los archivos de valores son texto plano, así que no pongas credenciales reales en uno subido a Git. Un reparto habitual es: configuración no sensible por entorno en values-<env>.yaml, y los secretos inyectados con --set desde un almacén de secretos de CI, mediante una herramienta como Sealed Secrets o SOPS, o haciendo que el chart haga referencia a un Secret de Kubernetes creado fuera de Helm en lugar de incrustar el valor en values.yaml.
Guías populares
-
Anatomía de un chart de Helm: charts, values, plantillas y releases La estructura de carpetas que comparte todo chart y los tres conceptos que hacen de Helm algo más que un empaquetador de YAML. -
Crea tu primer chart de Helm a partir de manifiestos existentes Convierte un Deployment, un Service y un ConfigMap en un chart con plantillas, y luego instálalo y actualízalo. -
Gestiona releases: instalar, actualizar, revertir y desinstalar Los comandos que cubren todo el ciclo de vida de un release y cómo el historial de revisiones hace posible el rollback.