Creación e instalación de un gráfico de Helm

Completado

Los gráficos de Helm facilitan la implementación de aplicaciones en cualquier clúster de Kubernetes. Helm se usa para crear una plantilla con la información de implementación de la aplicación como un gráfico de Helm, que después se usa para implementar la aplicación.

Supongamos que el equipo de desarrollo ya ha implementado el sitio web de la tienda de mascotas de su empresa en el clúster de AKS. El equipo crea tres archivos para implementar el sitio web:

  • Un manifiesto de implementación que describe cómo instalar y ejecutar la aplicación en el clúster,
  • Un manifiesto de servicio que describe cómo exponer el sitio web en el clúster y
  • Un manifiesto de entrada que describe cómo se enruta el tráfico desde fuera del clúster a la aplicación web.

El equipo implementa estos archivos en cada uno de los tres entornos como parte del ciclo de vida de desarrollo del software. Cada uno de los tres archivos se actualiza con variables y valores específicos del entorno. Puesto que cada archivo está codificado de forma rígida, el mantenimiento de estos archivos es propenso a errores.

¿Cómo procesa Helm un gráfico?

El cliente de Helm implementa un motor de plantillas basado en el lenguaje Go que analiza todos los archivos disponibles en las carpetas de un gráfico. El motor de plantillas crea archivos de manifiesto de Kubernetes combinando las plantillas de la carpeta templates/ del gráfico con los valores de los archivos Chart.yaml y values.yaml.

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

Una vez que los archivos de manifiesto están disponibles, el cliente puede instalar, actualizar y eliminar la aplicación definida en los archivos de manifiesto generados.

Procedimiento para definir un archivo Chart.yaml

El archivo Chart.yaml es uno de los necesarios en una definición de gráfico de Helm y proporciona información al respecto. El contenido del archivo consta de tres campos obligatorios y varios opcionales.

Los tres campos obligatorios son:

  • apiVersion: Versión de la API del gráfico que se va a usar. Establezca la versión en v2 para los gráficos que usen Helm 3.
  • name: Nombre del gráfico.
  • version: El número de versión del gráfico, que usa el control de versiones semántico 2.0.0 y sigue la notación de números de versión MAJOR.MINOR.PATCH.

En el ejemplo siguiente, se muestra el contenido de un archivo básico Chart.yaml:

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0

Observe el uso del campo type en el archivo de ejemplo. Puede crear gráficos para instalar aplicaciones o bibliotecas. El tipo de gráfico predeterminado es application y se puede establecer en library para especificar que el gráfico instalará una biblioteca.

Hay muchos campos opcionales disponibles para adaptar el proceso de implementación de gráficos. Por ejemplo, puede usar el campo dependencies para especificar requisitos adicionales para el gráfico, como una aplicación web que depende de una base de datos.

Nota:

La cobertura detallada de todos los campos opcionales está fuera del ámbito de este módulo. Sin embargo, en la sección de resumen del módulo encontrará un vínculo a la documentación de Helm.

Procedimiento para definir una plantilla de gráfico

Una plantilla de gráfico de Helm es un archivo que describe distintos archivos de manifiesto de tipo de implementación. Las plantillas de gráfico se escriben en el lenguaje de plantilla Go y proporcionan funciones de plantilla para automatizar la creación de archivos de manifiesto del objeto de Kubernetes.

Los archivos de plantilla se almacenan en la carpeta templates/ de un gráfico. El motor de plantillas procesa estos archivos para crear el manifiesto de objeto final.

Por ejemplo, supongamos que el equipo de desarrollo usa el siguiente archivo de manifiesto de implementación para implementar el componente frontal de la tienda de mascotas de la solución:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: store-front
  template:
    metadata:
      labels:
        app: store-front
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
        - containerPort: 8080
          name: store-front
        env: 
        - name: VUE_APP_ORDER_SERVICE_URL
          value: "http://order-service:3000/"
        - name: VUE_APP_PRODUCT_SERVICE_URL
          value: "http://product-service:3002/"
        resources:
          requests:
            cpu: 1m
            memory: 200Mi
          limits:
            cpu: 1000m
            memory: 512Mi
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 5
          initialDelaySeconds: 3
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: store-front

Fíjese en cómo la ubicación de la imagen de contenedor está codificada de forma rígida con la sintaxis {{.Values.<property>}}. La sintaxis permite crear marcadores de posición para cada valor personalizado.

El proceso de creación manual de gráficos de Helm es tedioso. Una manera sencilla de crear un nuevo gráfico de Helm es usar el comando helm create. A continuación, puede personalizar los archivos generados automáticamente para que se ajusten a los requisitos de la aplicación.

Procedimiento para definir un archivo values.yaml

Los valores del gráfico se usan para personalizar la configuración de un gráfico de Helm. Los valores del gráfico pueden ser predefinidos o proporcionados por el usuario en el momento de la implementación del gráfico.

Un valor predefinido es un valor que distingue mayúsculas de minúsculas, que está predefinido en el contexto de un gráfico de Helm y que el usuario no puede modificar. Por ejemplo, puede usar Release.Name para hacer referencia al nombre de la versión o Release.IsInstall para comprobar si la operación actual es una instalación.

También puede usar valores predefinidos para extraer datos del contenido de Chart.yaml. Por ejemplo, si quiere comprobar la versión del gráfico, puede hacer referencia a Chart.Version. Tenga en cuenta que solo puede hacer referencia a campos conocidos. Imagine que los valores predefinidos son constantes que se van a usar en las plantillas que cree.

La sintaxis para incluir nombres de valores en un archivo de plantilla involucra la inclusión del nombre del valor entre llaves dobles, por ejemplo, {{.Release.Name}}. Fíjese en el uso de un punto delante del nombre del valor. Al usar un punto de esta manera, este funciona como un operador de búsqueda e indica el ámbito actual de la variable.

Por ejemplo, el siguiente fragmento de código YAML contiene un diccionario definido en un archivo de valores:

object:
  key: value

Para acceder al valor de una plantilla, puede usar la sintaxis siguiente:

{{ .Values.object.key }}

Un valor proporcionado le permite procesar valores arbitrarios en la plantilla del gráfico. El archivo values.yaml define estos valores.

En el ejemplo, el equipo de desarrollo permite los siguientes valores configurables:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  ...
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
  ...
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ...

Este es un ejemplo del archivo values.yaml:

...
replicaCount: 1
...
storeFront:
  image:
    repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
    tag: "latest"
  serviceType: LoadBalancer
...

Una vez que el motor de plantillas aplique los valores, el resultado final será similar al de este ejemplo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: 1
  ...
      containers:
      - name: store-front
        image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
        ports:
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: LoadBalancer
  ...

Procedimiento para usar un repositorio de Helm

Un repositorio de Helm es un servidor HTTP dedicado que almacena información sobre los gráficos de Helm. Los repositorios de Helm se configuran con el cliente de Helm para que pueda instalar gráficos a partir de un repositorio mediante el comando helm repo add.

Por ejemplo, puede agregar el repositorio de Helm de Azure Marketplace al cliente de Helm local mediante la ejecución del siguiente comando:

helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo

La información sobre los gráficos disponibles en un repositorio se almacena en la memoria caché del host del cliente. Debe actualizar periódicamente la memoria caché para capturar la información más reciente del repositorio mediante el comando helm repo update.

El comando helm search repo le permite buscar gráficos en todos los repositorios de Helm agregados localmente. Puede ejecutar el comando helm search repo de forma independiente para devolver una lista de todos los gráficos de Helm conocidos para cada repositorio agregado. El resultado muestra el nombre del gráfico, la versión y la versión de la aplicación implementada por el gráfico, tal como se muestra en la salida de ejemplo siguiente:

NAME                               CHART VERSION   APP VERSION   DESCRIPTION
azure-marketplace/airflow          11.0.8          2.1.4         Apache Airflow is a platform to programmaticall...
azure-marketplace/apache           8.8.3           2.4.50        Chart for Apache HTTP Server
azure-marketplace/aspnet-core      1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common   0.0.7           0.0.7         Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra        8.0.5           4.0.1         Apache Cassandra is a free and open-source dist...

Puede buscar un gráfico específico agregando un término de búsqueda al comando helm search repo. Por ejemplo, si busca un gráfico basado en ASP.NET, puede usar el comando siguiente:

helm search repo aspnet

En este ejemplo, el cliente local tiene dos repositorios registrados y devuelve un resultado de cada uno, como se muestra en la salida de ejemplo siguiente:

NAME                            CHART VERSION   APP VERSION   DESCRIPTION                                       
azure-marketplace/aspnet-core   1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
bitnami/aspnet-core             1.3.18          3.1.19        ASP.NET Core is an open-source framework create...

Procedimiento para probar un gráfico de Helm

Helm proporciona una opción para generar los archivos de manifiesto que el motor de plantillas crea a partir del gráfico. Esta característica le permite probar el gráfico antes de una versión mediante la combinación de dos parámetros adicionales: --dry-run y debug. El parámetro --dry-run garantiza que se simula la instalación y que el parámetro --debug habilita la salida detallada.

helm install --debug --dry-run my-release ./chart-name

El comando muestra información sobre los valores usados y todos los archivos generados. Es posible que tenga que desplazarse para ver todos los resultados generados.

Procedimiento para instalar un gráfico de Helm

Use el comando helm install para instalar un gráfico. Puede instalar un gráfico de Helm desde cualquiera de las ubicaciones siguientes:

  • Carpetas de gráficos
  • Gráficos de archivo tar .tgz empaquetados
  • Repositorios de Helm

Sin embargo, los parámetros necesarios varían en función de la ubicación del gráfico. En todos los casos, el comando install requiere el nombre del gráfico que quiere instalar y un nombre para la versión que la instalación crea.

Puede instalar un gráfico local mediante una carpeta de gráficos desempaquetada de archivos o un archivo .tar .tgz empaquetado. Para instalar un gráfico, el comando helm hace referencia al sistema de archivos local de la ubicación del gráfico. Este es un ejemplo del comando de instalación que implementará una versión de un gráfico desempaquetado:

helm install my-release ./chart-name

En el ejemplo anterior, el parámetro my-release es el nombre de la versión, y el parámetro ./chart-name es el nombre del paquete de gráficos desempaquetado.

Un gráfico empaquetado se instala haciendo referencia al nombre de archivo del gráfico empaquetado. En el ejemplo siguiente se muestra la sintaxis de la misma aplicación, que ahora está empaquetada como archivo .tar:

helm install my-release ./chart-name.tgz

Al instalar un gráfico desde un repositorio de Helm, se utiliza una referencia de gráfico como nombre del gráfico. La referencia del gráfico incluye dos parámetros, el nombre del repositorio y el nombre del gráfico, como se muestra en el ejemplo siguiente:

helm install my-release repository-name/chart-name

En el ejemplo, el parámetro repository-name/chart-name contiene la referencia del repositorio, repository-name, y el nombre del gráfico, chart-name.