Helm Guide
Chart Structure
myapp/
├── Chart.yaml # Chart metadata
├── values.yaml # Default configuration values
├── values.prod.yaml # Environment overrides
├── charts/ # Chart dependencies
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── hpa.yaml
│ ├── NOTES.txt # Post-install instructions
│ └── _helpers.tpl # Template helpers/partials
└── .helmignore
# Chart.yaml
apiVersion: v2
name: myapp
description: My application Helm chart
type: application
version: 0.3.1 # chart version
appVersion: "1.2.3" # app version
values.yaml
replicaCount: 3
image:
repository: registry.example.com/myapp
tag: "v1.2.3"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
targetPort: 8080
ingress:
enabled: true
className: nginx
host: app.example.com
tls: true
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
env:
LOG_LEVEL: info
DB_HOST: postgres
config:
appConfig: |
server.port=8080
feature.flag=true
Template Syntax
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
{{- if .Values.env }}
env:
{{- range $key, $val := .Values.env }}
- name: {{ $key }}
value: {{ $val | quote }}
{{- end }}
{{- end }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
# _helpers.tpl
{{- define "myapp.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- define "myapp.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
Install / Upgrade / Rollback
# Add repository
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# Search charts
helm search repo bitnami/postgresql
# Install chart
helm install myrelease ./myapp \
--namespace production \
--create-namespace \
-f values.yaml \
-f values.prod.yaml \
--set image.tag=v1.3.0 \
--set replicaCount=5
# Dry run (preview)
helm install myrelease ./myapp --dry-run --debug
# Upgrade
helm upgrade myrelease ./myapp \
--namespace production \
-f values.prod.yaml \
--set image.tag=v1.4.0 \
--atomic \
--timeout 5m
# Rollback to previous revision
helm rollback myrelease 0 # 0 = previous
helm rollback myrelease 3 # specific revision
# List releases
helm list --all-namespaces
# History
helm history myrelease -n production
# Uninstall
helm uninstall myrelease -n production
Hooks
# templates/job-migration.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "myapp.fullname" . }}-migration
annotations:
"helm.sh/hook": pre-upgrade,pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
spec:
restartPolicy: Never
containers:
- name: migration
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
command: ["./migrate.sh"]
# Hook types: pre-install, post-install, pre-upgrade,
# post-upgrade, pre-rollback, post-rollback,
# pre-delete, post-delete, test