Understanding Helm Fundamentals

1. Understanding Helm Architecture

Component Role Location
Helm CLI Client-side binary (Go) that renders charts and talks to Kubernetes API Developer workstation / CI runner
Chart Packaged collection of templated Kubernetes manifests + metadata Local FS, repository, or OCI registry
Release Named instance of a chart installed into a cluster Kubernetes Secret (driver=secrets) in release namespace
Repository HTTP server or OCI registry hosting packaged charts + index.yaml Static site / ChartMuseum / Harbor / GHCR / ECR
Kubernetes API Target where rendered manifests are applied via three-way merge Cluster API server

Helm 3 Client-Only Flow

Developer → helm CLI → render templates (local)
                          ↓
                    K8s API server → etcd (manifests + Release Secret)
Note: Helm 3 removed Tiller. All authorization is delegated to the user's kubeconfig RBAC.

2. Understanding Chart Concept

File / DirRequiredPurpose
Chart.yamlYesMetadata: name, version, appVersion, dependencies
values.yamlYesDefault configuration values
templates/YesGo template files rendered into K8s manifests
charts/NoVendored subchart dependencies
crds/NoCustomResourceDefinitions installed before templates
templates/NOTES.txtNoPost-install user instructions
templates/_helpers.tplNoNamed template partials (not rendered directly)
values.schema.jsonNoJSON Schema validation for values
.helmignoreNoFiles excluded from packaging

3. Understanding Release Concept

AttributeDescription
NameUnique per namespace; DNS-1123 label
RevisionMonotonically increasing integer per install/upgrade/rollback
Statusdeployed, failed, pending-upgrade, superseded, uninstalled
StorageKubernetes Secret sh.helm.release.v1.<name>.v<rev>
History limitDefault 10 revisions retained (--history-max)

4. Understanding Repository Concept

TypeProtocolIndex
HTTP repoHTTPS GETindex.yaml at repo root
OCI registry STABLE 3.8+OCI distribution specNo index; uses registry tag listing
Git (plugin)Git over SSH/HTTPSVia helm-git plugin
Local pathFilesystemNone; direct chart reference

5. Understanding Values Hierarchy

Priority (low → high)Source
1Subchart values.yaml
2Parent chart values.yaml
3-f / --values files (in order)
4--set, --set-string, --set-file, --set-json
Note: Later sources override earlier; maps merge deeply, lists replace entirely.

6. Understanding Template Rendering

Render Pipeline

  1. Load chart + dependencies into memory
  2. Merge values (chart defaults → user values → --set)
  3. Validate against values.schema.json if present
  4. Execute Go templates with Sprig + Helm functions
  5. Parse YAML; separate hooks from regular resources
  6. Send to Kubernetes API via three-way merge

7. Understanding Chart Lifecycle

Lifecycle States

install → [deployed] → upgrade → [deployed]
                ↓                       ↓
            rollback ← ← ← ← ← ← ← failed
                ↓
            uninstall → [uninstalled / purged]

8. Understanding Helm Three-Way Merge

SourceRole in Merge
Old manifestPrevious release revision stored in Helm Secret
New manifestNewly rendered output from upgrade
Live stateCurrent object in cluster (captures drift)
Note: Helm 3 detects drift by comparing live state to old manifest, then computes patch from new manifest — preventing accidental overwrite of out-of-band edits to fields Helm doesn't manage.

9. Understanding Chart API Versions

apiVersionHelmDependencies
v1 LEGACYHelm 2requirements.yaml (external file)
v2 CURRENTHelm 3+dependencies: in Chart.yaml; supports type: library

10. Comparing Helm vs Kustomize

Helm

  • Templated (Go templates + Sprig)
  • Package manager: versioning, repos, releases, rollback
  • Conditional logic, loops, dependencies
  • Steeper learning curve; whitespace pitfalls
  • Best for: distributable apps, complex parameterization

Kustomize

  • Overlay-based (no templates)
  • Pure YAML patches (strategic / JSON 6902)
  • No release tracking; kubectl apply driven
  • Simpler; built into kubectl
  • Best for: environment overlays of internal manifests
Note: They compose — use Kustomize as a Helm post-renderer for cluster-specific patches.