9.9 Helm Package Management
Managing Complex Kubernetes Applications
Helm is the package manager for Kubernetes, making it easy to deploy and manage complex applications.
Helm Basics
Charts, Releases, and Repositories
# Install Helm
curl https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz | tar xz
sudo mv linux-amd64/helm /usr/local/bin/
# Add chart repositories
helm repo add stable https://charts.helm.sh/stable
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
Installing Applications
# Install from repository
helm install my-nginx bitnami/nginx
helm install postgres bitnami/postgresql --set auth.postgresPassword=secret123
# List releases
helm list
helm status my-nginx
Creating Charts
Basic Chart Structure
# Create new chart
helm create webapp
# Chart structure
webapp/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
└── charts/
Chart.yaml
# Chart metadata
apiVersion: v2
name: webapp
description: A Helm chart for web application
version: 0.1.0
appVersion: "1.0.0"
values.yaml
# Default values
replicaCount: 1
image:
repository: webapp
tag: "latest"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
host: webapp.example.com
Templates
Templating with Go Templates
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "webapp.fullname" . }}
labels:
{{- include "webapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "webapp.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "webapp.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- name: http
containerPort: 8080
Helpers Template
# templates/_helpers.tpl
{{- define "webapp.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- define "webapp.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
Managing Releases
Deployment and Updates
# Install with custom values
helm install webapp ./webapp --set replicaCount=3
helm install webapp ./webapp -f production-values.yaml
# Upgrade releases
helm upgrade webapp ./webapp --set image.tag=v2.0.0
# Rollback
helm rollback webapp 1
# Uninstall
helm uninstall webapp
Environment-Specific Values
# production-values.yaml
replicaCount: 3
image:
tag: "v1.2.3"
ingress:
enabled: true
host: myapp.company.com
tls:
enabled: true
resources:
limits:
cpu: 1000m
memory: 1Gi
Dependencies
Chart Dependencies
# Chart.yaml
dependencies:
- name: postgresql
version: "11.6.12"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled
- name: redis
version: "16.13.2"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
# Update dependencies
helm dependency update
helm dependency build
Testing Charts
Chart Testing
# Lint chart
helm lint ./webapp
# Dry run
helm install webapp ./webapp --dry-run --debug
# Template rendering
helm template webapp ./webapp
Test Templates
# templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "webapp.fullname" . }}-test"
annotations:
"helm.sh/hook": test
spec:
restartPolicy: Never
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "webapp.fullname" . }}:{{ .Values.service.port }}']
# Run tests
helm test webapp
Essential Commands
# Repository management
helm repo list
helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo postgres
# Release management
helm list --all-namespaces
helm history webapp
helm get values webapp
helm get manifest webapp
# Chart development
helm create mychart
helm package mychart/
helm install mychart ./mychart-0.1.0.tgz
What’s Next?
Next, we’ll explore GitOps with ArgoCD for automated deployment workflows.