Start using Helm: install Helm 3 via the installer script or a package manager, set up shell completion, learn the CLI structure, manage chart repositories, find charts on Artifact Hub, and make your first deployment with helm install.

After dissecting the Helm 3 architecture in episode 2 — client-only without Tiller, releases stored in Secrets, and the three-way merge mechanism — it's time to climb into the cockpit. In this episode you'll actually use Helm: install the binary, make your terminal comfortable with completion, understand the command structure, manage chart repositories, find the right charts, and make your first deployment with Helm.
Why does this episode matter? Because chart distribution and management is the everyday language of a Kubernetes engineer. In the real world, teams rarely build every chart from scratch — they use community charts (Bitnami, ingress-nginx, prometheus-community, grafana), adjust the values, and deploy in minutes. The ability to find the right chart, evaluate its version, and add repositories safely is a skill that determines productivity. By the end of this episode, you'll have an nginx chart running in the cluster — the first of many deployments you'll make in this series.
Helm 3 is a single binary with no daemon — there's no service to run or enable. There are three common ways to install it:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.shVerify the installation — a command that will become your reflex:
helm version
helm version --shorthelm version --short shows only v3.x.y — the major number 3 must be there. If it isn't, don't continue: this entire series uses Helm 3, and its commands differ from Helm 2. After that, make sure Helm can talk to the cluster:
kubectl cluster-info
helm envhelm env output shows the environment variables Helm uses — among them HELM_NAMESPACE (the default namespace, usually default) and the HELM_CACHE_HOME location. As long as kubectl cluster-info succeeds, Helm is ready.
Helm has many subcommands and flags — don't memorize them all. Install completion so tab-completion helps you and saves hundreds of keystrokes a day:
helm completion bash > ~/.bashrc.d/helm.bash
source ~/.bashrc.d/helm.bashhelm completion zsh > "${fpath[1]}/_helm"
compinitFor fish, use helm completion fish in a similar way. The effect is immediate: type helm in then tab → helm install; type helm repo a then tab → helm repo add. Completion also lists valid flags, so you don't have to open the docs every time you forget an option name.
The entire Helm CLI follows one pattern: helm <command> [subcommand] [flags]. First understand the command map:
install, upgrade, rollback, uninstall, list, status, history.create, package, pull, template, lint, dependency.repo add, repo list, repo update, repo remove, repo index.version, env, search, show, get, completion, help.helm help
helm install --help
helm list --helpTwo habits to cultivate from the start:
helm <command> --help is your first documentation — the available flags, usage examples, and command notes are written there. Get used to reading it before asking Google.-o / --output when you want to parse results. helm list -o json and helm list -o yaml turn table output into data that jq or scripts can process:helm list -o json | jq '.[].name'
helm list -o json | jq '.[] | select(.status == "deployed") | .name'Charts are fetched from repositories — servers that store .tgz archives and an index.yaml file. Before you can install from a repository, you must add it to Helm's local list:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo listhelm repo add only records the address — it doesn't download anything yet. To fetch the latest metadata (index) from all registered repositories, run:
helm repo update
helm repo list -o json
helm repo remove <nama-repo>The four repositories above are the most widely used in the real world:
| Repository | URL | Contents |
|---|---|---|
| bitnami | https://charts.bitnami.com/bitnami | Databases, common applications, dev stacks |
| ingress-nginx | https://kubernetes.github.io/ingress-nginx | nginx ingress controller |
| prometheus-community | https://prometheus-community.github.io/helm-charts | Prometheus and monitoring stacks |
| grafana | https://grafana.github.io/helm-charts | Grafana, Loki, observability ecosystem |
To visually explore thousands of other charts, visit Artifact Hub — the official chart aggregator of the Helm ecosystem. To download a chart without installing — for example, to inspect it offline or copy a dependency into your own chart — use helm pull:
helm pull bitnami/nginx
helm pull bitnami/nginx --untar
ls nginx/Without a flag, helm pull saves the .tgz archive in the current directory; with --untar, it extracts the contents so you can inspect the chart structure — a good habit before using an unfamiliar chart.
There are two forms of helm search, and distinguishing them matters:
helm search repo <name> — searches only the repositories already registered on your machine (data from the local index). Fast, offline, and shows only charts ready to install.helm search hub <name> — searches all of Artifact Hub (the global online database). Useful for finding charts from repositories you haven't registered yet.helm search repo nginx
helm search repo bitnami/nginx
helm search hub nginx-ingressNotice the two version columns in the search results — this is a classic source of confusion. A real example of helm search repo bitnami/nginx output:
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 15.11.2 1.25.3 Chart for the nginx server| Column | Meaning |
|---|---|
| CHART VERSION | The version of the chart package itself (e.g. 15.11.2) — what's versioned in index.yaml |
| APP VERSION | The version of the application inside the chart (e.g. 1.25.3) — the actual nginx image version being run |
The two are independent: a chart version 15 can contain an app version 1.25, and the next chart version may keep the same application. When pinning a chart in production, what you pin is the chart version — not the app version. You can explore chart details before installing:
helm show chart bitnami/nginx
helm show values bitnami/nginx | head -40
helm show readme bitnami/nginxhelm show values displays every default value that can be overridden — this is the first document you must read before installing. helm show readme provides the official usage guide from the chart maintainers.
Everything is ready. Let's chain the whole flow together: installation (done), adding a repository (done), finding a chart (done), and now — install. Here's the complete flow from zero to a running application:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo updatehelm install web bitnami/nginx creates a release named web from the bitnami/nginx chart. The --namespace web --create-namespace flags place the release in the web namespace and create it if it doesn't exist. The final output shows NAME: web, STATUS: deployed, and access notes from the chart's NOTES.txt. Verify the real state with kubectl — remember the lesson from episode 0: Helm says deployed, kubectl proves it.
To access the application from your laptop, use port-forward:
kubectl port-forward -n web svc/web-nginx 8080:80Open http://localhost:8080 — the nginx page will appear. You've just deployed a complete application (Deployment + Service + ConfigMap + Secret) to Kubernetes with one command. Imagine how many YAML files you'd have to write by hand for the same result.
When helm install finishes, Helm prints a summary that's often skipped over — yet it contains information you'll need later:
NAME: web
LAST DEPLOYED: Sun Aug 02 14:03:21 2026
NAMESPACE: web
STATUS: deployed
REVISION: 1
TEST SUITE: NoneThe first four lines are worth remembering. NAME: web is the release name — not the chart name — and it's the identity used by every subsequent command (helm list, helm upgrade, helm uninstall). STATUS: deployed tells you the release was created successfully; other statuses like failed or pending-install will be dissected in episode 4. REVISION: 1 marks this as the first release — every upgrade increments this number, and it's the basis of the rollback mechanism. TEST SUITE: None means this chart doesn't define test hooks (a topic for episode 14).
Then, the NOTES: section at the end of the output shows access instructions specific to this release — for example, a port-forward command or a URL to open. Don't throw it away: it's bundled documentation generated directly from the values you used. If you want to show those notes again without reinstalling, use helm get notes web:
helm get notes webA small habit that saves a lot of time: record the release name and namespace in your project README. When teams accumulate dozens of releases, no one remembers the names that were created — helm list -A becomes the starting point of any investigation.
helm version --short shows v2.x, the commands here don't apply — Helm 2 needs Tiller. Always make sure the major version is 3.helm repo update. helm install fails with no chart name found or a version not found because the local index isn't refreshed. Get used to updating after repo add.helm show values. Installing with defaults that don't fit the environment and then debugging in production. Always read the values before installing.default, making identification and cleanup harder. Start the --namespace habit now.Warning
Community charts are code running in your cluster — and old charts often ship insecure defaults (outdated images, no resource limits, uncontrolled Service type LoadBalancer exposure). Always inspect helm show values and helm show readme before installing, and use chart versions that are still maintained. Chart security hardening will be covered thoroughly in episode 20.
In episode 3 you've made a big leap: Helm is installed and verified (helm version → v3.x), your terminal is comfortable with shell completion, the CLI structure is understood (helm <command> [flags] plus -o json/yaml output), repositories are managed (repo add/list/update/remove), chart search is mastered (search repo vs search hub, the chart version vs app version difference), and — most importantly — the first release web was successfully installed from a Bitnami chart and verified running in the cluster.
Key takeaways:
--help are the fastest ways to boost CLI productivity.repo update is required after adding a new repository.helm install <release> <chart> is your first deployment — always verify with kubectl.Now you can use Helm to install charts. In the next episode, episode 4, we'll go deeper into release installation and management: the --wait, --timeout, and --atomic flags, dry-run and debugging, reading release status with helm list and helm status, exploring helm get, understanding the release status lifecycle, and deleting releases correctly. See you in episode 4!