Helm is widely known as "the package manager for Kubernetes." It simplifies application deployment by packaging Kubernetes resources into reusable, versioned units called charts. Helm helps you manage complexity, standardize deployments, and enable easy rollbacks of Kubernetes applications.
What is Helm?
Helm is a tool that streamlines installing and managing Kubernetes applications. Think of it like apt/yum/homebrew for Kubernetes. It provides several key capabilities:
- Chart Management: Find, share, and use software packaged as Kubernetes charts
- Release Management: Install, upgrade, and rollback applications with ease
- Templating: Parameterize Kubernetes manifests for different environments
- Dependency Management: Handle complex applications with multiple components
Helm Components
Helm consists of two main components:
Helm Client (CLI)
The command-line interface that users interact with. It's responsible for:
- Local chart development
- Managing repositories
- Interacting with the Helm library
- Sending charts to be installed
Helm Library
The logic that interacts with the Kubernetes API server to:
- Combine charts and configuration to build a release
- Install charts into Kubernetes and track subsequent releases
- Upgrade and rollback releases by interacting with Kubernetes
Understanding Helm Charts
A Helm chart is a collection of files that describe a related set of Kubernetes resources. Charts are the packaging format used by Helm, similar to DEB or RPM packages in Linux systems.
Chart Structure
A typical Helm chart has the following directory structure:
mychart/
├── Chart.yaml # Information about the chart
├── values.yaml # Default configuration values
├── charts/ # Directory containing dependency charts
├── templates/ # Template files
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # Helper templates
│ └── tests/ # Test files
└── README.md # Documentation
Chart.yaml
The Chart.yaml file contains metadata about the chart:
apiVersion: v2
name: myapp
description: A Helm chart for Kubernetes
type: application
version: 1.2.3
appVersion: 2.1.0
dependencies:
- name: redis
version: 10.5.7
repository: https://charts.bitnami.com/bitnami
condition: redis.enabled
Template Files
Templates are Kubernetes manifest files with added template functions and variables. Helm uses the Go template language extended with Sprig functions and special Helm functions.
Example Deployment Template
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}
labels:
app: {{ .Chart.Name }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
release: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
release: {{ .Release.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}
env:
- name: ENVIRONMENT
value: {{ .Values.environment }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
Values.yaml
The values.yaml file provides default configuration values for the template:
replicaCount: 1
image:
repository: nginx
tag: stable
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
annotations: {}
hosts:
- host: chart-example.local
paths: []
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
Template Functions and Pipelines
Helm provides powerful template functions to manipulate data:
# String manipulation
name: {{ .Values.name | upper | quote }}
# Default values
replicas: {{ .Values.replicas | default 3 }}
# Conditional logic
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
{{- end }}
# Range loops
env:
{{- range .Values.extraEnv }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
# With blocks
{{- with .Values.resources }}
resources:
limits:
cpu: {{ .limits.cpu }}
memory: {{ .limits.memory }}
requests:
cpu: {{ .requests.cpu }}
memory: {{ .requests.memory }}
{{- end }}
Deploying Applications with Helm
Helm Repositories
Helm charts are stored in repositories. You can add, list, and search repositories:
# Add a repository
helm repo add bitnami https://charts.bitnami.com/bitnami
# List repositories
helm repo list
# Update repository information
helm repo update
# Search for charts
helm search repo nginx
# Remove a repository
helm repo remove bitnami
Installing Charts
You can install charts from various sources:
From a Repository
# Install the latest version
helm install my-release bitnami/nginx
# Install a specific version
helm install my-release bitnami/nginx --version 9.5.4
# Install with custom values
helm install my-release bitnami/nginx -f values.yaml
# Install with set values
helm install my-release bitnami/nginx \
--set service.type=LoadBalancer \
--set replicaCount=3
From a Local Chart Directory
# Install from local directory
helm install my-release ./mychart
# Dry-run to test installation
helm install my-release ./mychart --dry-run
# Debug template rendering
helm template my-release ./mychart
From a Chart Archive
# Package a chart first
helm package ./mychart
# Install from the packaged chart
helm install my-release mychart-1.2.3.tgz
Managing Releases
Helm keeps track of installed charts as "releases":
# List releases
helm list
# List all releases (including deleted ones)
helm list --all
# Get status of a release
helm status my-release
# Get the manifest of a release
helm get manifest my-release
# Get the values of a release
helm get values my-release
# Upgrade a release
helm upgrade my-release bitnami/nginx --set replicaCount=3
# Rollback a release
helm rollback my-release 1
# Uninstall a release
helm uninstall my-release
Advanced Helm Features
Chart Dependencies
Charts can depend on other charts, which are stored in the charts/ directory:
# Manage dependencies
helm dependency update ./mychart
helm dependency build ./mychart
helm dependency list ./mychart
Hooks
Helm hooks allow you to intervene at certain points in a release lifecycle:
apiVersion: batch/v1
kind: Job
metadata:
name: "{{ .Release.Name }}-db-migration"
annotations:
"helm.sh/hook": pre-upgrade,pre-install
"helm.sh/hook-weight": "5"
"helm.sh/hook-delete-policy": before-hook-creation
spec:
template:
spec:
containers:
- name: db-migration
image: alpine
command: ["/bin/sh", "-c", "echo 'Running database migration'"]
restartPolicy: Never
Tests
Helm supports test definitions to validate chart installations:
# templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ .Release.Name }}-test-connection"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ .Release.Name }}:{{ .Values.service.port }}']
restartPolicy: Never
Best Practices
Chart Development
- Follow semantic versioning for charts
- Use template functions for conditional resources
- Include comprehensive values.yaml with comments
- Provide README with installation instructions
- Include NOTES.txt for post-install information
Security
- Never include secrets in charts - use external secret management
- Validate chart sources before installation
- Use --dry-run to preview changes before applying
- Limit Tiller permissions in Helm 2 (Helm 3 doesn't use Tiller)
CI/CD Integration
- Store charts in version control
- Automate chart testing and linting
- Use chart museum or OCI registries for chart storage
- Implement automated release processes
Helm 2 vs Helm 3
Helm 3 introduced significant improvements over Helm 2:
- Removed Tiller: No server-side component, improved security
- Improved Upgrade Strategy: Three-way strategic merge patches
- Library Charts
- OCI Support: Store charts in OCI registries
- JSON Schema Validation
Helm dramatically simplifies Kubernetes application management by providing a consistent way to define, install, and upgrade even the most complex applications. Its templating system, release management, and repository ecosystem make it an indispensable tool for Kubernetes operators and developers.
.png)
0 Comments