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
- 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.
- Version control: each Release keeps a change history, and you can roll back to any previous version.
- Parameterization and reuse: values files let the same Chart serve development, testing, and production environments with different settings.
- 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 withkubectl 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.