Création d'un Chart HELM
Générer un Chart
Utilisez cette commande pour créer un nouveau chart dans un nouveau répertoire
helm create myhelmHelm créera un nouveau répertoire dans votre projet appelé myhelm avec la structure ci-dessous.
myhelm/├── charts├── Chart.yaml // metadatas du Chart.├── templates // les manifestes│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── hpa.yaml│ ├── ingress.yaml│ ├── NOTES.txt // Notes affichées à l'installation du Chart│ ├── serviceaccount.yaml│ ├── service.yaml│ └── tests│ └── test-connection.yaml└── values.yaml // valeurs des variables des templatesTemplates
On retrouve dans le répertoire templates les définitions YAML pour vos services, déploiements et autres objets Kubernetes.
Si vous avez déjà des définitions pour votre application, il vous suffit de remplacer les fichiers YAML générés par les vôtres.
::: note ::: title Note :::
Helm exécute chaque fichier de ce répertoire via le moteur Go template. Helm étend le langage de modèle, en ajoutant un certain nombre de fonctions utilitaires pour écrire des charts. :::
cat myhelm/templates/service.yamlapiVersion: v1kind: Servicemetadata:name: {{ template "fullname" . }}labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.externalPort }} targetPort: {{ .Values.service.internalPort }} protocol: TCP name: {{ .Values.service.name }}selector: app: {{ template "fullname" . }}Il s’agit d’une définition de service de base utilisant des modèles. Lors du déploiement du graphique, Helm générera une définition qui ressemblera beaucoup plus à un service valide. Nous pouvons effectuer une simulation d’une installation helm et activer le débogage pour inspecter les définitions générées :
helm install myapp --dry-run --debug ./myhelmapiVersion: v1kind: Servicemetadata:name: myhelmlabels: chart: "myhelm-1.0"spec:type: ClusterIPports:- port: 80 targetPort: 80 protocol: TCP name: nginxselector: app: myhelm.../...Values
Le fichier Values est un élément clé des charts Helm. Il fournit les valeurs par défaut pour toutes les variables utilisées dans les templates.
cat myhelm/values.yaml# Default values for myhelm.
replicaCount: 1
image:repository: nginxpullPolicy: IfNotPresent# Overrides the image tag whose default is the chart appVersion.tag: ""
service:type: ClusterIPport: 80
resources: {}# limits:# cpu: 100m# memory: 128Mi# requests:# cpu: 100m# memory: 128Mi
autoscaling:enabled: falseminReplicas: 1maxReplicas: 100
nodeSelector: {}
tolerations: []
affinity: {}::: note ::: title Note :::
On peut aussi surcharger ces variables à l’installation du chart par l’option —set :::
helm install myapp --dry-run ./myhelm --set service.internalPort=8080NAME: myappLAST DEPLOYED: Wed Apr 6 06:27:29 2022NAMESPACE: developmentSTATUS: pending-installREVISION: 1HOOKS:---# Source: myhelm/templates/service.yamlapiVersion: v1kind: Servicemetadata: name: myapp-myhelmspec: type: ClusterIP ports: - port: 80 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: myhelm---# Source: myhelm/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: myapp-myhelmspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: myhelm
.../...
NOTES:1. Get the application URL by running these commands:export POD_NAME=$(kubectl get pods --namespace development -l "app.kubernetes.io/name=myhelm,app.kubernetes.io/instance=myapp" -o jsonpath="{.items[0].metadata.name}")export CONTAINER_PORT=$(kubectl get pod --namespace development $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")echo "Visit http://127.0.0.1:8080 to use your application"kubectl --namespace development port-forward $POD_NAME 8080:$CONTAINER_PORTDocumentation
Un autre fichier utile dans le répertoire templates/ est le fichier NOTES.txt. Il contient une documenation qui sera affichée à la fin de l’installation du chart
::: note ::: title Note :::
Il peut aussi afficher les valeurs des variables des templates. :::
cat myhelm/templates/NOTES.txt1. Get the application URL by running these commands:{{- if .Values.ingress.enabled }} {{- range $host := .Values.ingress.hosts }} {{- range .paths }} http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} {{- end }}{{- end }}{{- else if contains "NodePort" .Values.service.type }}export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "myhelm.fullname" . }})export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")echo http://$NODE_IP:$NODE_PORTexport POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "myhelm.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")echo "Visit http://127.0.0.1:8080 to use your application"kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT{{- end }}