Capítulo 10.2 - Helm Charts
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender la estructura de un Chart Helm
- Crear un Chart desde cero
- Utilizar plantillas Go
- Personalizar con values.yaml
- Gestionar dependencias
- Publicar un Chart
Introducción
Un Chart Helm es un paquete que contiene todos los archivos necesarios para desplegar una aplicación en Kubernetes. Utiliza plantillas para hacer los archivos YAML dinámicos.
Estructura de un Chart
Estructura Completa
my-chart/
├── Chart.yaml # Metadatos del Chart
├── Chart.lock # Bloqueo de dependencias
├── values.yaml # Valores por defecto
├── values.schema.json # Esquema de validación (opcional)
├── templates/ # Plantillas Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # Helpers reutilizables
│ └── NOTES.txt # Notas mostradas tras la instalación
├── charts/ # Charts dependientes (opcional)
└── README.md # Documentación
Crear un Chart
Crear un Chart Básico
# Crear un nuevo Chart
helm create my-chart
# Estructura creada
my-chart/
├── Chart.yaml
├── values.yaml
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl
└── NOTES.txt
Chart.yaml
apiVersion: v2
name: my-chart
description: A Helm chart for my application
type: application
version: 0.1.0
appVersion: "1.0.0"
keywords:
- web
- application
maintainers:
- name: John Doe
email: john@example.com
Plantillas Go
Sintaxis Básica
Las plantillas utilizan la sintaxis de Go templates:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
Variables Disponibles
.Release.Name: Nombre del release.Release.Namespace: Namespace.Chart.Name: Nombre del Chart.Values.*: Valores desde values.yaml.Capabilities.*: Información del clúster
values.yaml
Ejemplo de values.yaml
# Número de réplicas
replicaCount: 3
# Imagen
image:
repository: nginx
tag: "1.20"
pullPolicy: IfNotPresent
# Servicio
service:
type: ClusterIP
port: 80
# Ingress
ingress:
enabled: true
className: nginx
hosts:
- host: example.com
paths:
- path: /
pathType: Prefix
tls: []
# Recursos
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Ejemplo Completo: Chart Web App
Chart.yaml
apiVersion: v2
name: web-app
description: A simple web application
type: application
version: 0.1.0
appVersion: "1.0.0"
values.yaml
replicaCount: 2
image:
repository: myapp
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: nginx
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "web-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "web-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
name: http
resources:
{{- toYaml .Values.resources | nindent 10 }}
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "web-app.selectorLabels" . | nindent 4 }}
templates/_helpers.tpl
{{/*
Etiquetas comunes
*/}}
{{- define "web-app.labels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Etiquetas de selector
*/}}
{{- define "web-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Nombre completo
*/}}
{{- define "web-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name }}
{{- end }}
Instalación de un Chart Local
Instalar
# Desde un directorio local
helm install my-release ./my-chart
# Con valores personalizados
helm install my-release ./my-chart -f custom-values.yaml
# Con valores inline
helm install my-release ./my-chart \
--set replicaCount=5 \
--set image.tag=1.1.0
Actualizar
# Actualizar
helm upgrade my-release ./my-chart
# Con nuevos valores
helm upgrade my-release ./my-chart -f new-values.yaml
Dependencias
Chart.yaml con Dependencias
apiVersion: v2
name: my-app
dependencies:
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
Instalar las Dependencias
# Descargar las dependencias
helm dependency update
# Ver las dependencias
helm dependency list
Empaquetado y Distribución
Crear un Paquete
# Crear un paquete .tgz
helm package ./my-chart
# Resultado: my-chart-0.1.0.tgz
Publicar en un Repositorio
# Agregar al repositorio
helm repo index . --url https://charts.example.com
# Subir el paquete
# (según su método de almacenamiento)
Comandos Útiles
Validación
# Linter
helm lint ./my-chart
# Template con dry-run
helm install my-release ./my-chart --dry-run --debug
# Ver los valores calculados
helm template my-release ./my-chart
Test
# Instalar en modo test
helm install my-release ./my-chart --dry-run
# Ver el manifiesto generado
helm get manifest my-release
Buenas Prácticas
1. Estructura Clara
Organizar las plantillas de manera lógica.
2. Helpers
Utilizar _helpers.tpl para el código reutilizable.
3. Documentación
Documentar todos los valores en values.yaml.
4. Validación
Utilizar values.schema.json para validar los valores.
5. Versionado
Seguir semantic versioning para los Charts.
Resumen
En este capítulo, usted ha aprendido:
Estructura: Chart.yaml, values.yaml, templates/, charts/
Plantillas Go: Sintaxis con dobles llaves, variables disponibles
values.yaml: Valores por defecto personalizables
Helpers: _helpers.tpl para código reutilizable
Dependencias: Gestión vía Chart.yaml
Empaquetado: helm package para crear .tgz
Instalación: helm install desde local o repositorio
Buenas prácticas: Estructura, helpers, documentación, versionado
Próximos Pasos
Capítulo 10.3: Plantillas Avanzadas y Hooks
Lab 10.2: Personalización con values.yaml
Lab 10.3: Creación de un Chart Personalizado
Capítulo creado el: diciembre 2024