Sari la conținutul principal

Personalizarea unui chart Helm

Unul dintre avantajele majore ale Helm este ușurința cu care putem personaliza o instalare, fără a modifica manual definițiile YAML, ci pur și simplu furnizând alte valori pentru variabilele din chart. Vom explora această funcționalitate făcând un upgrade al release-ului nostru. Vom simula scenariul în care dorim să mărim numărul de replici ale aplicației Nginx de la 1 la 2 (de exemplu, pentru a gestiona un potențial trafic mai mare).

În chart-ul nostru, numărul de replici este controlat de cheia replicaCount din values.yaml. Valoarea implicită este 1. Putem suprascrie această valoare la instalare sau upgrade folosind opțiunea --set a comenzii helm. Vom folosi comanda helm upgrade pentru a aplica noua configurație release-ului existent:

$ helm upgrade example-release ./mychart --set replicaCount=2
Release "example-release" has been upgraded. Happy Helming!
NAME: example-release
LAST DEPLOYED: Sat Nov 1 11:45:28 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=example-release" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

Observăm că Helm ne indică realizarea cu succes a unui upgrade al release-ului example-release. De această dată, REVISION a ajuns la 2 (avem a doua versiune a release-ului, după upgrade). Helm a aplicat diferențele în cluster: practic, a modificat obiectul Deployment mărind spec.replicas la 2, ceea ce determină Kubernetes să creeze un al doilea pod Nginx.

Verificăm noua stare a pod-urilor astfel:

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
example-release-mychart-6f57d7b79c-bgzk7 1/1 Running 0 4m51s
example-release-mychart-6f57d7b79c-zqknd 1/1 Running 0 13s

Acum vedem două pod-uri Running pentru deployment-ul nostru, indicând că Helm a scalat aplicația la 2 replici conform noii configurații. Pod-ul original (cu sufix bgzk7) este încă prezent și rulând, iar Helm/Kubernetes au adăugat un al doilea pod (cu sufix zqknd). Pentru a confirma, putem rula kubectl get deployment example-release-mychart -o yaml | grep replicas și vom vedea spec.replicas: 2, și similar la status.replicas.

Am reușit, astfel, să actualizăm aplicația fără să edităm manual vreun fișier YAML. Helm s-a ocupat de calcularea diferențelor și de aplicarea modificărilor. Procesul de upgrade la Helm este idempotent și poate fi repetat ori de câte ori dorim să schimbăm configurația sau versiunea aplicației. Fiecare upgrade incrementează versiunea release-ului (Helm păstrează un istoric al release-urilor și permite chiar rollback la o versiune anterioară cu comanda helm rollback, dacă o actualizare cauzează probleme).

Sfat

Puteți previzualiza modificările pe care le va face Helm (fără a le aplica efectiv) folosind comanda helm template sau helm install --dry-run. De exemplu, helm template example-release ./mychart --set replicaCount=2 va afișa manifestele Kubernetes generate pe baza chart-ului și noilor valori (practic puteți vedea YAML-ul rezultat unde replicaCount este 2, etc.), permițându-vă să verificați înainte de a rula helm upgrade. În cazul nostru, upgrade-ul fiind simplu, a fost aplicat direct.

Pentru a vedea și alt tip de personalizare, să presupunem că dorim să actualizăm imaginea containerului Nginx la o versiune mai nouă (să zicem de la 1.16.0 la 1.21.0). Putem realiza acest lucru tot prin helm upgrade cu --set, astfel:

$ helm upgrade example-release ./mychart --set image.tag=1.21.0
Release "example-release" has been upgraded. Happy Helming!
NAME: example-release
LAST DEPLOYED: Sat Nov 1 11:46:49 2025
NAMESPACE: default
STATUS: deployed
REVISION: 3
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=example-release" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

Acum, Deployment-ul din cluster folosește imaginea nginx:1.21.0. Kubernetes va face automat un rolling update al pod-urilor: va crea noile pod-uri cu noua imagine și le va termina pe cele vechi. Putem observa temporar podurile în stări de update (unul în Terminating, altul în ContainerCreating) dacă listăm rapid pod-urile. După câteva momente, clusterul va avea din nou 2 pod-uri Running, ambele cu noua versiune de Nginx. Astfel, Helm simplifică semnificativ procesul de upgrade al aplicațiilor.