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).
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.