Helm #
Mendeploy aplikasi ke Kubernetes berarti mengelola banyak manifest — Deployment, Service, ConfigMap, HPA, Ingress, ServiceAccount, dan lainnya — yang semuanya harus dikonfigurasi berbeda untuk setiap environment. Helm adalah package manager untuk Kubernetes yang mengelompokkan semua manifest ini menjadi satu unit yang disebut chart, memungkinkan kamu install, upgrade, rollback, dan hapus seluruh aplikasi dengan satu perintah.
Mengapa Helm? #
Tanpa Helm: deploy 12 manifest terpisah
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
kubectl apply -f hpa.yaml
kubectl apply -f ingress.yaml
kubectl apply -f serviceaccount.yaml
... dan seterusnya per environment
Dengan Helm: satu perintah
helm install my-app ./chart --values values-production.yaml
helm upgrade my-app ./chart --values values-production.yaml
helm rollback my-app 2
helm uninstall my-app
Struktur Helm Chart #
my-app/
├── Chart.yaml # metadata chart (nama, versi, deskripsi)
├── values.yaml # nilai default untuk semua template
├── charts/ # dependency chart (sub-chart)
│ └── redis-19.0.0.tgz
├── templates/
│ ├── _helpers.tpl # template helper (didefinisikan dengan {{- define }})
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── serviceaccount.yaml
│ └── NOTES.txt # pesan yang ditampilkan setelah install
└── .helmignore # file yang diabaikan saat package chart
Chart.yaml #
apiVersion: v2 # v2 untuk Helm 3
name: my-app
description: API service untuk platform e-commerce
type: application # atau "library" untuk shared chart
version: 1.3.0 # versi chart (bukan versi aplikasi)
appVersion: "2.1.0" # versi aplikasi yang di-package
keywords:
- api
- backend
maintainers:
- name: Platform Team
email: [email protected]
dependencies:
- name: redis
version: "19.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled # install hanya jika redis.enabled=true
values.yaml dan Templating #
# values.yaml — nilai default
replicaCount: 2
image:
repository: my-registry.io/my-app
tag: "" # default kosong, biasanya di-override saat install
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
hostname: ""
tls: false
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
redis:
enabled: false # dependency redis dinonaktifkan secara default
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
resources:
{{- toYaml .Values.resources | nindent 10 }}
# templates/_helpers.tpl — template yang reusable
{{/*
Nama lengkap resource (release-name + chart-name)
*/}}
{{- define "my-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Labels standar
*/}}
{{- define "my-app.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
Perintah Helm yang Sering Digunakan #
# Install release baru
helm install my-app ./my-app \
--namespace production \
--create-namespace \
--values values-production.yaml \
--set image.tag=v2.1.0
# Upgrade release yang sudah ada
helm upgrade my-app ./my-app \
--namespace production \
--values values-production.yaml \
--set image.tag=v2.2.0 \
--atomic # rollback otomatis jika upgrade gagal
--cleanup-on-fail # hapus resource baru jika gagal
# Preview perubahan sebelum apply (dry-run)
helm diff upgrade my-app ./my-app \
--namespace production \
--values values-production.yaml
# Lihat semua release
helm list -A
# Lihat riwayat release
helm history my-app -n production
# Rollback ke revision sebelumnya
helm rollback my-app 3 -n production
# Hapus release
helm uninstall my-app -n production
# Render template lokal tanpa install (debug)
helm template my-app ./my-app --values values-production.yaml
Dependency Management #
# Update dependency (download chart dependencies ke charts/)
helm dependency update ./my-app
# Lihat dependency
helm dependency list ./my-app
# Verifikasi dependency sudah ter-download
ls ./my-app/charts/
Helm Repository #
# Tambahkan repository chart publik
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Cari chart
helm search repo redis
# Install dari repository
helm install my-redis bitnami/redis \
--set auth.password=mysecret \
-n production
# Push chart ke OCI registry (Helm 3.8+)
helm package ./my-app
helm push my-app-1.3.0.tgz oci://my-registry.io/charts
Ringkasan #
- Helm chart = unit deployable yang komplit — satu perintah untuk install/upgrade/rollback seluruh aplikasi beserta semua dependensinya.
- values.yaml untuk konfigurasi, bukan hardcode di template — semua yang mungkin berbeda antar environment harus jadi value; template harus bisa render untuk semua environment tanpa modifikasi.
helm upgrade --atomic— rollback otomatis jika upgrade gagal sampai batas--timeout; sangat penting untuk production deployment yang aman.helm diffsebelum apply — pluginhelm-diffmenampilkan perbedaan antara state terpasang dan yang akan di-apply; wajib di workflow production._helpers.tpluntuk label yang konsisten — define label standar sekali di helpers, gunakan di semua template denganinclude; menghindari inconsistency antar resource.image.tag | default .Chart.AppVersion— pattern umum agar tag bisa di-override saat deploy tanpa harus selalu specify; default keappVersiondi Chart.yaml.
← Sebelumnya: Anti-Pattern Observability Berikutnya: Kustomize →