Raw Kubernetes YAML gets repetitive fast — the same Deployment/Service/ ConfigMap shape, copy-pasted with small edits for every environment. Helm templates that shape once and parameterizes it with values, so "deploy this app to staging vs. production" becomes a values file, not a pile of near-duplicate YAML.
This builds directly on the Minikube setup guide — have a cluster running before you start.
Install Helm
macOS:
brew install helmLinux:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashWindows:
winget install -e --id Helm.HelmVerify:
helm versionInstall a published chart
Helm charts live in repositories, the same idea as npm packages. Add one and install something real from it:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo updatehelm install my-nginx bitnami/nginxCheck what it created:
kubectl get pods,svc
helm listOne command created a Deployment, a Service, and whatever ConfigMaps the chart needed — all the YAML you'd otherwise write by hand.
Remove it just as easily:
helm uninstall my-nginxLook inside before you trust it
Never helm install something without seeing what it'll actually create
first:
helm show values bitnami/nginx # see all configurable options
helm install my-nginx bitnami/nginx --dry-run --debug # render without applying--dry-run --debug renders the final YAML Helm would send to the
cluster — the templating equivalent of terraform plan.
Override values
Charts expose configuration through values.yaml. Override just what you
need, either inline:
helm install my-nginx bitnami/nginx --set replicaCount=2or with your own values file:
# my-values.yaml
replicaCount: 2
service:
type: NodePorthelm install my-nginx bitnami/nginx -f my-values.yamlBuild your own chart
helm create mychartThis scaffolds:
mychart/
Chart.yaml # name, version, metadata
values.yaml # default configuration
templates/ # your Kubernetes YAML, templated
deployment.yaml
service.yaml
...
Point templates/deployment.yaml's image at your own app, adjust
values.yaml defaults, then install it exactly like the published chart
above:
helm install myapp ./mychart{{ .Values.replicaCount }}-style placeholders in templates/*.yaml pull
from values.yaml — that's the entire templating model. Read through the
generated deployment.yaml once; it's shorter than it looks and explains
most of what you need.
Upgrading and rolling back
helm upgrade myapp ./mychart -f my-values.yaml
helm history myapp
helm rollback myapp 1helm upgrade is how you ship a new image tag or config change; helm rollback reverts to any prior revision by number, instantly.
Common gotchas
Changed a value but nothing happened. helm upgrade needs to actually
be re-run after editing values.yaml or your -f file — Helm doesn't
watch for file changes. Confirm with helm get values myapp.
CRDs from a chart don't update on helm upgrade. This is intentional
Helm behavior, not a bug — Helm won't touch CRDs after the initial install
to avoid destructive schema changes. Apply CRD updates manually with
kubectl apply when a chart's docs say a CRD changed.
helm install hangs waiting on a resource. Usually a pod that never
reaches Ready — same debugging as any other Kubernetes rollout:
kubectl describe pod <name> and kubectl logs <name> to see why.
Once you're comfortable installing and templating charts, most
"how do I deploy X to Kubernetes" questions become helm repo add +
helm install instead of hand-writing YAML from a tutorial.