Învață Helm Charts

Tutorial practic pentru crearea unui Helm Chart cu Backend și MySQL

1 Ce este Helm?

📦 Package Manager pentru Kubernetes

Helm este managerul de pachete pentru Kubernetes, similar cu apt/yum pentru Linux sau npm pentru Node.js. Acesta simplifică deployment-ul și managementul aplicațiilor complexe în Kubernetes.

💡 De ce să folosești Helm?
  • 📝 Templatizare - Un singur set de fișiere pentru multiple environment-uri
  • 🔄 Versionare - Rollback ușor la versiuni anterioare
  • ♻️ Reutilizare - Nu mai copiezi YAML-uri cu mici modificări
  • 📦 Dependency Management - Charts pot depinde de alte charts

🎯 Concepte Cheie

📊 Chart

Pachetul Helm care conține toate resursele Kubernetes necesare

🔧 Values

Configurațiile care pot fi customizate pentru fiecare deployment

🚀 Release

O instanță instalată a unui chart în cluster

2 Structura Chart-ului

📁 Structura Proiectului

Un Helm Chart pentru aplicația noastră Backend + MySQL va avea următoarea structură:

  • my-backend-app/
    • Chart.yaml # Metadata despre chart
    • values.yaml # Valori configurabile
    • templates/
      • backend-deployment.yaml
      • backend-service.yaml
      • mysql-deployment.yaml
      • mysql-service.yaml
      • mysql-pvc.yaml
      • mysql-secret.yaml
      • configmap.yaml
      • _helpers.tpl
Chart.yaml
apiVersion: v2
name: my-backend-app
description: A Helm chart for backend application with MySQL
type: application
version: 0.1.0    # Versiunea chart-ului
appVersion: "1.0.0"  # Versiunea aplicației tale
values.yaml (fragment)
# Backend Configuration
backend:
  name: backend-api
  replicaCount: 2
  image:
    repository: node
    tag: "18-alpine"
  service:
    port: 3000

# MySQL Configuration  
mysql:
  enabled: true
  image:
    repository: mysql
    tag: "8.0"
  auth:
    database: "myapp_db"
    username: "backend_user"

3 Crearea Template-urilor

1

Creează Secret pentru MySQL

Primul pas este să securizăm credențialele bazei de date:

templates/mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: {{ include "myapp.fullname" . }}-mysql-secret
type: Opaque
data:
  mysql-root-password: {{ .Values.mysql.auth.rootPassword | b64enc }}
  mysql-username: {{ .Values.mysql.auth.username | b64enc }}
  mysql-password: {{ .Values.mysql.auth.password | b64enc }}
2

Configurează Backend Deployment

Deployment-ul pentru aplicația backend cu variabile de environment:

templates/backend-deployment.yaml (fragment)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}-backend
spec:
  replicas: {{ .Values.backend.replicaCount }}
  template:
    spec:
      containers:
      - name: backend
        image: "{{ .Values.backend.image.repository }}:{{ .Values.backend.image.tag }}"
        env:
        - name: DB_HOST
          value: {{ include "myapp.fullname" . }}-mysql-service
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ include "myapp.fullname" . }}-mysql-secret
              key: mysql-password
3

Setup MySQL cu Persistent Storage

Configurează MySQL cu volum persistent pentru date:

templates/mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ include "myapp.fullname" . }}-mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: {{ .Values.mysql.storage.size }}
⚠️ Important despre Template-uri

Template-urile folosesc sintaxa Go template. Variabilele din values.yaml sunt accesate cu {{ .Values.nume }}

4 Comenzi Esențiale

🔍 Testare & Debug

helm template my-app ./my-backend-app --debug

Verifică template-urile generate înainte de instalare

📦 Instalare

helm install my-app ./my-backend-app

Instalează chart-ul în cluster

🔄 Actualizare

helm upgrade my-app ./my-backend-app

Actualizează release-ul existent

📋 Listare

helm list

Vezi toate release-urile instalate

↩️ Rollback

helm rollback my-app

Revenire la versiunea anterioară

🗑️ Ștergere

helm uninstall my-app

Șterge complet release-ul

5 Deploy în Kubernetes

🚀 Pași pentru Deploy

1

Verifică Conexiunea la Cluster

kubectl cluster-info

Asigură-te că ești conectat la cluster-ul Kubernetes corect

2

Validează Chart-ul

helm lint ./my-backend-app

Verifică dacă chart-ul nu are erori de sintaxă

3

Dry Run (Test)

helm install my-app ./my-backend-app --dry-run

Simulează instalarea fără a face modificări în cluster

4

Instalare Efectivă

helm install my-app ./my-backend-app --create-namespace -n production

Instalează aplicația în namespace-ul production

5

Verifică Deployment-ul

kubectl get all -n production -l app.kubernetes.io/instance=my-app

Vezi toate resursele create de Helm

🎯 Environments Multiple

Folosește fișiere de valori diferite pentru fiecare environment:

values-dev.yaml
backend:
  replicaCount: 1
  resources:
    limits:
      cpu: 250m
      memory: 256Mi

mysql:
  storage:
    size: 1Gi
helm install my-app ./my-backend-app -f values-dev.yaml
values-prod.yaml
backend:
  replicaCount: 5
  resources:
    limits:
      cpu: 1000m
      memory: 1Gi

mysql:
  storage:
    size: 50Gi
helm install my-app ./my-backend-app -f values-prod.yaml
💡 Best Practices
  • 🔐 Nu păstra parole în values.yaml - folosește Sealed Secrets sau External Secrets
  • 📁 Păstrează values-*.yaml files în version control
  • 🏷️ Folosește semantic versioning pentru chart-uri
  • 📝 Documentează toate valorile configurabile în values.yaml
  • 🔍 Rulează întotdeauna helm lint înainte de deploy

6 Troubleshooting

🔧 Comenzi Utile pentru Debug

Vezi valorile folosite

helm get values my-app

Vezi manifest-ul generat

helm get manifest my-app

Istoric release

helm history my-app

Status release

helm status my-app

Logs pentru pod

kubectl logs -l app=backend

Describe pod

kubectl describe pod <pod-name>
🚨 Probleme Comune
  • ImagePullBackOff - Verifică numele și tag-ul imaginii Docker
  • CrashLoopBackOff - Verifică logs-urile și environment variables
  • Pending PVC - Verifică dacă ai StorageClass disponibil
  • Connection refused - Verifică Service names și ports