Saltar al contenido principal

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