Skip to main content

Creando Un Helm Chart

Vamos a crear nuestro primer chart desde cero y después vamos a crear un chart basado en otro como un subchart.

Lo primero que necesitamos hacer es la estructura de directorios.

mkdir meu-chart && cd meu-chart && mkdir templates charts && touch Chart.yaml values.yaml
tree
.
├── Chart.yaml
├── charts
├── templates
└── values.yaml

Con la estructura creada, vamos a definir algunas informaciones sobre nuestro chart dentro del archivo Chart.yaml.

Los posibles parámetros pueden ser encontrados en https://helm.sh/docs/topics/charts/.

Copia dentro de Chart.yaml

apiVersion: v2
name: meuchart
version: v1.0
kubeVersion: >= 1.20.0
description: Create my first chart
type: application
keywords:
- study charts
- first chart
- learning charts
- hello world
home: https://gitlab.com/davidpuziol/study-helm/-/tree/main/meu-chart #opcional
maintainers: # (opcional)
- name: David Puziol
email: [email protected]
url: https://linktr.ee/davidpuziol
icon: https://cncf-branding.netlify.app/img/projects/helm/icon/color/helm-icon-color.png
appVersion: 'v1.0.0' #opcional
deprecated: false

Ahora vamos a definir nuestros templates, que en el caso son de hecho nuestros manifiestos pero referenciando valores del values.yaml. Crea un archivo deployment.yaml dentro de templates con el siguiente contenido:

Observa que los valores son referenciados dentro de {{ }} y tenemos algunos para analizar.

Para consultar posibles valores para .Release y .Chart, revisar la documentación https://helm.sh/docs/chart_template_guide/builtin_objects/.

  • .Release
    • Hace referencia a los valores recibidos en el momento de la instalación. Es algo que no está en el Chart.yaml pero fue añadido en tiempo de ejecución como parámetro. Un ejemplo sería el --namespace meu-release. Tomará con el .Release.namespace.
  • .Chart
    • Hace referencia a los valores del chart definidos en el archivo Chart.yaml
  • .Values
    • Hace referencia a los valores definidos dentro del archivo Values.yaml (configuraciones predeterminadas) o del archivo pasado en el parámetro -f en el momento de la ejecución del Helm.
  • .Capabilities
    • Hace Referencia al clúster kubernetes o al helm
  • .Template
    • Información sobre el template que está siendo ejecutado. Sería como una auto referencia.
apiVersion: apps/v1
kind: Deployment
metadata:
# Este valor viene de Chart.yaml
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
release: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
release: {{ .Release.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http

Del mismo modo, crea en templates un service.yaml con el contenido abajo.

apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
app: {{ .Release.Name }}
release: {{ .Release.Name }}

Y vamos a completar ahora nuestro values.

image:
repository: nginx
tag: latest
imagePullPolicy: IfNotPresent
replicaCount: 1
service:
type: NodePort
port: 80

Vamos a crear.

helm create meu-chart

Utilizamos el comando helm upgrade --install en lugar del comando helm install porque ya verifica si el paquete está instalado en el clúster, si está solo hace la actualización.

Si quieres ver lo que será aplicado sin aplicar, para un posible análisis o debug podemos usar el --dry-run y el --debug.

helm upgrade --install meu-chart . --dry-run --debug > dryrun.yaml
helm upgrade --install meu-chart .
# Release "meu-chart" does not exist. Installing it now.
# NAME: meu-chart
# LAST DEPLOYED: Mon Dec 26 03:19:25 2022
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None

k get pods
# NAME READY STATUS RESTARTS AGE
# meu-chart-94b9bf4bb-lk8sp 1/1 Running 0 7s

Si quieres probar.

kubectl port-forward svc/meu-chart <nodeport>:80

testnginx