← all articles
cloud native

Helm Setup and Your First Chart

Install Helm, deploy a published chart to your Minikube cluster, then package your own app the same way.

3 min read·July 15, 2026

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 helm

Linux:

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Windows:

winget install -e --id Helm.Helm

Verify:

helm version

Install 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 update
helm install my-nginx bitnami/nginx

Check what it created:

kubectl get pods,svc
helm list

One 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-nginx

Look 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=2

or with your own values file:

# my-values.yaml
replicaCount: 2
service:
  type: NodePort
helm install my-nginx bitnami/nginx -f my-values.yaml

Build your own chart

helm create mychart

This 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
tip

{{ .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 1

helm upgrade is how you ship a new image tag or config change; helm rollback reverts to any prior revision by number, instantly.

Common gotchas

warning

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.

warning

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.

warning

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.