The foundation before touching Helm: basic Kubernetes skills (Pod, Deployment, Service, ConfigMap, Secret, Namespace, Ingress), comfortable kubectl habits and YAML structure, plus a local cluster setup verified with helm version and your first pod.

Welcome to the Learn Helm Chart series! This series will take you from zero to building production-grade Helm charts and managing applications on Kubernetes professionally. There are 30 episodes that build on each other: prerequisites and environment setup, the history of why Helm was born, Helm 3 architecture, CLI basics, release management, upgrade and rollback, values configuration, building your own charts, Go templates, dependencies, hooks, JSON Schema, testing, documentation, packaging, repositories, OCI registry, all the way to CI/CD integration and GitOps.
Why is Helm so important? Kubernetes handles container orchestration brilliantly, but it introduces a new problem: managing dozens of YAML files by hand. A production application is not a single Deployment — it consists of Deployments, Services, ConfigMaps, Secrets, Ingresses, HorizontalPodAutoscalers, and ServiceAccounts that must stay consistent across dev, staging, and production environments. Helm wraps all of this into a single package that can be installed, upgraded, and rolled back with one command. A DevOps Engineer who doesn't know Helm is like a frontend developer who writes all styling as inline styles: it works, but it's impossible to maintain at team scale and system scale.
Episode 0 is your roadmap. Before touching Helm, we make sure of five things: (1) the Kubernetes skills you must master, (2) kubectl habits that are comfortable at your fingertips, (3) an understanding of YAML as the language of manifests, (4) a package manager mental model that will make Helm feel familiar, and (5) a Kubernetes cluster with kubectl and the Helm CLI already verified. Every later episode assumes this foundation is solid. Let's begin.
Helm does not replace Kubernetes — it sits on top of Kubernetes. Everything Helm installs is ultimately an ordinary Kubernetes resource: Pod, Deployment, Service, and so on. If you don't understand what Helm creates, you won't be able to read helm get manifest output, debug install failures, or judge whether a chart is safe to use. These are the resources you must understand before moving on.
| Resource | Function | Analogy |
|---|---|---|
| Pod | The smallest running unit: one or more containers that share network and storage | A carriage where containers live |
| Deployment | Manages a set of Pod replicas, supports rolling updates and rollback | A team manager who makes sure the headcount is always right |
| Service | A stable access point to Pods whose IPs keep changing | A receptionist: fixed address, the people behind it may change |
| ConfigMap | Stores non-secret configuration as key-value pairs | A configuration notice board |
| Secret | Stores sensitive data (passwords, tokens) encrypted in etcd | A safe for secret data |
| Namespace | Divides a cluster into several logical environments | Dividing rooms within one office building |
| Ingress | The HTTP/HTTPS entry point into the cluster from outside, forwarded to a Service | The building's main receptionist |
Understand not just the definitions but the relationships between resources: Ingress → Service → Deployment → Pod → ConfigMap/Secret. This is the flow you'll see in almost every Helm chart. Try building it yourself in your lab: an nginx Deployment that reads index.html from a ConfigMap, exposed through a Service, then protected by an Ingress. If you can explain that flow without opening your notes, your foundation is solid.
Note
Note one detail that is often misunderstood: a Deployment does not manage Pods directly. It manages a ReplicaSet, and it is the ReplicaSet that creates and maintains the Pod count. Understanding the Deployment → ReplicaSet → Pod chain matters when we discuss upgrade and rollback in episode 5.
Helm bridges you to the Kubernetes API server — but kubectl is your right-hand tool for verification. When Helm says "release installed," you don't take it at face value; you verify with kubectl. Master the following commands until they flow without thinking:
| Command | Use |
|---|---|
kubectl get pods | List Pods along with their status |
kubectl get all -n default | All main resources in one namespace |
kubectl describe pod <nama> | Full details + latest events (the number one debugging tool) |
kubectl apply -f <file> | Apply a manifest |
kubectl logs -f <pod> | Stream application logs |
kubectl port-forward svc/<nama> 8080:80 | Tunnel access to an application inside the cluster |
kubectl delete -f <file> | Delete resources |
Most debugging in this series follows the same pattern: helm install → fails → kubectl get pods → Pod is CrashLoopBackOff → kubectl describe pod → read the Events section → kubectl logs → find the root cause. If this flow still feels foreign, practice it in this episode first.
Tip
Get into the habit of reading the Events section in kubectl describe output — that's where Kubernetes writes the full story: failed image pulls, failed liveness probes, insufficient resources, and so on. This section will become your best friend throughout the series.
Every Kubernetes resource is written in YAML — and every Helm chart ultimately renders YAML. Two YAML concepts you must master: mapping (key-value pairs, marked by indentation) and sequence (lists, marked by dashes). Indentation is everything — YAML doesn't support tabs, and two spaces is the Kubernetes convention.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
labels:
app: nginx-demo
spec:
replicas: 3
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80Note the structure: apiVersion, kind, metadata, and spec are mappings. Under containers there is a sequence (dashes), and each item is a mapping. Later, when Helm renders templates, the final output will look exactly like this — the difference is that the changing parts (name, image, replica count) come from template variables instead of being written by hand.
You're probably already familiar with npm for JavaScript or pip for Python. Helm is built on the same mental model — and this is the key to building your understanding quickly:
.tgz package in npm.MAJOR.MINOR.PATCH rules.One important difference from npm: npm manages libraries executed inside a program; Helm manages declarative infrastructure — YAML files sent to the Kubernetes API server. But the mental pattern is identical: one command to install, one command to upgrade, one command to uninstall, and a "registry" for sharing packages.
Note
There's one templating concept that will shadow this whole series: one chart, many releases. A single nginx chart can be installed ten times with different release names (and different values) in the same cluster — just like a single npm package can be installed in many projects.
You need a Kubernetes cluster for practice. For this series, a local cluster is more than enough — even better, because it's cheap, fast, and safe to destroy over and over. Your options:
| Tool | How It Works | Pros | Cons |
|---|---|---|---|
| Minikube | A single VM running a small cluster | Most beginner-friendly, many addons | Needs a VM driver, a bit slow |
| Kind | Cluster running inside Docker containers | Super fast, popular for CI | A "real" cluster but running inside containers |
| K3s | A lightweight Kubernetes distribution | Very lightweight, great for edge and lab | Slightly different from full Kubernetes |
| EKS/GKE/AKS | Managed cluster in the cloud | Real scale, exactly like production | Paid, more complex for practice |
Recommendation for this series: Minikube for beginners, or Kind if you're already comfortable with Docker. Both run real Kubernetes (not a simulation) — every Helm command in this series works identically on a local cluster and in production.
Important
Make sure your machine meets the minimum requirements: 8 GB RAM or more (a local cluster is comfortable on 8 GB, very comfortable on 16 GB), 10 GB of free disk space for images and data, and a stable internet connection for pulling container images and charts. Mac/Windows developers with Docker Desktop can use Kind; Linux users are free to choose Minikube or Kind.
kubectl is the official Kubernetes CLI — your first bridge to the cluster. Installation via the official binary is the most portable, but package managers are also valid:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --clientNote that kubectl version has two parts of output: Client Version and Server Version. Right after installation, the server part is missing because the cluster hasn't been created yet. What matters right now: Client Version shows up and its version is at most one minor version apart from the server version later. Once the cluster is ready, verify the connection:
kubectl version
kubectl cluster-info
kubectl get nodeskubectl cluster-info output shows the API server URL, and kubectl get nodes shows nodes that are Ready — the official sign that your kubectl can talk to the cluster.
Helm 3 is a single client binary with no server daemon — once installed, it's ready to use immediately. The fastest and most widely used method on a local machine is the official installer script (full coverage of all methods is in episode 3):
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
helm versionhelm version shows the Helm client version along with the Go version used to build it, for example version.BuildInfo{Version:"v3.16.0"}. Make sure the major number is 3 — this entire series uses Helm 3. Unlike kubectl, Helm has no "server version" because it talks directly to the Kubernetes API server using the same kubeconfig as kubectl.
Tip
Helm reads the same kubeconfig file as kubectl (by default at ~/.kube/config). As long as kubectl get nodes succeeds, helm will automatically be able to talk to the same cluster — no extra configuration is needed.
Besides kubectl and Helm, prepare the following supporting tools:
go install github.com/yannh/kubeconform/cmd/kubeconform@latest or a binary from the GitHub releases page.-o json output from kubectl or Helm. Installation: sudo apt install -y jq.git version responds.kubeconform -v
jq --version
git --version
echo "Tools OK"This is this episode's "stress test": run your first pod in the cluster and make sure everything works end to end — kubectl talks to the API server, the scheduler places the pod, kubelet pulls the image and runs the container.
kubectl create deployment hello-k8s --image=nginx:1.27
kubectl get pods
kubectl port-forward deployment/hello-k8s 8080:80Open http://localhost:8080 — if the nginx welcome page appears, your environment is officially ready for the entire series. kubectl port-forward is a skill you'll use repeatedly in the following episodes to access applications inside the cluster without exposing them publicly. When you're done, clean up the lab:
kubectl delete deployment hello-k8sThe connection to the server localhost:8080 was refused. Fix: create the cluster first (minikube start or kind create cluster), then check kubectl config current-context.minikube start --memory 4096 or add machine RAM.Warning
Throughout the series, distinguish two contexts: before apply and after apply. Helm works before apply — it renders and assembles manifests. kubectl works after apply — it observes and debugs resources already alive in the cluster. Confusing these two contexts is the biggest source of frustration for Helm beginners.
In episode 0 you've secured five foundations: Kubernetes skills (Pod, Deployment, Service, ConfigMap, Secret, Namespace, Ingress along with their flow), kubectl habits (get, describe, apply, logs, port-forward), YAML understanding as the language of manifests, the package manager mental model (Chart ≈ package, Repository ≈ registry, Release ≈ installation), and a local cluster with verified kubectl and Helm CLI — proven by your first pod running successfully.
Points to take away:
Remember, the Learn Helm Chart series consists of 30 episodes that build on each other. Episode 0 is the first brick — and you've just laid it perfectly. In the next episode, episode 1, we step back for a moment to understand the history, background, and why Helm was born: the deployment challenges in Kubernetes, the evolution from Helm 1 to Helm 3, the story of Tiller being removed because of security issues, and an honest comparison of Helm against Kustomize and bare kubectl. See you in episode 1, and happy building your Kubernetes lab!