Helm — menedżer pakietów dla Kubernetes i k3s
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Kubernetes
Wdrożenie nawet prostej aplikacji na Kubernetes oznacza pisanie kilkunastu plików YAML: Deployment, Service, Ingress, ConfigMap, Secret, HorizontalPodAutoscaler. Helm rozwiązuje ten problem — to menedżer pakietów dla Kubernetes, gdzie "pakietem" jest chart zawierający szablony wszystkich zasobów. Jeden helm install i masz działający Nginx Ingress Controller z certyfikatami Let's Encrypt. Helm obsługuje też wersjonowanie (rollback do poprzedniej rewizji), parametryzację (values.yaml zamiast hardkodowanych wartości) i repozytorium chartów. Artykuł skupia się na praktycznym użyciu — od instalacji CLI po tworzenie własnego chart i wdrożenie na k3s.
Instalacja Helm CLI
Helm instalujesz tylko na maszynie, z której zarządzasz klastrem (lokalny komputer lub
bastion host) — nie potrzeba agenta po stronie klastra. Wymaganie: działający kubectl
z dostępem do klastra.
# Linux (oficjalny skrypt instalacyjny)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Alternatywnie przez apt (stabilniejsze w CI)
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | \
sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [arch=${dpkg --print-architecture} signed-by=/usr/share/keyrings/helm.gpg] \
https://baltocdn.com/helm/stable/debian/ all main" | \
sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update && sudo apt install helm -y
# macOS
brew install helm
# Weryfikacja
helm version
# version.BuildInfo{Version:"v3.17.x",...}
# Podlacz kubeconfig k3s
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# lub skopiuj do lokalnego katalogu
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown ${USER} ~/.kube/config
helm list # powinno zwrocic pustą tablicę Repozytoria chartów — repo add i update
Charty są publikowane w repozytoriach HTTP — jak apt sources. Przed instalacją musisz dodać repozytorium i pobrać indeks. Poniżej najczęściej używane repozytoria:
| Repozytorium | Alias | Zawiera |
|---|---|---|
| https://charts.helm.sh/stable | stable | Oficjalne stabilne charty Helm |
| https://kubernetes.github.io/ingress-nginx | ingress-nginx | Nginx Ingress Controller |
| https://charts.jetstack.io | jetstack | cert-manager (Let's Encrypt) |
| https://charts.bitnami.com/bitnami | bitnami | MySQL, PostgreSQL, Redis, WordPress |
| https://prometheus-community.github.io/helm-charts | prometheus-community | Prometheus, Grafana, Alertmanager |
# Dodaj repozytoria helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo add jetstack https://charts.jetstack.io helm repo add bitnami https://charts.bitnami.com/bitnami # Aktualizuj indeks (jak apt update) helm repo update # Przeszukaj chart helm search repo nginx helm search repo mysql --versions # Informacje o charcie helm show chart bitnami/mysql helm show values bitnami/mysql # dostępne parametry values.yaml
helm install / upgrade / rollback — cykl życia release
Helm nazywa każde wdrożenie release. Jeden chart można zainstalować wielokrotnie pod różnymi nazwami release (np. mysql-prod i mysql-dev). Komendy zarządzania:
# Instalacja (prosta) helm install moja-aplikacja bitnami/mysql \ --namespace produkcja \ --create-namespace \ --set auth.rootPassword=TajneHaslo123 \ --set primary.persistence.size=10Gi # Instalacja z plikiem values (preferowane) helm install moja-aplikacja bitnami/mysql \ --namespace produkcja \ --create-namespace \ -f my-mysql-values.yaml # Upgrade (idempotentne - uzyj w CI/CD) helm upgrade --install moja-aplikacja bitnami/mysql \ --namespace produkcja \ --create-namespace \ -f my-mysql-values.yaml \ --atomic \ # rollback automatyczny przy niepowodzeniu --timeout 5m # Status wdrozenia helm status moja-aplikacja -n produkcja helm list -n produkcja helm list --all-namespaces # Historia rewizji helm history moja-aplikacja -n produkcja # Rollback do rewizji 2 helm rollback moja-aplikacja 2 -n produkcja # Odinstalowanie (usuwa wszystkie zasoby K8s) helm uninstall moja-aplikacja -n produkcja
Nginx Ingress Controller — wdrożenie na k3s
k3s domyślnie zawiera Traefik jako ingress controller. Jeśli wolisz Nginx (szerzej dokumentowany, więcej pluginów), usuń Traefik i zainstaluj Nginx Ingress przez Helm:
# Wylącz Traefik w k3s (edytuj /etc/rancher/k3s/config.yaml) # disable: # - traefik # Zainstaluj Nginx Ingress Controller helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.type=LoadBalancer \ --set controller.replicaCount=1 # Sprawdz ze dostal EXTERNAL-IP (IP VPS) kubectl get svc -n ingress-nginx # NAME TYPE CLUSTER-IP EXTERNAL-IP # ingress-nginx-controller LoadBalancer 10.43.47.123 93.184.216.34 # Przykladowy Ingress dla aplikacji # plik: my-app-ingress.yaml # # apiVersion: networking.k8s.io/v1 # kind: Ingress # metadata: # name: my-app # annotations: # nginx.ingress.kubernetes.io/rewrite-target: / # spec: # ingressClassName: nginx # rules: # - host: app.example.com # http: # paths: # - path: / # pathType: Prefix # backend: # service: # name: my-app-svc # port: # number: 80
cert-manager — automatyczne certyfikaty Let's Encrypt
# Instalacja cert-manager (wymaga Nginx Ingress) helm upgrade --install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --set installCRDs=true # Sprawdz ze pody biegna kubectl get pods -n cert-manager # ClusterIssuer dla Lets Encrypt (ACME HTTP-01) # plik: cluster-issuer.yaml # # apiVersion: cert-manager.io/v1 # kind: ClusterIssuer # metadata: # name: letsencrypt-prod # spec: # acme: # email: [email protected] # server: https://acme-v02.api.letsencrypt.org/directory # privateKeySecretRef: # name: letsencrypt-prod # solvers: # - http01: # ingress: # class: nginx # # kubectl apply -f cluster-issuer.yaml # Ingress z automatycznym certyfikatem # metadata: # annotations: # cert-manager.io/cluster-issuer: letsencrypt-prod # spec: # tls: # - hosts: # - app.example.com # secretName: app-tls
Tworzenie własnego chart
Gdy chcesz podzielić się konfiguracją lub wielokrotnie wdrażać tę samą aplikację, stwórz własny chart. Struktura katalogu jest sztywna:
# Tworzenie szkieletu chart
helm create moja-aplikacja
# Struktura katalogu
# moja-aplikacja/
# ├── Chart.yaml # metadane chart
# ├── values.yaml # domyslne wartosci
# ├── templates/ # szablony YAML (z Go template)
# │ ├── deployment.yaml
# │ ├── service.yaml
# │ ├── ingress.yaml
# │ ├── _helpers.tpl # funkcje pomocnicze
# │ └── NOTES.txt # wiadomosc po instalacji
# └── charts/ # zaleznosci (sub-charts)
# Chart.yaml - przyklad
# apiVersion: v2
# name: moja-aplikacja
# description: Moja aplikacja Node.js na Kubernetes
# type: application
# version: 0.1.0
# appVersion: "1.0.0"
# values.yaml - przyklad
# replicaCount: 2
# image:
# repository: my-registry/moja-aplikacja
# tag: "1.0.0"
# pullPolicy: IfNotPresent
# service:
# type: ClusterIP
# port: 80
# ingress:
# enabled: true
# host: app.example.com
# Uzycie wartosci w szablonie deployment.yaml (Go template)
# spec:
# replicas: {{ .Values.replicaCount }}
# template:
# spec:
# containers:
# - name: {{ .Chart.Name }}
# image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
# Testowanie szablonow (renderuj bez instalacji)
helm template moja-aplikacja ./moja-aplikacja/ -f custom-values.yaml
# Walidacja
helm lint ./moja-aplikacja/
# Instalacja lokalnego chart
helm upgrade --install moja-app ./moja-aplikacja/ -f prod-values.yaml
# Pakowanie do archiwum
helm package ./moja-aplikacja/
# Tworzy: moja-aplikacja-0.1.0.tgz MySQL przez Bitnami Helm chart
Bitnami MySQL chart to przykład produkcyjnego chart z dziesiątkami opcji konfiguracyjnych. Poniżej minimalny plik values.yaml dla developmentu i produkcji:
# mysql-values.yaml (dev) # auth: # rootPassword: "dev-only-password" # database: "myapp" # username: "myapp" # password: "myapp-dev-pass" # primary: # persistence: # enabled: true # size: 5Gi # resources: # limits: # memory: 512Mi # cpu: 500m # mysql-prod-values.yaml (produkcja) # auth: # existingSecret: mysql-secret # Secret K8s z haslem # primary: # persistence: # size: 50Gi # storageClass: "fast-ssd" # resources: # limits: # memory: 4Gi # cpu: 2000m # metrics: # enabled: true # eksporter Prometheus # Instalacja helm upgrade --install mysql bitnami/mysql \ --namespace db \ --create-namespace \ -f mysql-values.yaml # Polaczenie z MySQL w klastrze kubectl exec -it -n db mysql-0 -- mysql -u root -p # Port-forward dla zewnetrznego dostępu (dev) kubectl port-forward svc/mysql -n db 3306:3306