In this chapter we get our hands dirty: install Helm, deploy a real application from a public chart, and learn the handful of CLI commands you’ll use every day.
Installing Helm
On macOS, Linux, or WSL the easiest way is Homebrew:
brew install helm
Other options are the official install script or your system package manager — see the Helm installation docs. Verify the install:
helm version
version.BuildInfo{Version:"v4.0.0", GitCommit:"...", GoVersion:"go1.24"}
Helm talks to whatever cluster your current kubectl context points at — it reads the
same ~/.kube/config. So make sure you can reach a cluster first:
kubectl get nodes
Any cluster works: a local one like kind, k3d, or minikube, or a managed cluster like EKS/GKE/AKS.
Installing a chart
Let’s deploy something real. We’ll use the community
CloudPirates Redis chart.
It’s published as an OCI chart — stored in a container registry, the way Helm 4
prefers — so we can install it straight from its URL, with no helm repo add step:
helm install my-redis oci://registry-1.docker.io/cloudpirates/redis --version 0.33.0
That’s it — Helm pulled the chart, rendered its templates, and applied them to your cluster. The output shows the release name, namespace, revision, and the chart’s notes (often with handy next steps).
OCI vs classic repos. Older charts live in HTTP chart repositories that you add with
helm repo add <name> <url>and then install as<name>/<chart>. Helm 4 makes OCI registries first-class, so many charts (like this one) install directly from anoci://URL. We’ll use OCI throughout — just know both styles exist.
my-redis is the release name. Check what you just created:
kubectl get pods,svc -l app.kubernetes.io/instance=my-redis
The core CLI commands
These are the commands you’ll reach for constantly.
List your releases:
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-redis default 1 ... deployed redis-0.33.0 8.8.0
Inspect a release — see the values it was installed with:
helm get values my-redis
Upgrade — change something and re-apply. For example, switch to a replicated setup with three instances:
helm upgrade my-redis oci://registry-1.docker.io/cloudpirates/redis --version 0.33.0 \
--set architecture=replication --set replicaCount=3
Notice the revision in helm list bumps to 2. Helm kept the old revision so you can
undo.
Roll back to the previous revision:
helm rollback my-redis 1
Uninstall the release and everything it created:
helm uninstall my-redis
--set vs values files
We passed --set flags on the command line. That’s fine for one or two tweaks, but for
anything real you’ll keep your settings in a values file — a plain YAML file of
overrides:
# my-values.yaml
architecture: replication
replicaCount: 3
helm install my-redis oci://registry-1.docker.io/cloudpirates/redis --version 0.33.0 -f my-values.yaml
Values files are checked into Git, reviewed in pull requests, and reused across environments. We’ll lean on them heavily for the rest of the series.
Preview before you apply
Two commands let you see exactly what Helm would do before touching the cluster:
# Render templates locally and print the manifests
helm template my-redis oci://registry-1.docker.io/cloudpirates/redis --version 0.33.0 -f my-values.yaml
# Do a full server-side dry run (also runs validation)
helm install my-redis oci://registry-1.docker.io/cloudpirates/redis --version 0.33.0 -f my-values.yaml --dry-run
Get in the habit of running helm template when something looks off — it shows the
final YAML with all values substituted.
Where do releases live?
Helm stores each release’s history as Secrets in the release’s namespace (you’ll see
names like sh.helm.release.v1.my-redis.v1). That’s how helm rollback and
helm history work — the state lives in the cluster, not on your laptop.
helm history my-redis
The example values file for this chapter is in 01-first-release.
In the next chapter we’ll stop using other people’s charts and start building our own — by dissecting exactly what’s inside a chart.