Helm is the package manager for Kubernetes. It simplifies deployment, upgrades, and rollbacks for complex applications. If you think of apt or yum on Linux, Helm plays a similar role: it groups multiple Kubernetes resources—such as Deployments, Services, and ConfigMaps—into a single Chart, so an application can be installed and managed as one unit.

Core concepts

Chart

A Chart is Helm's packaging unit. It contains all the resource definitions needed to deploy an application, usually as YAML files.

  mychart/
  ├── Chart.yaml          # chart metadata (name, version, etc.)
  ├── values.yaml         # default configuration values
  ├── charts/             # dependent subcharts
  └── templates/          # templates (combined with values to generate Kubernetes resources)

Release

A Release is an instance of a Chart running in a Kubernetes cluster. The same Chart can be deployed multiple times, and each deployment creates its own Release. For example, deploying a MySQL Chart twice for the databases of application A and application B produces two separate Releases.

Repository

A Repository stores and shares Charts, similar to a Maven repository or npm registry. Artifact Hub is the official repository and a public Chart library maintained by the community.

How Helm works

Template rendering

Helm combines templates in the templates/ directory with values.yaml or user-supplied values to produce the final Kubernetes resource YAML.

# Template example (templates/deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
 name: {{ .Release.Name }}-web
spec:
 replicas: {{ .Values.replicaCount }}  # uses a value from values

Client and server architecture

  • Helm client: the command-line tool used by operators, such as helm install.
  • Tiller (deprecated): early Helm versions used Tiller as a server-side component running inside the cluster. Helm 3 removed Tiller and improved security.

What Helm is used for

Application deployment and management

  • Install a Chart:
helm install my-release stable/mysql  # Install MySQL from the official repository
  • List Releases:
helm list  # List all deployed Releases
  • Upgrade and roll back:
helm upgrade my-release stable/mysql --set mysqlRootPassword=newpass  # Update configuration
helm rollback my-release 1     # Roll back to the previous version

Parameterized configuration

Configuration can be customized through values.yaml or command-line arguments, so deployment settings do not need to be hard-coded.

helm install my-app ./mychart --values custom-values.yaml  # Use custom values

Dependency management

Dependencies are declared in Chart.yaml, and Helm resolves them automatically.

dependencies:
- name: redis
  version: 15.5.6
  repository: https://charts.bitnami.com/bitnami

Hooks

Hooks run custom actions at specific stages, such as initializing a database before deployment.

apiVersion: batch/v1
kind: Job
metadata:
  annotations:
    "helm.sh/hook": pre-install  # Run before installation
spec:
  template:
    spec:
      containers:
      - name: init-db
        image: mysql

Why Helm is useful

  1. Simpler deployment for complex applications: an application with a web service, database, and cache can be deployed with one command instead of writing and applying each YAML file separately.
  2. Version control: each Release keeps a change history, and you can roll back to any previous version.
  3. Parameterization and reuse: values files let the same Chart serve development, testing, and production environments with different settings.
  4. A broad community ecosystem: official and third-party repositories offer many ready-made Charts, including Nginx, Prometheus, and WordPress.

Common scenarios

  • Microservices: deploy an application made of multiple services, such as an e-commerce system with order, user, and payment services.
  • CI/CD pipelines: integrate Helm with Jenkins, GitLab CI, or similar tools to automate deployment.
  • Environment consistency: use the same Chart across development, testing, and production to keep configuration consistent.
  • Third-party applications: quickly install and configure middleware such as monitoring with Prometheus and Grafana, or messaging with RabbitMQ.

Helm compared with plain Kubernetes

<table> <thead> <tr> <th>Aspect</th> <th>Plain Kubernetes</th> <th>Helm</th> </tr> </thead> <tbody> <tr> <td>Configuration management</td> <td>Maintain multiple YAML files manually</td> <td>Package resources as one Chart with parameter support</td> </tr> <tr> <td>Deployment complexity</td> <td>Apply each resource with kubectl apply</td> <td>Deploy with one command and resolve dependencies automatically</td> </tr> <tr> <td>Version control</td> <td>Record changes manually</td> <td>Automatically track Release history and support rollback</td> </tr> <tr> <td>Environment adaptation</td> <td>Copy or modify YAML files for each environment</td> <td>Use values files for different environments</td> </tr> <tr> <td>Community support</td> <td>Basic resource definitions that you write yourself</td> <td>Many mature, prepackaged Charts available</td> </tr> </tbody> </table>

Installation and basic commands

Install Helm

# macOS (via Homebrew)
brew install helm

# Linux (via script)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Basic operations

# Add the official repository
helm repo add stable https://charts.helm.sh/stable
helm repo update

# Search for a Chart
helm search repo mysql

# Install a Chart
helm install my-mysql stable/mysql --set mysqlRootPassword=secret

# View Release details
helm status my-mysql

# Uninstall a Release
helm uninstall my-mysql

Helm is valuable because it turns a collection of Kubernetes manifests into a reusable, configurable package with a release history. Once the basics of Kubernetes are clear, learning Helm is a practical next step for projects that need to manage multiple resources, environments, and deployment revisions together.