Desplegar un Helm Chart local

KubernetesBeginner
Practicar Ahora

Introducción

Los laboratorios de despliegue anteriores utilizaron manifiestos de Kubernetes sin procesar directamente. Helm añade una capa de empaquetado alrededor de esos manifiestos. Un Helm chart agrupa plantillas de Kubernetes relacionadas, expone configuraciones reutilizables en values.yaml e instala los objetos renderizados como una versión (release) con nombre.

En este laboratorio, construirás un pequeño chart local en lugar de descargar uno de un repositorio. Escribirás los metadatos del chart, los valores, la plantilla de Deployment y la plantilla de Service; renderizarás el chart antes de instalarlo y, finalmente, actualizarás la versión cambiando los valores. Esto mantiene el enfoque en la habilidad clave para el CKAD: comprender cómo un chart local se convierte en objetos de Kubernetes ordinarios.

Preparar un entorno de trabajo para Helm

En este paso, prepararás un namespace y confirmarás las herramientas necesarias para el flujo de trabajo de un Helm chart local.

Comienza en /home/labex/project. Este laboratorio mantiene el directorio del chart, los manifiestos generados y todos los comandos en este espacio de trabajo.

mkdir -p /home/labex/project
cd /home/labex/project

Verifica que el servidor de la API de Kubernetes sea accesible. Si la máquina virtual acaba de iniciarse y el nodo aún no está listo, espera unos segundos y vuelve a ejecutar el comando.

kubectl get nodes --request-timeout=5s

La salida esperada incluye:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Espera hasta que el Pod de red del clúster esté listo (Ready). El chart creará un Service, por lo que los Pods de la aplicación necesitan que la red del clúster esté operativa antes de que las pruebas de tráfico sean significativas.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Salida esperada:

pod/calico-node-... condition met

Crea un namespace llamado ckad-prep-helm y establécelo como el namespace actual:

kubectl create namespace ckad-prep-helm
kubectl config set-context --current --namespace=ckad-prep-helm

Confirma tanto el namespace actual como el cliente de Helm. Helm 3 funciona directamente con Kubernetes utilizando tu kubeconfig actual; no existe un componente Tiller separado en el lado del servidor.

kubectl config view --minify --output 'jsonpath={..namespace}'; echo
helm version --short

La salida esperada incluye:

ckad-prep-helm
v...

Crear y renderizar un chart local

En este paso, crearás un Helm chart local mínimo y lo renderizarás antes de instalar nada.

El directorio de un chart tiene algunas partes importantes. Chart.yaml describe el chart en sí. values.yaml contiene la configuración predeterminada. Los archivos bajo templates/ son manifiestos de Kubernetes con expresiones de plantilla como {{ .Values.replicaCount }}. Helm reemplaza esas expresiones con valores concretos cuando renderiza o instala el chart.

Crea el directorio del chart:

mkdir -p local-web-chart/templates

Escribe Chart.yaml. El nombre del chart no es lo mismo que el nombre de la versión (release); el nombre de la versión se elige más tarde al instalar el chart.

cat > local-web-chart/Chart.yaml <<'EOF'
apiVersion: v2
name: local-web
description: A small local chart for CKAD deployment practice
type: application
version: 0.1.0
appVersion: "1.0"
EOF

Escribe values.yaml. Estos valores predeterminados controlan el número de Pods, la imagen del contenedor, los puertos del Service y el mensaje servido por la aplicación.

cat > local-web-chart/values.yaml <<'EOF'
replicaCount: 2
image:
  repository: busybox
  tag: "1.36"
service:
  port: 80
  targetPort: 8080
message: helm-v1
EOF

Crea la plantilla de Deployment. La plantilla utiliza el nombre de la versión en los nombres de los objetos y en las etiquetas (labels), de modo que el mismo chart pueda instalarse bajo diferentes nombres de versión.

cat > local-web-chart/templates/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-web
  labels:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ .Chart.Name }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ .Chart.Name }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: web
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /www
          echo {{ .Values.message | quote }} > /www/index.html
          httpd -f -p {{ .Values.service.targetPort }} -h /www
        ports:
        - containerPort: {{ .Values.service.targetPort }}
        readinessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.targetPort }}
          initialDelaySeconds: 1
          periodSeconds: 2
EOF

Crea la plantilla de Service. Observa que el selector del Service utiliza las mismas etiquetas que la plantilla del Pod.

cat > local-web-chart/templates/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  selector:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
  ports:
  - port: {{ .Values.service.port }}
    targetPort: {{ .Values.service.targetPort }}
EOF

Ejecuta helm lint para detectar problemas en la estructura del chart y en las plantillas:

helm lint ./local-web-chart

La salida esperada incluye:

1 chart(s) linted, 0 chart(s) failed

Renderiza el chart localmente. helm template imprime el YAML de Kubernetes que Helm enviaría al servidor de la API, pero no crea ningún objeto.

helm template local-web ./local-web-chart | sed -n '1,120p'

La salida esperada incluye un Service llamado local-web y un Deployment llamado local-web-web.

Instalar el chart como una versión (release)

En este paso, instalarás el chart local en el namespace ckad-prep-helm.

Instalar un chart crea una versión de Helm (Helm release). El nombre de la versión es local-web en este laboratorio. Helm registra los metadatos de la versión y Kubernetes recibe objetos ordinarios como un Deployment y un Service.

Instala el chart:

helm install local-web ./local-web-chart

La salida esperada incluye:

NAME: local-web
STATUS: deployed

Espera a que el Deployment creado por el chart esté listo:

kubectl rollout status deployment/local-web-web --timeout=120s

Salida esperada:

deployment "local-web-web" successfully rolled out

Inspecciona la versión y los objetos de Kubernetes que creó:

helm list
kubectl get deployment,service -l app.kubernetes.io/instance=local-web

La salida esperada incluye:

local-web
deployment.apps/local-web-web
service/local-web

Crea un Pod cliente y envía una solicitud al Service. Esto confirma que el chart no solo creó objetos, sino que la aplicación instalada es realmente accesible.

kubectl run chart-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/chart-client --timeout=120s
kubectl exec chart-client -- wget -qO- http://local-web

Salida esperada:

helm-v1

Actualizar la versión con nuevos valores

En este paso, actualizarás la versión existente sobrescribiendo los valores del chart.

El chart ya contiene plantillas reutilizables. No necesitas editar los archivos de plantilla para cambiar el mensaje o el número de réplicas. helm upgrade renderiza el mismo chart de nuevo con nuevos valores, actualiza los objetos de Kubernetes y registra una nueva revisión de la versión.

Actualiza la versión para que sirva helm-v2 con tres réplicas:

helm upgrade local-web ./local-web-chart --set message=helm-v2 --set replicaCount=3

La salida esperada incluye:

Release "local-web" has been upgraded.
STATUS: deployed

Espera a que el Deployment actualizado esté listo:

kubectl rollout status deployment/local-web-web --timeout=120s

Salida esperada:

deployment "local-web-web" successfully rolled out

Inspecciona el historial de la versión y los valores almacenados actualmente con ella:

helm history local-web
helm get values local-web

La salida esperada incluye dos revisiones y los valores sobrescritos:

REVISION
1
2
message: helm-v2
replicaCount: 3

Verifica el Deployment en ejecución y la respuesta de la aplicación:

kubectl get deployment local-web-web
kubectl exec chart-client -- wget -qO- http://local-web

La salida esperada incluye:

3/3
helm-v2

Resumen

Has creado un Helm chart local a partir de metadatos, valores predeterminados y plantillas de Kubernetes. Renderizaste el chart antes de instalarlo, lo instalaste como una versión, probaste el Service y actualizaste la versión sobrescribiendo los valores. La idea clave es que Helm empaqueta el trabajo de despliegue de aplicaciones repetibles, al tiempo que produce objetos de Kubernetes ordinarios que puedes inspeccionar con kubectl.