Instalarea unui chart Helm
Având chart-ul pregătit, următorul pas este instalarea lui pe clusterul Kubernetes. Comanda
generală pentru a instala un chart este helm install <nume_release> <cale_chart> [opțiuni].
Putem alege un nume pentru release-ul nostru sau lăsa Helm să genereze unul aleator (prin
--generate-name); de obicei este preferabil să specificăm un nume ușor de recunoscut. Vom
instala chart-ul mychart pe clusterul Kind sub un release numit example-release`**:
$ helm install example-release ./mychart
NAME: example-release
LAST DEPLOYED: Sat Nov 1 11:40:49 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
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
Să analizăm pe rând rezultatul comenzii:
- Helm ne confirmă că a creat un release nou numit example-release în namespace-ul
Kubernetes
default. Statusul estedeployed(chart-ul a fost aplicat cu succes) și avem REVISION: 1 (fiind prima instalare). - Secțiunea NOTES este preluată din fișierul templates/NOTES.txt al chart-ului și conține instrucțiuni utile. În cazul nostru, notițele sugerează modul de a accesa aplicația Nginx instalată, prin obținerea numelui pod-ului și portului, apoi executând un port-forward de la localul nostru către acel pod (vom reveni imediat la acest pas).
După instalare, Helm a generat și trimis către Kubernetes toate obiectele definite de șabloanele chart-ului, folosind valorile implicite. Putem verifica direct în cluster resursele create. De exemplu, listăm toate pod-urile, deployment-urile și serviciile din namespace-ul default:
$ kubectl get deployment,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/example-release-mychart 1/1 1 1 29s
NAME READY STATUS RESTARTS AGE
pod/example-release-mychart-6f57d7b79c-bgzk7 1/1 Running 0 29s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/example-release-mychart ClusterIP 10.96.69.93 <none> 80/TCP 29s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4m57s
Observăm că Helm a creat un Deployment numit example-release-mychart (numele combină numele
release-ului cu numele chart-ului, asigurând unicitate), un Pod care aparține
deployment-ului (numele pod-ului începe cu example-release-mychart urmat de un sufix generat)
și un Service numit example-release-mychart de tip ClusterIP pe portul 80. Pod-ul are
starea Running, ceea ce indică lansarea cu succes a containerului Nginx în clusterul Kind.
În general, dacă helm install eșuează, puteți inspecta cauza erorii citind mesajele de eroare
afișate. Erori comune pot fi: clusterul Kubernetes nu este accesibil (de exemplu Docker nu
rulează sau contextul kubectl nu e setat corect), sau deja există un release cu același nume
(Helm nu permite două release-uri cu același nume în același namespace). Dacă întâmpinați
eroarea "cannot re-use a name that is still in use", probabil ați folosit deja numele respectiv,
așa că alegeți alt nume pentru release sau dezinstalați release-ul existent.
După instalare, aplicația Nginx rulează în clusterul Kubernetes, însă, fiind un service de tip ClusterIP, acesta este accesibil doar din interiorul clusterului (nu are o adresă externă implicită). În mediul local Kind, neavând un load balancer sau un ingress controller configurat, cea mai simplă metodă de a accesa aplicația web din exterior (de pe mașina noastră) este să folosim port forwarding.
Instrucțiunile din secțiunea NOTES ne arată exact pașii: putem prelua numele pod-ului și apoi
rula kubectl port-forward către acel pod pe portul 80. Pentru simplitate, putem face
port-forward direct către serviciu (Kubernetes va redirecționa traficul către pod-uri). Vom
expune portul 80 al serviciului Nginx pe un port local 8080. Deschideți un nou terminal (sau
rulați comanda în background) și executați:
$ kubectl port-forward svc/example-release-mychart 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Comanda de mai sus redirecționează traficul de la http://127.0.0.1:8080 pe mașina
proprie către portul 80 al serviciului example-release-mychart din cluster (care, la rândul
lui, trimite către pod-ul Nginx). Practic, atâta timp cât kubectl port-forward rulează, putem
accesa în browser sau cu curl adresa http://localhost:8080 și vom ajunge la serverul Nginx
din cluster.
Să verificăm, folosind curl, că primim răspuns de la serverul Nginx din cluster:
$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Sat, 01 Nov 2025 09:44:38 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Apr 2019 10:18:21 GMT
Connection: keep-alive
ETag: "5cbee66d-264"
Accept-Ranges: bytes
Am folosit opțiunea -I (head) pentru a vedea doar anteturile răspunsului. Observăm codul 200
OK și serverul nginx/1.16.0, ceea ce confirmă că solicitarea noastră a ajuns la instanța
Nginx din cluster. Dacă deschidem într-un browser adresa http://localhost:8080, vom vedea
pagina implicită "Welcome to nginx!" servită de container.
Fără a realiza un port-forward (sau alt mecanism de expunere), conexiunile către aplicație din
afara clusterului nu vor funcționa. De exemplu, dacă am fi încercat anterior curl http://localhost:80 (fără să facem port-forward), am fi primit o eroare de conexiune refuzată.
Acest lucru se întâmplă deoarece, în Kind, serviciile de tip ClusterIP nu sunt accesibile direct
din exterior, iar serviciile de tip LoadBalancer nu sunt disponibile (nu există un cloud
provider care să aloce automat un IP extern). În medii locale de testare, kubectl port-forward
este adesea soluția cea mai la îndemână pentru a accesa serviciile din cluster. O alternativă
este schimbarea tipului serviciului la NodePort, însă, în contextul Kind, chiar și NodePort
necesită cunoașterea adresei containerului nod sau configurarea unui mapping de port Docker.
Astfel, port-forward rămâne metoda cea mai simplă.
După ce am confirmat funcționarea aplicației implicite, putem opri comanda de port-forward (cu Ctrl+C în terminalul respectiv).