Hooks de ciclo de vida y tests de chart
Ejecuta trabajo puntual alrededor de una instalación o actualización y escribe un test que verifique que un release realmente funciona.
La mayor parte de lo que hace un chart es declarar recursos que se mantienen en ejecución. A veces necesitas algo que se ejecute una sola vez en un momento concreto: una migración de base de datos antes de una actualización, un trabajo de limpieza tras una desinstalación o una comprobación de que el release realmente funciona una vez levantado. Helm cubre ambos casos con hooks y tests de chart.
Qué es un hook
Un hook es un recurso de Kubernetes corriente, con más frecuencia un Job, anotado para indicarle a Helm cuándo ejecutarlo en relación con una instalación, actualización, rollback o desinstalación:
# templates/hooks/pre-install-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Values.appName }}-pre-install
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "0"
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
template:
spec:
restartPolicy: Never
containers:
- name: migrate
image: myorg/webapp-migrate:1.0
command: ["./run-migrations.sh"]
La anotación helm.sh/hook es lo que convierte esto en un hook en lugar de un recurso normal que Helm rastrea como parte del release. Los puntos de hook habituales son pre-install, post-install, pre-upgrade, post-upgrade, pre-rollback, post-rollback, pre-delete y post-delete; la lista completa, que incluye un par relacionados con tests, está en la documentación de hooks de Helm.
Cómo secuencia Helm un hook
Para un hook pre-install:
- Helm renderiza el recurso del hook y lo crea en el clúster, antes que cualquier otra cosa del chart.
- Helm espera a que alcance un estado de listo o completado (un
Jobque se ejecuta hasta terminar cuenta). - Solo entonces Helm renderiza y aplica el resto de los recursos del chart.
post-install invierte los pasos 1 y 3: los recursos normales del chart entran primero y luego se ejecuta el hook. Un hook pre-upgrade que falla detiene la actualización, que es justo el objetivo de ejecutar una migración ahí en lugar de esperar que tenga éxito después.
Peso del hook y política de eliminación
helm.sh/hook-weight ordena varios hooks en el mismo punto: los números más bajos se ejecutan primero, como cadenas de texto ("0", "5"), y los hooks sin peso toman 0 por defecto. helm.sh/hook-delete-policy controla la limpieza, ya que un Job completado de otro modo permanece indefinidamente en el clúster:
before-hook-creation(el predeterminado): elimina el recurso de hook anterior antes de crear uno nuevo, para que los reintentos no choquen con un Job sobrante del mismo nombre.hook-succeeded: elimina el recurso una vez que se completa con éxito.hook-failed: lo elimina si falla, útil cuando prefieres limpiar a dejar un Job fallido para inspeccionarlo; omítelo si quieres hacerkubectl logsde un fallo antes de que se elimine.
Una combinación pre-install,hook-succeeded, por ejemplo, significa que el hook se ejecuta una vez, tiene éxito y se limpia solo, sin dejar rastro más allá de la propia salida de tu Job; añade también hook-failed si tampoco quieres que un intento fallido se quede por ahí.
Pruébalo
kubectl get jobs -w
En otra terminal:
helm install web ./webapp
Mirando la primera terminal, deberías ver aparecer el Job del hook, ejecutarse, completarse y (según su política de eliminación) desaparecer, todo antes de que aparezca el Deployment del chart. Es la forma más fácil de ver realmente la secuenciación en lugar de darla por buena.
Tests de chart: verifica un release una vez levantado
Un test de chart es un Job que se ejecuta bajo demanda, después de que exista un release, para comprobar que realmente funciona:
# templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ .Values.appName }}-test-connection"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox:1.36
command: ["wget", "-qO-", "{{ .Values.appName }}"]
restartPolicy: Never
helm install web ./webapp
helm test web
helm test ejecuta todos los recursos anotados con helm.sh/hook: test en el release e informa de éxito o fallo según el estado de salida de cada Pod; un wget que obtiene respuesta sale con 0, uno que no puede conectar no. A diferencia de los hooks de instalación/actualización, los recursos de test no se eliminan automáticamente por defecto; ejecuta helm test --logs para ver su salida en línea, o límpialos tú mismo entre ejecuciones.
Cuándo usar cada uno
- Usa un hook cuando algo deba ocurrir exactamente una vez, en un punto concreto del ciclo de vida de un release, y el resto del despliegue deba esperar o reaccionar a ello: migraciones de esquema antes de una actualización, notificar a un sistema externo tras la instalación, limpiar recursos externos antes de una desinstalación.
- Usa un test de chart para cualquier cosa que quieras volver a ejecutar bajo demanda contra un release que ya está en marcha, con mayor frecuencia como smoke test tras
helm installohelm upgradeen un pipeline de CI, sin que forme parte de la secuencia de despliegue en sí.
Ambos son recursos de Kubernetes corrientes por debajo de las anotaciones, así que todo lo que ya sepas sobre depurar un Job o un Pod, kubectl describe, kubectl logs, se aplica directamente.
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. -
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. -
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.