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 diff sebelum apply — plugin helm-diff menampilkan perbedaan antara state terpasang dan yang akan di-apply; wajib di workflow production.
  • _helpers.tpl untuk label yang konsisten — define label standar sekali di helpers, gunakan di semua template dengan include; menghindari inconsistency antar resource.
  • image.tag | default .Chart.AppVersion — pattern umum agar tag bisa di-override saat deploy tanpa harus selalu specify; default ke appVersion di Chart.yaml.

← Sebelumnya: Anti-Pattern Observability   Berikutnya: Kustomize →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact