Helm Charts: Empaquetando tu aplicación

ahioros

Guillermo Garcia

Posted on August 28, 2024

Helm Charts: Empaquetando tu aplicación

Seguimos con nuestro primer Helm Chart. Ya en el anterior post te enseñe como instalar helm y tus primeros pasos.

Creación de un Chart

En este paso, crearemos un Chart para nuestra aplicación. Hacemos esto a traves de la herramienta Helm.

helm create nginx-chart
helm create nginx-chart
Enter fullscreen mode Exit fullscreen mode

Image description

Esto nos genera la siguiente estructura de directorios y archivos:

Image description

donde:

  • values.yaml es para las configuraciones de la aplicación.
  • Chart.yaml son los metadatos del Chart (como la versión del paquete y el nombre del paquete, etc.).
  • charts/ aquí puedes poner Charts que son dependencias de tu Chart principal, por ejemplo puedes hacer un chart que se llame "monitoreo" y que depende charts como "grafana", "prometheus", "thanos", etc.
  • templates/ aquí están las plantillas de kubernetes, aquí están las plantillas de los recursos de kubernetes, despliegues (deployments), servicios (services), configuraciones (configmaps), secretos (secrets), ingress, etc.
  • templates/_helpers.tpl básicamente, estos archivos pueden incluir bucles, condicionales, y funciones para generar configuraciones dinámicas.
  • templates/Notes.txt contiene las instrucciones o información que se mostrará después de instalar el Chart.

Vamos dentro de templates/ y para este caso eliminaré los archivos: hpa.yaml, ingress.yaml, serviceaccount.yaml, y el directorio test/test-connection.yaml.

Ahora modificamos el archivo deployment.yaml

Nota: En mi caso me gusta tener todo ordenado por lo que primero creo un template llamado namespace con el siguiente contenido:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: {{ .Values.namespace }}
Enter fullscreen mode Exit fullscreen mode

Ahora vamos a ver el deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ include "nginx-chart.fullname" . }}
      namespace: {{ .Values.namespace }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app: {{- include "nginx-chart.selectorLabels" . | nindent 6 }}
      template:
        metadata:
          labels:
            app: {{- include "nginx-chart.selectorLabels" . | nindent 8 }}
        spec:
          containers:
          - name: nginx
            image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            ports:
            - containerPort: 80
Enter fullscreen mode Exit fullscreen mode

Ahora nuestro templates/service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: {{ include "nginx-chart.fullname" . }}
      namespace: {{ .Values.namespace }}
    spec:
      selector:
        app: {{- include "nginx-chart.labels" . | nindent 4 }}
      ports:
        - protocol: TCP
          port: {{ .Values.service.port }}
          targetPort: 80
Enter fullscreen mode Exit fullscreen mode

Esto es opcional, ya que yo tengo metallb en mi laboratorio local:

    apiVersion: v1
    kind: Service
    metadata:
      name: loadbalancer-{{ include "nginx-chart.fullname" . }}
      namespace: {{ .Values.namespace }}
    spec:
      ports:
        - port: 80
          targetPort: {{ .Values.service.port }}
          protocol: TCP
      type: LoadBalancer
      selector:
        app: {{- include "nginx-chart.selectorLabels" . | nindent 4 }}
Enter fullscreen mode Exit fullscreen mode

Si no tienes instalado metallb, lo que debes hacer es un port-forward del service, despues que instalemos el paquete.

En nuestro values.yaml buscamos y editamos los valores que queramos para la cantidad de replicas y el puerto por el cual accederemos al servicio.

    namespace: nginx-chart
    replicaCount: 2
    image:
      repository: nginx
      tag: latest
    service:
      port: 8080
Enter fullscreen mode Exit fullscreen mode

Nota: Podemos borrar el resto de parámetros si queremos para que nos hagan "ruido" en nuestra configuración.

Vamos a poner un mensaje cuando se instala el paquete, para eso vamos a editar nuestro templates/NOTES.txt

Nginx se ha desplegado correctamente. Puedes acceder a la aplicación a través de http://{{ .Release.Name }}.{{ .Values.service.port }}
Enter fullscreen mode Exit fullscreen mode

En nuestro Chart.yaml, vamos a poner los metadatos siguientes:

    apiVersion: v2
    name: nginx-chart
    description: A Helm chart for deploying Nginx
    version: "1.0.0"
Enter fullscreen mode Exit fullscreen mode

Nota: En mi caso yo inicié con la versión 1.0.0, por default si inicia con 0.1.0.

Linter, errores a la vista!

Ya que hemos realizado los cambios que queremos en nuestro paquete, podemos ejecutar el linter para comprobar que no hay errores, typos, etc. Esto lo hacemos desde el folder donde están los archivos Chart.yaml y values.yaml.

helm lint
Enter fullscreen mode Exit fullscreen mode

Image description

Empaquetado

Ya que hemos realizado los pasos anteriores, vamos a empaquetar nuestro Chart.

helm package nginx-chart
Enter fullscreen mode Exit fullscreen mode

Image description

Estos te creará un tarball de nuestro paquete.

Antes de instalarlo podemos hacer un "fake install" del paquete para ver la salida con las sustituciones que hará en los manifest.

helm install nginx-chart nginx-chart-1.0.0.tgz --dry-run --debug
Enter fullscreen mode Exit fullscreen mode

Si todo está bien, para instalarlo solo debes hacer:

helm install nombre-del-release nginx-chart-1.0.0.tgz -n namespace

helm install my-nginx my-nginx-1.0.0.tgz --namespace nginx-chart
Enter fullscreen mode Exit fullscreen mode

Nota: el paráemtro -n nombre_del_namespace es opcional, en caso que no hayas creado un archivo namespace.yaml.

Y obtendrás una salida como esta:

Image description

Obviamente podemos usar kubectl para comprobar que todo lo que dice el Chart se ha aplicado correctamente, y si abrimos el navegador y ponemos la EXTERNAL-IP:

Image description

Image description

Helm administrando paquetes

Dado que helm es un manejador de paquetes, podemos listar, actualizar y borrar paquetes, como si se tratase de apt, pacman, pip, etc.

helm list --all-namespaces
Enter fullscreen mode Exit fullscreen mode

Image description

Es importante el --all-namespaces de lo contrario solo te mostrará lo que esta en el namespace default.

Para actualizar en caso que tengamos una nueva versión del paquete.

helm update nginx-chart
Enter fullscreen mode Exit fullscreen mode

Historial de revisiones y rollback

Para ver el historial de revisiones:

helm history nginx-chart
Enter fullscreen mode Exit fullscreen mode

Image description

Por ejemplo para hacer un rollback a la revisión 1:

helm rollback nginx-chart 1
Enter fullscreen mode Exit fullscreen mode

es decir, que si quieres ir a la revisión 4 debes cambiar el valor de 1 a 4.

Hasta aquí lo dejamos por ahora, en el siguiente post te enseño cómo hacer tu propio repositorio de paquetes.

💖 💪 🙅 🚩
ahioros
Guillermo Garcia

Posted on August 28, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related