1. Pengenalan Helm
Helm adalah package manager resmi untuk Kubernetes. Sama seperti apt atau npm mengelola paket di sistem operasi atau Node.js, Helm mengelola paket aplikasi di Kubernetes. Paket-paket ini disebut chart β sekumpulan file YAML yang didefinisikan untuk menginstal, memperbarui, atau menghapus aplikasi di cluster Kubernetes.
Dengan hanya satu perintah helm install, Anda bisa mendeployseluruh stack aplikasi β termasuk Deployment, Service, ConfigMap, Secret, Ingress, dan resource Kubernetes lainnya β tanpa perlu menulis puluhan bahkan ratusan file YAML secara manual.
Mengapa Helm Penting?
| Manfaat | Penjelasan |
|---|---|
| Packaging | Mengemas semua Kubernetes manifests menjadi satu unit yang bisa di-share dan di-install ulang |
| Templating | Variable dan conditionals memungkinkan satu chart dikonfigurasi untuk banyak environment |
| Release Management | Setiap instalasi Helm disebut release, memungkinkan rollback dan history |
| Repositori | Berbagi chart melalui repository seperti ArtifactHub atau ChartMuseum |
| Dependency Management | Chart bisa memiliki sub-chart sebagai dependency, mirip npm package.json |
| Rollback | Sangat mudah melakukan rollback ke versi sebelumnya jika ada masalah |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β HELM ECOSYSTEM β β β β ββββββββββββ ββββββββββββββββ βββββββββββββββββββββ β β β Helm β β Helm β β Helm Repos β β β β CLI βββββΊβ Chart ββββββ - ArtifactHub β β β β (Client) β β (Template) β β - ChartMuseum β β β ββββββββββββ ββββββββ¬ββββββββ β - Custom Repo β β β β βββββββββββββββββββββ β β βΌ β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β KUBERNETES CLUSTER β β β β ββββββββββββββ ββββββββββββββ ββββββββββββββ β β β β β Release 1 β β Release 2 β β Release 3 β β β β β β (nginx) β β (redis) β β (postgres) β β β β β β β β β β β β β β β β Chart: β β Chart: β β Chart: β β β β β β ingress- β β bitnami/ β β bitnami/ β β β β β β nginx β β redis β β postgresql β β β β β ββββββββββββββ ββββββββββββββ ββββββββββββββ β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Konsep dasar Helm meliputi:
- Chart β paket yang berisi template YAML Kubernetes beserta konfigurasinya
- Release β satu instalasi chart di dalam cluster Kubernetes
- Repository β tempat menyimpan dan berbagi chart
- Values β file konfigurasi yang menentukan bagaimana chart di-deploy
2. Instalasi Helm
Helm tersedia untuk berbagai platform. Helm 3 adalah versi terbaru yang tidak lagi membutuhkan Tiller (server-side component yang ada di Helm 2).
Linux (menggunakan skrip instalasi)
# Download dan instal Helm secara otomatis
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Verifikasi instalasi
helm version
# version.BuildInfo{Version:"v3.15.0", GitCommit:"c27a625", GoVersion:"go1.22.3"}
# Cek konfigurasi
helm env
macOS (menggunakan Homebrew)
# Instalasi menggunakan Homebrew brew install helm # Verifikasi helm version
Windows (menggunakan Chocolatey)
# Instalasi menggunakan Chocolatey choco install kubernetes-helm # Verifikasi helm version
Mengunduh Binari Langsung
# Download dari GitHub releases wget https://get.helm.sh/helm-v3.15.0-linux-amd64.tar.gz # Ekstrak tar -zxvf helm-v3.15.0-linux-amd64.tar.gz # Pindahkan ke PATH sudo mv linux-amd64/helm /usr/local/bin/helm # Verifikasi helm version
Pastikan kubectl sudah terkonfigurasi dengan benar sebelum menggunakan Helm, karena Helm akan berinteraksi langsung dengan Kubernetes cluster melalui kubeconfig.
3. Helm Charts
Chart adalah unit dasar packaging di Helm. Sebuah chart berisi deskripsi set resource Kubernetes yang related, dan Helm menggunakannya untuk membuat release baru di cluster Anda. Chart berada dalam direktori dengan struktur tertentu yang sudah didefinisikan.
Struktur Direktori Chart
my-chart/ βββ Chart.yaml # Metadata chart (nama, versi, deskripsi) βββ Chart.lock # Lock file untuk dependencies βββ values.yaml # Default values untuk konfigurasi βββ values.schema.json # JSON Schema untuk validasi values βββ charts/ # Direktori sub-chart dependencies β βββ dependency-1/ βββ templates/ # Template Kubernetes manifests β βββ deployment.yaml β βββ service.yaml β βββ ingress.yaml β βββ configmap.yaml β βββ _helpers.tpl # Template helpers (reusable functions) β βββ NOTES.txt # Catatan yang ditampilkan setelah install β βββ tests/ β βββ test-connection.yaml βββ .helmignore # File yang diabaikan saat packaging βββ LICENSE # Lisensi (opsional)
File Chart.yaml
File Chart.yaml berisi metadata chart yang sangat penting:
apiVersion: v2
name: my-nginx-app
description: Aplikasi Nginx deployment dengan Helm
type: application # "application" atau "library"
version: 0.2.0 # Versi chart ini (semver)
appVersion: "1.27.0" # Versi aplikasi yang di-deploy
keywords:
- nginx
- web-server
- reverse-proxy
maintainers:
- name: BeebaneLabs
email: dev@beebanelabs.com
url: https://beebanelabs.pages.dev
home: https://beebanelabs.pages.dev
sources:
- https://github.com/Beebane25/helm-charts
icon: https://beebanelabs.pages.dev/images/logo_beebane.png
dependencies:
- name: common
version: "2.x.x"
repository: "https://charts.bitnami.com/bitnami"
Jenis Chart
| Jenis | Penjelasan | Contoh |
|---|---|---|
| Application | Chart biasa yang bisa di-install ke cluster | Nginx, MySQL, Redis |
| Library | Chart yang hanya menyediakan helper templates, tidak bisa di-install sendiri | bitnami/common |
Template Kubernetes di Chart
Template di dalam chart menggunakan sintaks Go template yang dienkapsulasi dalam kurung dua {{ }}:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-chart.fullname" . }}
labels:
{{- include "my-chart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-chart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-chart.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.targetPort }}
{{- if .Values.resources }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- end }}
Melihat Chart yang Tersedia
# Lihat chart yang bisa di-install dari repository yang ditambahkan helm search repo nginx # Cari chart di ArtifactHub helm search hub nginx # Lihat detail chart helm show chart bitnami/nginx helm show values bitnami/nginx helm show readme bitnami/nginx helm show all bitnami/nginx
4. Helm Values & Customization
Values adalah mekanisme utama Helm untuk menyesuaikan chart tanpa mengubah template. File values.yaml berisi default konfigurasi yang bisa di-override saat install atau upgrade.
File values.yaml Default
# values.yaml - Default configuration
# BeebaneLabs Helm Chart
replicaCount: 3
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "1.27.0"
service:
type: ClusterIP
port: 80
targetPort: 8080
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: app.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: app-tls
hosts:
- app.example.com
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 250m
memory: 128Mi
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 75
monitoring:
enabled: true
port: 9090
Override Values saat Install
# Override value dari command line helm install my-release bitnami/nginx \ --set replicaCount=5 \ --set image.tag=1.27.1 \ --set service.type=LoadBalancer # Override dengan multiple values helm install my-release bitnami/nginx \ --set replicaCount=5 \ --set ingress.enabled=false # Gunakan file values custom helm install my-release bitnami/nginx \ -f my-custom-values.yaml # Gabungkan values default + custom helm install my-release bitnami/nginx \ -f production-values.yaml \ --set image.tag=latest
Perintah yang Berguna untuk Values
# Lihat values yang sudah di-install helm get values my-release # Lihat semua values (termasuk default) helm get values my-release --all # Lihat values dalam format yaml helm get values my-release -o yaml # Render template dengan values tertentu (tanpa install) helm template my-release bitnami/nginx \ -f production-values.yaml # Validasi chart dengan values tertentu helm lint bitnami/nginx \ -f production-values.yaml
Konfigurasi Per Environment
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β VALUES MANAGEMENT STRATEGY β β β β values.yaml (Default) β β βββ replicaCount: 1 β β βββ image.tag: "1.0.0" β β βββ resources: (minimal) β β β β β ββββΊ values-dev.yaml (Development) β β β βββ replicaCount: 1 β β β βββ image.tag: "latest" β β β βββ ingress.enabled: false β β β β β ββββΊ values-staging.yaml (Staging) β β β βββ replicaCount: 2 β β β βββ image.tag: "1.0.0-rc1" β β β βββ resources: (medium) β β β β β ββββΊ values-production.yaml (Production) β β βββ replicaCount: 5 β β βββ image.tag: "1.0.0" β β βββ resources: (high) β β βββ autoscaling.enabled: true β β βββ monitoring.enabled: true β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
5. Helm Releases
Sebuah release adalah satu instalasi chart di dalam Kubernetes cluster. Setiap release memiliki nama unik dan bisa dikelola secara terpisah β di-upgrade, di-rollback, atau di-uninstall.
Perintah Install
# Install chart dari repository helm install my-nginx bitnami/nginx # Install dengan nama release tertentu helm install web-app bitnami/nginx --generate-name # Install dengan namespace tertentu helm install my-nginx bitnami/nginx --namespace production # Install dan buat namespace jika belum ada helm install my-nginx bitnami/nginx \ --namespace production --create-namespace # Install dalam mode dry-run (preview tanpa deploy) helm install my-nginx bitnami/nginx --dry-run --debug # Install tanpa meng-update release notes helm install my-nginx bitnami/nginx --no-hooks # Install chart dari direktori lokal helm install my-nginx ./my-local-chart # Install chart dari file helm install my-nginx ./my-local-chart-0.1.0.tgz
Perintah Upgrade
# Upgrade release dengan chart baru helm upgrade my-nginx bitnami/nginx \ --set replicaCount=5 # Upgrade dengan file values baru helm upgrade my-nginx bitnami/nginx \ -f new-values.yaml # Upgrade ke versi chart tertentu helm upgrade my-nginx bitnami/nginx --version 18.0.0 # Upgrade atau install jika belum ada (--install) helm upgrade --install my-nginx bitnami/nginx \ -f values.yaml # Upgrade tanpa konfirmasi helm upgrade my-nginx bitnami/nginx --wait --timeout 5m # Lihat history revision helm history my-nginx # Rollback ke revision sebelumnya helm rollback my-nginx 1 # Rollback ke revision tertentu helm rollback my-nginx 3 --wait
Perintah Manage
# Lihat semua releases di semua namespace helm list --all-namespaces # Lihat releases di namespace tertentu helm list -n production # Lihat detail release helm get all my-nginx # Lihat manifest yang di-deploy helm get manifest my-nginx # Lihat notes setelah install helm get notes my-nginx # Uninstall release helm uninstall my-nginx # Uninstall dari namespace tertentu helm uninstall my-nginx -n production # Uninstall dengan konfirmasi helm uninstall my-nginx --dry-run # Lihat status release helm status my-nginx
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RELEASE LIFECYCLE β
β β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β INSTALL βββββΊβ UPGRADE βββββΊβ UPGRADE ββββΊ ... β
β β rev 1 β β rev 2 β β rev 3 β β
β ββββββββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β
β βΌ βΌ β
β ββββββββββββ ββββββββββββ β
β β ROLLBACK β β ROLLBACKβ β
β β rev 1 β β rev 2 β β
β ββββββββββββ ββββββββββββ β
β β β
β βΌ β
β ββββββββββββ β
β β UNINSTALLβ β
β β (hapus) β β
β ββββββββββββ β
β β
β Revisions: {1, 2, 3, ...} disimpan otomatis β
β Default retention: 10 revisions terakhir β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
6. Helm Repositories
Repository adalah kumpulan chart yang bisa diakses melalui HTTP. Repository memungkinkan Anda berbagi chart dengan tim atau komunitas. ArtifactHub adalah repository publik terbesar untuk Helm chart.
Mengelola Repository
# Tambah repository Bitnami helm repo add bitnami https://charts.bitnami.com/bitnami # Tambah repository Grafana helm repo add grafana https://grafana.github.io/helm-charts # Tambah repository NGINX Ingress helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx # Update cache repository helm repo update # Lihat semua repository yang ditambahkan helm repo list # Lihat chart di repository tertentu helm search repo bitnami # Hapus repository helm repo remove bitnami
Repository Populer
| Repository | URL | Chart Populer |
|---|---|---|
| Bitnami | charts.bitnami.com/bitnami | nginx, redis, postgresql, mysql, wordpress |
| Grafana | grafana.github.io/helm-charts | grafana, loki, prometheus |
| Jetstack | charts.jetstack.io | cert-manager |
| NGINX Ingress | kubernetes.github.io/ingress-nginx | ingress-nginx |
| Harbor | helm.goharbor.io | harbor (container registry) |
Membuat Repository Sendiri
# Package chart menjadi file tgz helm package ./my-chart # Output: my-chart-0.2.0.tgz # Buat direktori untuk repository mkdir -p repo # Pindahkan file package mv my-chart-0.2.0.tgz repo/ # Buat index file (index.yaml) helm repo index repo/ --url https://charts.example.com # Hasilnya akan menghasilkan repo/index.yaml seperti: # apiVersion: v1 # entries: # my-chart: # - name: my-chart # version: 0.2.0 # ... # Upload repo/ ke web server atau cloud storage # Tambahkan repository sendiri helm repo add myrepo https://charts.example.com # Gunakan chart dari repository sendiri helm install my-app myrepo/my-chart
Untuk repository private, Anda bisa menggunakan ChartMuseum, Harbor, atau AWS S3 sebagai backend storage. Beberapa layanan seperti JFrog Artifactory juga mendukung Helm repository secara native.
7. Membuat Chart Sendiri
Membuat chart sendiri memberikan kontrol penuh atas cara aplikasi di-deploy di Kubernetes. Mari kita buat chart lengkap dari awal untuk sebuah aplikasi web sederhana.
Langkah 1: Inisialisasi Chart
# Buat chart baru dengan nama "web-app" helm create web-app # Lihat struktur yang dihasilkan tree web-app/ # web-app/ # βββ Chart.yaml # βββ .helmignore # βββ charts/ # βββ templates/ # β βββ deployment.yaml # β βββ service.yaml # β βββ serviceaccount.yaml # β βββ hpa.yaml # β βββ ingress.yaml # β βββ _helpers.tpl # β βββ NOTES.txt # β βββ tests/ # β βββ test-connection.yaml # βββ values.yaml
Langkah 2: Edit Chart.yaml
apiVersion: v2
name: web-app
description: Chart Helm untuk aplikasi web BeebaneLabs
type: application
version: 0.1.0
appVersion: "1.0.0"
maintainers:
- name: BeebaneLabs
email: dev@beebanelabs.com
Langkah 3: Konfigurasi Values
# values.yaml untuk aplikasi web
replicaCount: 2
image:
repository: beebanelabs/web-app
pullPolicy: IfNotPresent
tag: "1.0.0"
serviceAccount:
create: true
name: ""
annotations: {}
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: nginx
annotations: {}
hosts:
- host: web-app.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
Langkah 4: Buat Deployment Template
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "web-app.fullname" . }}
labels:
{{- include "web-app.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "web-app.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "web-app.selectorLabels" . | nindent 8 }}
spec:
serviceAccountName: {{ include "web-app.serviceAccountName" . }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /healthz
port: http
initialDelaySeconds: 15
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: http
initialDelaySeconds: 5
periodSeconds: 5
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
Langkah 5: Build, Test, dan Install
# Lint chart (validasi syntax) helm lint web-app/ # Render template (preview output YAML) helm template my-release web-app/ # Dry-run install helm install my-release web-app/ --dry-run --debug # Install chart helm install my-release web-app/ \ --set image.tag=1.0.0 \ --set replicaCount=3 # Package chart untuk distribusi helm package web-app/ # Install test helm test my-release
_helpers.tpl: Template Helpers
{{/*
Expand the name of the chart.
*/}}
{{- define "web-app.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
*/}}
{{- define "web-app.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "web-app.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
{{ include "web-app.selectorLabels" . }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "web-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
8. Helm Template Functions
Helm menggunakan engine templating Go yang sangat powerful. Memahami fungsi-fungsi template memungkinkan Anda membuat chart yang lebih dinamis dan fleksibel.
Fungsi Dasar
# Akses values
{{ .Values.image.repository }}
{{ .Values.replicaCount }}
# Akses chart metadata
{{ .Chart.Name }}
{{ .Chart.Version }}
# Akses release info
{{ .Release.Name }}
{{ .Release.Namespace }}
# Default value (jika kosong, pakai default)
{{ .Values.image.tag | default "latest" }}
# Conditional (if/else)
{{- if .Values.ingress.enabled }}
# Ingress configuration
{{- end }}
# Range (loop)
{{- range .Values.ingress.hosts }}
- host: {{ .host }}
{{- end }}
# With (scope change)
{{- with .Values.resources }}
resources:
limits:
cpu: {{ .limits.cpu }}
{{- end }}
# toYaml (convert ke yaml)
{{ toYaml .Values.resources | nindent 10 }}
# quote & squote
{{ .Values.image.repository | quote }}
# printf (format string)
{{ printf "%s-%s" .Release.Name .Chart.Name }}
# required (wajib diisi)
{{ required "Image repository wajib diisi!" .Values.image.repository }}
# fail (hentikan rendering dengan error)
{{ fail "Error: ingress host harus diisi" }}
Fungsi Sprig (Tambahan Helm)
Helm mendukung library Sprig yang menyediakan ratusan fungsi tambahan:
# String manipulation
{{ .Values.name | upper }} # "HELLO"
{{ .Values.name | lower }} # "hello"
{{ .Values.name | title }} # "Hello"
{{ .Values.name | trunc 5 }} # "Hello" (truncate)
{{ .Values.name | replace "o" "0" }} # "Hell0"
# Lists & Dicts
{{ list "a" "b" "c" }} # [a b c]
{{ dict "key1" "val1" "key2" "val2" }}
{{ keys .Values.config }} # list semua keys
{{ hasKey .Values.config "debug" }} # true/false
# Math
{{ add 1 2 }} # 3
{{ mul 2 3 }} # 6
{{ div 10 3 }} # 3
{{ mod 10 3 }} # 1
{{ add 1 2 3 }} # 6
# Encoding
{{ "hello" | b64enc }} # base64 encode
{{ "aGVsbG8=" | b64dec }} # base64 decode
# Crypto
{{ sha256sum "hello" }} # SHA256 hash
# Type conversion
{{ int64 .Values.replicas }}
{{ toString .Values.port }}
# Semua fungsi Sprig
# https://masterminds.github.io/sprig/
Kondisional Lanjutan
# if/else if/else
{{- if eq .Values.env "production" }}
replicas: 5
{{- else if eq .Values.env "staging" }}
replicas: 2
{{- else }}
replicas: 1
{{- end }}
# not, and, or
{{- if and .Values.ingress.enabled .Values.tls.enabled }}
# TLS ingress
{{- end }}
{{- if or .Values.debug .Values.verbose }}
logLevel: debug
{{- end }}
{{- if not .Values.serviceAccount.create }}
# Use existing service account
{{- end }}
# ne (not equal), contains, has
{{- if ne .Values.image.tag "latest" }}
imagePullPolicy: IfNotPresent
{{- end }}
{{- if contains "prod" .Release.Name }}
resources:
limits:
cpu: 1000m
{{- end }}
# Regex
{{- if regexMatch "^v[0-9]+" .Values.image.tag }}
# Semver tag detected
{{- end }}
9. Helm Plugins & Ecosystem
Helm memiliki ekosistem plugin yang memperluas fungsinya. Plugin bisa ditambahkan untuk keamanan, manajemen secrets, dan integrasi dengan tools lain.
Plugin Populer
| Plugin | Fungsi | Instalasi |
|---|---|---|
| helm-secrets | Enkripsi/decryption values menggunakan SOPS | helm plugin install https://github.com/jkroepke/helm-secrets |
| helm-diff | Preview perubahan sebelum upgrade | helm plugin install https://github.com/databus23/helm-diff |
| helmfile | Declarative spec untuk multiple releases | brew install helmfile |
| helm-git | Install chart dari Git repository | helm plugin install https://github.com/aslafy-z/helm-git |
| helm unittest | Unit testing untuk chart | helm plugin install https://github.com/helm-unittest/helm-unittest |
| helm-cm-push | Push chart ke OCI registry | helm plugin install https://github.com/chartmuseum/helm-push |
Contoh: helm-secrets
# Instalasi helm-secrets helm plugin install https://github.com/jkroepke/helm-secrets # Enkripsi values file sops --encrypt --in-place secrets.yaml # Hasil: secrets.yaml (encrypted) # Install dengan secrets helm secrets upgrade my-release bitnami/nginx \ -f values.yaml \ -f secrets://secrets.yaml # Lihat decrypted values helm secrets view secrets.yaml
Contoh: helmfile
# helmfile.yaml - Declarative Helm releases
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
- name: grafana
url: https://grafana.github.io/helm-charts
releases:
- name: nginx-ingress
namespace: ingress-system
chart: ingress-nginx/ingress-nginx
version: 4.10.0
values:
- controller:
replicaCount: 2
resources:
limits:
cpu: 500m
memory: 256Mi
- name: monitoring
namespace: monitoring
chart: grafana/kube-prometheus-stack
version: 61.0.0
values:
- grafana:
adminPassword: admin123
- prometheus:
retention: 30d
- name: my-app
namespace: production
chart: ./charts/my-app
values:
- values-production.yaml
Unit Testing Chart
# tests/deployment_test.yaml
suite: deployment tests
templates:
- deployment.yaml
tests:
- it: should create deployment with correct name
set:
nameOverride: my-app
asserts:
- isKind:
of: Deployment
- matchRegex:
path: metadata.name
pattern: my-app
- it: should set correct replica count
set:
replicaCount: 3
asserts:
- equal:
path: spec.replicas
value: 3
- it: should use correct image
set:
image:
repository: my-app
tag: "2.0"
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: "my-app:2.0"
- it: should not create HPA when autoscaling disabled
set:
autoscaling:
enabled: false
asserts:
- hasDocuments:
count: 1
10. Best Practices
Mengikuti best practices Helm akan membantu Anda mengelola aplikasi di Kubernetes dengan lebih efektif dan aman. Berikut panduan komprehensif dari BeebaneLabs.
Struktur Chart
| Praktik | Rekomendasi |
|---|---|
| Versi Semver | Gunakan versi semver untuk chart: major.minor.patch (1.0.0) |
| appVersion | Selalu update appVersion sesuai versi aplikasi yang di-deploy |
| Minimal Permissions | Jangan berikan RBAC yang terlalu luas di chart |
| Non-root Container | Selalu jalankan container sebagai user non-root |
| Health Probes | Sertakan liveness dan readiness probe |
| Resource Limits | Selalu set resource requests dan limits |
Keamanan Chart
- Gunakan helm-secrets untuk values yang berisi sensitive data
- Jangan pernah hardcode credentials di values.yaml
- Gunakan Kubernetes Secret untuk password, API keys, dan certificates
- Scan chart dengan
trivyataucheckovsebelum deploy - Pin versi image tags, hindari menggunakan
latest - Gunakan
.helmignoreuntuk mengecualikan file sensitif
Manajemen Release
- Gunakan
--atomicuntuk auto-rollback jika install gagal - Gunakan
--waituntuk memastikan semua resource ready sebelum selesai - Gunakan
--timeoutuntuk mencegah proses hanging - Gunakan namespace terpisah untuk setiap environment (dev, staging, prod)
- Simpan values di version control (Git) untuk audit trail
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β HELM DEPLOYMENT WORKFLOW β β β β ββββββββββββ ββββββββββββ ββββββββββββ β β β Develop βββββΊβ Lint βββββΊβ Test β β β β Chart β β & Validateβ β (unittest)β β β ββββββββββββ ββββββββββββ βββββββ¬βββββ β β β β β βββββββββββββββββββββββββββββββββββββββ β β β β β βΌ β β ββββββββββββ ββββββββββββ ββββββββββββ β β β Dry-Run βββββΊβ Dev βββββΊβ Staging β β β β Preview β β Deploy β β Deploy β β β ββββββββββββ ββββββββββββ βββββββ¬βββββ β β β β β βΌ β β ββββββββββββ β β βProduction β β β β Deploy β β β β(--atomic) β β β βββββββ¬βββββ β β β β β βΌ β β ββββββββββββ β β β Monitor β β β β& Rollbackβ β β ββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Contoh Perintah Production-Ready
# Install production dengan semua safety net helm install my-app bitnami/nginx \ --namespace production \ --create-namespace \ -f values-production.yaml \ --set image.tag=1.27.0 \ --atomic \ --wait \ --timeout 10m \ --history-max 10 # Upgrade dengan diff preview helm diff upgrade my-app bitnami/nginx \ -f values-production.yaml # Upgrade dengan atomic (auto-rollback on failure) helm upgrade my-app bitnami/nginx \ --namespace production \ -f values-production.yaml \ --atomic \ --wait \ --timeout 10m # Lihat semua releases di production helm list -n production -o wide
Selalu gunakan --dry-run sebelum melakukan install/upgrade di production. Periksa diff hasil render template sebelum memastikan perubahan aman untuk diterapkan.
11. Quiz Pemahaman
Uji pemahaman Anda tentang Kubernetes Helm dengan menjawab pertanyaan berikut:
1. Apa fungsi utama file Chart.yaml?
2. Apa itu "release" dalam konteks Helm?
3. Bagaimana cara override values saat install Helm chart?
4. Apa fungsi flag --atomic saat helm install/upgrade?
5. Di direktori mana sub-chart dependencies disimpan?