Concepto clave
Helm es el gestor de paquetes para Kubernetes, similar a apt para Ubuntu o pip para Python. Imagina que tu aplicación de recomendación necesita varios componentes: un servicio web, una base de datos Redis para caché, y un worker para procesar datos. Sin Helm, tendrías que crear manualmente decenas de archivos YAML para cada componente. Con Helm, empaquetas todo en un chart (un paquete reutilizable) que puedes instalar, actualizar o desinstalar con un solo comando.
La magia de Helm está en las plantillas. En lugar de escribir archivos YAML estáticos, escribes plantillas con variables. Cuando instalas el chart, Helm rellena esas variables con tus valores específicos (como el nombre del entorno o la configuración de recursos). Esto te permite tener la misma aplicación corriendo en desarrollo, staging y producción, solo cambiando los valores, no el código.
Cómo funciona en la práctica
Vamos a desplegar nuestro sistema de recomendación paso a paso. Primero, necesitas tener Helm instalado. Si usas minikube o un cluster local, puedes instalarlo con:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashLuego, estructura tu proyecto. Un chart básico tiene esta estructura:
recomendacion-chart/
Chart.yaml # Metadatos del chart
values.yaml # Valores por defecto
templates/ # Plantillas YAML
deployment.yaml
service.yaml
configmap.yaml
charts/ # Dependencias (otros charts)Para instalar tu chart en el cluster, ejecutas:
helm install mi-recomendacion ./recomendacion-chartEsto creará todos los recursos definidos en tus plantillas. Si necesitas cambiar algo, como aumentar la memoria del servicio web, editas values.yaml y ejecutas:
helm upgrade mi-recomendacion ./recomendacion-chartHelm actualizará solo lo necesario, manteniendo el estado de tu aplicación.
Código en acción
Veamos un ejemplo real. Este es un fragmento de templates/deployment.yaml para nuestro servicio de recomendación:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}-web
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
containers:
- name: web
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
ports:
- containerPort: {{ .Values.service.port }}
resources:
requests:
memory: {{ .Values.resources.requests.memory }}
cpu: {{ .Values.resources.requests.cpu }}
limits:
memory: {{ .Values.resources.limits.memory }}
cpu: {{ .Values.resources.limits.cpu }}Y este es el values.yaml correspondiente:
replicaCount: 2
image:
repository: mi-registry/recomendacion-modelo
tag: v1.0
service:
port: 5000
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"Cuando Helm procesa esto, genera un Deployment con 2 réplicas, usando la imagen mi-registry/recomendacion-modelo:v1.0, exponiendo el puerto 5000, con los recursos especificados. Si quieres cambiar a 3 réplicas para producción, solo modificas replicaCount en values.yaml y ejecutas helm upgrade.
Errores comunes
Error 1: No versionar los charts. Si subes cambios sin incrementar la versión en Chart.yaml, Helm no podrá hacer seguimiento de las actualizaciones. Solución: Usa versionado semántico (v1.0.0, v1.0.1) y actualiza siempre Chart.yaml antes de empaquetar.
Error 2: Valores por defecto muy restrictivos. Si defines valores como "production" en values.yaml, será difícil reutilizar el chart en otros entornos. Solución: Usa valores genéricos en values.yaml y sobrescríbelos con --set o archivos de valores específicos (values-prod.yaml).
Error 3: No probar las plantillas antes de instalar. Un error de sintaxis en una plantilla puede desplegar recursos incorrectos. Solución: Usa helm template para renderizar las plantillas y ver el YAML generado sin instalarlo:
helm template ./recomendacion-chartError 4: Olvidar dependencias. Si tu chart necesita Redis, pero no lo declaras en Chart.yaml, la instalación fallará. Solución: Define dependencias en Chart.yaml y ejecuta helm dependency update.
Checklist de dominio
- Puedo crear un chart desde cero con la estructura correcta de directorios
- Sé usar variables en plantillas ({{ .Values.xxx }}, {{ .Chart.Name }})
- Puedo instalar, actualizar y desinstalar charts con helm install/upgrade/uninstall
- Sé sobrescribir valores usando --set o archivos YAML externos
- Puedo empaquetar un chart con helm package y subirlo a un repositorio
- Sé manejar dependencias entre charts
- Puedo debuggear problemas usando helm template y helm get
Despliega tu sistema de recomendación con Helm en un cluster local
En este ejercicio, tomarás un sistema de recomendación básico ya containerizado y lo desplegarás en Kubernetes usando Helm.
- Prepara el entorno: Asegúrate de tener minikube o un cluster Kubernetes local funcionando. Instala Helm si no lo tienes.
- Descarga el código base: Clona este repositorio que contiene el chart incompleto:
git clone https://github.com/ejemplo/recomendacion-helm.git - Completa el chart: El chart tiene los siguientes archivos incompletos:
templates/deployment.yaml: Faltan las variables para la imagen y los recursosvalues.yaml: Faltan valores para replicaCount y service.portChart.yaml: Faltan la versión y descripción
- Instala el chart: Ejecuta
helm install mi-recomendacion ./recomendacion-helmy verifica que todos los pods estén corriendo conkubectl get pods. - Actualiza la configuración: Crea un archivo
values-prod.yamlque cambie replicaCount a 3 y los límites de memoria a 1Gi. Actualiza el despliegue conhelm upgrade mi-recomendacion ./recomendacion-helm -f values-prod.yaml. - Verifica el funcionamiento: Expón el servicio con
kubectl port-forwardy prueba el endpoint de recomendaciones en tu navegador.
- Usa helm template para ver el YAML generado antes de instalar
- Recuerda que los nombres en las plantillas son case-sensitive
- Si la instalación falla, usa helm status para ver detalles
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.