Helm is to Kubernetes what apt is to Ubuntu or yum is to RHEL — it packages, versions, and distributes application definitions.
The Kubernetes package manager — install, upgrade, rollback, and share complex applications with a single command.
Helm packages Kubernetes manifests into reusable charts. A chart bundles templates, default values, and metadata so that deploying a multi-resource application is as simple as helm install.
Helm is to Kubernetes what apt is to Ubuntu or yum is to RHEL — it packages, versions, and distributes application definitions.
A chart is a directory of templated YAML, a values.yaml with defaults, and a Chart.yaml with metadata (name, version, dependencies).
Every helm install creates a release — a named, versioned instance of a chart running in a namespace. You can have multiple releases of the same chart.
Chart repositories are HTTP servers hosting packaged charts. Public hubs like ArtifactHub aggregate thousands of community charts.
Override defaults at install time with --set flags or a custom -f values-prod.yaml file — same chart, different environments.
Helm tracks every release revision. helm rollback reverts to any previous revision instantly — safer than manually undoing kubectl apply changes.
mychart/
├── Chart.yaml # Chart metadata (name, version, appVersion, dependencies)
├── values.yaml # Default configuration values
├── charts/ # Sub-charts (dependencies)
├── templates/ # Go-template YAML manifests
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── _helpers.tpl # Reusable template snippets
│ ├── NOTES.txt # Post-install usage instructions
│ └── tests/
│ └── test-connection.yaml
├── .helmignore # Files to exclude from packaging
└── README.md # Chart documentation
helm repo add bitnami https://charts.bitnami.com/bitnami — register a chart repository locally.
helm search repo nginx — find available charts and versions in your added repositories.
helm show values bitnami/nginx — review configurable parameters before installing.
helm install my-nginx bitnami/nginx -f values-prod.yaml — deploy the chart as a named release.
helm upgrade my-nginx bitnami/nginx --set replicas=5 — apply config changes or new chart versions.
helm rollback my-nginx 1 — revert to a previous revision when something breaks.
helm uninstall my-nginx — remove the release and all its Kubernetes resources.
helm upgrade creates a new revision. Use helm history my-nginx to list all revisions and their statuses.curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Verify
helm version
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-get update
sudo apt-get install helm
helm version
sudo snap install helm --classic
helm version
# Check latest version at https://github.com/helm/helm/releases
HELM_VERSION="v3.16.3"
wget https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz
tar -zxvf helm-${HELM_VERSION}-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
rm -rf linux-amd64 helm-${HELM_VERSION}-linux-amd64.tar.gz
helm version
brew install helm
helm version
# Bitnami (extensive collection of production charts)
helm repo add bitnami https://charts.bitnami.com/bitnami
# Prometheus Community
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# Ingress-NGINX
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# Update local cache
helm repo update
# Verify
helm repo list
| Category | Command | Description |
|---|---|---|
| Repository | helm repo add NAME URL | Register a chart repository |
helm repo update | Refresh local repo index cache | |
helm repo list | List added repositories | |
helm repo remove NAME | Remove a repository | |
| Search | helm search repo KEYWORD | Search local repos for charts |
helm search hub KEYWORD | Search ArtifactHub | |
helm show values CHART | Display configurable values | |
| Install / Upgrade | helm install RELEASE CHART | Deploy a chart as a new release |
helm install RELEASE CHART -f values.yaml | Install with custom values file | |
helm install RELEASE CHART --set key=val | Install with inline override | |
helm upgrade RELEASE CHART | Upgrade to new values or chart version | |
| Rollback | helm rollback RELEASE REVISION | Revert to a previous revision |
helm history RELEASE | List all release revisions | |
| Status | helm list | List installed releases |
helm status RELEASE | Show release status and notes | |
helm get values RELEASE | Show user-supplied values | |
| Debug | helm template RELEASE CHART | Render templates locally (no install) |
helm install --dry-run --debug RELEASE CHART | Dry run with server-side validation | |
| Cleanup | helm uninstall RELEASE | Delete release and its resources |
helm uninstall RELEASE --keep-history | Delete resources but keep release history | |
| Create / Package | helm create CHARTNAME | Scaffold a new chart directory |
helm package CHARTDIR | Package chart into .tgz archive | |
helm lint CHARTDIR | Validate chart for errors | |
| Pull | helm pull CHART --untar | Download chart archive and extract |
# Add repo and install
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install my-nginx bitnami/nginx --namespace web --create-namespace
# Check release
helm list -n web
kubectl get pods -n web
# Upgrade with custom values
helm upgrade my-nginx bitnami/nginx -n web --set replicaCount=3
# Rollback to revision 1
helm rollback my-nginx 1 -n web
# Cleanup
helm uninstall my-nginx -n web
helm repo add prometheus-community \
https://prometheus-community.github.io/helm-charts
helm repo update
# Install with values override file
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
-f monitoring-values.yaml
# View what was deployed
helm status monitoring -n monitoring
kubectl get pods -n monitoring
# values-prod.yaml
replicaCount: 5
image:
repository: myapp
tag: "2.1.0"
service:
type: LoadBalancer
port: 443
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
ingress:
enabled: true
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix
# Scaffold a new chart
helm create myapp
# Edit templates and values
# templates/deployment.yaml, templates/service.yaml, values.yaml
# Lint for errors
helm lint myapp/
# Test render locally
helm template my-release myapp/
# Package for distribution
helm package myapp/
# Install from local chart
helm install my-release ./myapp
# Download chart to local directory
helm pull bitnami/nginx --untar
# Explore the chart structure
ls nginx/
cat nginx/Chart.yaml
cat nginx/values.yaml
# Install from local copy with modifications
helm install my-nginx ./nginx -f my-overrides.yaml
| Aspect | Helm | Kustomize | Plain kubectl apply |
|---|---|---|---|
| Templating | Go templates with conditionals, loops, functions | Overlay patches — no templating | None — raw YAML |
| Packaging | Versioned .tgz archives, shareable via repos | Directory-based, no packaging | Raw files |
| Release tracking | Built-in revision history and rollback | None (rely on Git) | None |
| Dependencies | Chart dependencies in Chart.yaml | Components via bases | Manual ordering |
| Ecosystem | Thousands of community charts on ArtifactHub | Growing but smaller | N/A |
| Learning curve | Medium — Go template syntax | Low — patches and overlays | Low — plain YAML |
| Best fit | Distributing apps, complex multi-resource installs | Environment-specific overlays, GitOps | Simple, one-off deploys |
helm template to render charts, then apply Kustomize overlays on top.Add the Bitnami repo, search for WordPress, inspect its values, install it with a custom admin password, then uninstall.
Install NGINX, upgrade to 5 replicas, verify, then rollback to revision 1. Check helm history output.
Run helm create, customize the templates for a simple app, lint, template-render locally, then install.
Write values-dev.yaml and values-prod.yaml for the same chart — different replica counts, resource limits, and image tags.
Install the same chart twice in different namespaces (--namespace staging vs --namespace production) and observe independent releases.
Use helm template and helm install --dry-run --debug to spot rendering issues before deploying anything.