Kuasai Helm Charts dari asal-usul hingga deployment produksi. Pelajari mengapa ia ada, evolusinya, konsep inti, dan implementasikan platform microservices dunia nyata.

Helm Charts ada karena manifest Kubernetes itu verbose, repetitif, dan sulit dikelola dalam skala besar. Ketika Anda menerapkan aplikasi ke Kubernetes, Anda menulis file YAML yang mendefinisikan pod, service, deployment, dan banyak lagi. Tetapi apa yang terjadi ketika Anda perlu menerapkan aplikasi yang sama di berbagai lingkungan? Atau ketika Anda perlu berbagi aplikasi dengan orang lain? Atau ketika Anda perlu mengelola puluhan layanan yang saling bergantung?
Helm menyelesaikan masalah ini dengan memperlakukan aplikasi Kubernetes sebagai paket. Ini adalah package manager untuk Kubernetes, mirip dengan npm untuk Node.js atau pip untuk Python. Helm Charts adalah manifest Kubernetes yang dapat digunakan kembali, bertemplat yang dapat diversi, dibagikan, dan digunakan secara konsisten.
Dalam artikel ini, kami akan mengeksplorasi mengapa Helm ada, sejarahnya, masalah yang dipecahkannya, dan cara menggunakannya secara efektif dalam skenario dunia nyata.
Sebelum Helm, mengelola aplikasi Kubernetes berarti menangani beberapa masalah sulit:
Tim baik menulis script khusus, menggunakan kustomize, atau mengelola ratusan file YAML secara manual. Ini rawan kesalahan dan tidak skalabel.
Helm menyediakan:
Filosofinya: aplikasi Kubernetes harus semudah menginstal software di laptop Anda.
Helm dimulai sebagai proyek sampingan di Deis (kemudian diakuisisi oleh Microsoft) pada tahun 2015. Tujuan awal sederhana: buat package manager untuk Kubernetes. Helm awal bersifat eksperimental dan memiliki keterbatasan.
Karakteristik utama:
Helm v2 menjadi standar. Ini memperkenalkan:
Helm v2 kuat tetapi memiliki masalah. Tiller memerlukan izin di seluruh cluster, menciptakan kekhawatiran keamanan. Arsitekturnya kompleks.
Helm v3 adalah redesign besar yang mengatasi masalah v2:
Helm v3 adalah standar saat ini dan yang akan kami fokuskan.
Meskipun kompleksitas Kubernetes, Helm tetap penting karena:
Chart adalah paket manifest Kubernetes. Ini adalah direktori dengan struktur spesifik yang berisi:
Chart diversi dan dapat disimpan di repository.
Release adalah instance yang berjalan dari Chart. Ketika Anda menginstal Chart, Helm membuat Release. Anda dapat memiliki beberapa Release dari Chart yang sama dengan konfigurasi berbeda.
Contoh: Anda mungkin memiliki tiga Release dari Chart nginx - satu untuk dev, satu untuk staging, satu untuk produksi.
Values adalah parameter konfigurasi yang menyesuaikan Chart. Mereka didefinisikan dalam values.yaml dan dapat diganti saat install/upgrade.
Values menggunakan notasi titik untuk akses bersarang: image.repository, image.tag, replicaCount.
Templates adalah file template Go yang menghasilkan manifest Kubernetes. Mereka menggunakan variabel, kondisional, loop, dan fungsi untuk membuat YAML dinamis.
Contoh template:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: app
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}Repositories adalah koleksi Charts. Mereka mirip dengan registry npm atau registry Docker. Anda dapat menambahkan repository publik atau menghosting yang pribadi.
Repository publik umum:
Hooks adalah aksi yang berjalan pada titik spesifik dalam lifecycle rilis:
Hooks berguna untuk migrasi database, pembersihan, atau validasi.
Subcharts adalah Charts yang bergantung pada Charts lain. Mereka dideklarasikan dalam Chart.yaml dan disimpan di direktori charts/.
Ini memungkinkan:
Ketika Anda menginstal Chart, Helm:
values.yaml dan override baris perintahHelm melacak Releases menggunakan secret Kubernetes. Setiap Release memiliki:
Ini memungkinkan upgrade dan rollback.
Helm menyelesaikan dependensi dengan:
Chart.yamlDi Linux/macOS:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashVerifikasi instalasi:
helm versionTambahkan repository Bitnami:
helm repo add bitnami https://charts.bitnami.com/bitnamiUpdate repositories:
helm repo updateDaftar repositories:
helm repo listCari chart yang tersedia:
helm search repo nginxDapatkan informasi chart:
helm show chart bitnami/nginxLihat nilai default:
helm show values bitnami/nginxInstal dengan nilai default:
helm install my-nginx bitnami/nginxInstal dengan nilai khusus:
helm install my-nginx bitnami/nginx \
--set replicaCount=3 \
--set image.tag=1.25Instal dari file nilai:
helm install my-nginx bitnami/nginx -f values.yamlDaftar releases:
helm listDapatkan status rilis:
helm status my-nginxLihat nilai rilis:
helm get values my-nginxUpgrade ke versi baru:
helm upgrade my-nginx bitnami/nginx \
--set replicaCount=5Rollback ke rilis sebelumnya:
helm rollback my-nginx 1Hapus rilis:
helm uninstall my-nginxBuat chart baru:
helm create my-appIni menghasilkan:
my-app/
├── Chart.yaml
├── values.yaml
├── charts/
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl
│ └── NOTES.txt
└── README.mdTentukan metadata chart:
apiVersion: v2
name: my-app
description: A Helm chart for my application
type: application
version: 1.0.0
appVersion: "1.0"
maintainers:
- name: Your Name
email: your@email.comTentukan konfigurasi default:
Buat templates/deployment.yaml:
Buat templates/service.yaml:
apiVersion: v1
kind: Service
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "my-app.selectorLabels" . | nindent 4 }}Lint chart:
helm lint my-appDry-run untuk melihat manifest yang dihasilkan:
helm install my-app ./my-app --dry-run --debugMasalah: Nilai dikodekan keras dalam template, membuat chart tidak fleksibel.
Mengapa terjadi: Developer lupa untuk parameterisasi konfigurasi.
Solusi: Pindahkan semua nilai yang dapat dikonfigurasi ke values.yaml:
replicaCount: {{ .Values.replicaCount }}Bukan:
replicaCount: 3Masalah: Chart tidak mengikuti konvensi Helm, membingungkan pengguna.
Mengapa terjadi: Developer membuat chart tanpa mempelajari contoh.
Solusi: Ikuti praktik terbaik Helm:
_helpers.tpl untuk helper templateMasalah: Pod mengonsumsi sumber daya tanpa batas, menyebabkan ketidakstabilan cluster.
Mengapa terjadi: Batas sumber daya dilupakan selama pengembangan.
Solusi: Selalu tentukan permintaan dan batas sumber daya:
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256MiMasalah: Perubahan chart tidak dilacak, membuat rollback sulit.
Mengapa terjadi: Developer memperbarui chart tanpa menaikkan versi.
Solusi: Ikuti semantic versioning:
version: 1.2.3
appVersion: "2.0"Naikkan versi untuk setiap rilis.
Masalah: Terlalu banyak subcharts menciptakan beban pemeliharaan.
Mengapa terjadi: Developer mencoba membuat satu chart melakukan segalanya.
Solusi: Jaga chart tetap fokus dan sederhana. Gunakan subcharts untuk komponen yang benar-benar dapat digunakan kembali.
Ikuti semver untuk versi chart:
version: 1.2.3
appVersion: "2.0.1"Sertakan dokumentasi komprehensif:
apiVersion: v2
name: my-app
description: A production-ready application
home: https://github.com/myorg/my-app
sources:
- https://github.com/myorg/my-app
maintainers:
- name: Your Name
email: your@email.com
keywords:
- app
- productionJalankan migrasi database sebelum deployment:
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "my-app.fullname" . }}-migrate
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
spec:
template:
spec:
containers:
- name: migrate
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
command: ["./migrate.sh"]
restartPolicy: NeverTentukan liveness dan readiness probes:
containers:
- name: app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: http
initialDelaySeconds: 5
periodSeconds: 5Pisahkan konfigurasi dari kode:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "my-app.fullname" . }}-config
data:
app.conf: |
{{ .Values.appConfig | nindent 4 }}Gunakan helm test untuk validasi:
apiVersion: v1
kind: Pod
metadata:
name: "{{ include \"my-app.fullname\" . }}-test\"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: test
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
command: ["./test.sh"]
restartPolicy: NeverMari kita bangun contoh praktis - platform microservices dengan API gateway, user service, product service, dan database PostgreSQL.
┌─────────────────────────────────────────┐
│ Kubernetes Cluster │
├─────────────────────────────────────────┤
│ Ingress (nginx) │
│ ↓ │
│ API Gateway (Kong) │
│ ↓ │
│ ┌──────────────┬──────────────┐ │
│ │ User Service │ Product Svc │ │
│ └──────────────┴──────────────┘ │
│ ↓ │
│ PostgreSQL Database │
└─────────────────────────────────────────┘microservices-platform/
├── Chart.yaml
├── values.yaml
├── charts/
│ ├── api-gateway/
│ ├── user-service/
│ ├── product-service/
│ └── postgresql/
├── templates/
│ ├── namespace.yaml
│ ├── configmap.yaml
│ └── secrets.yaml
└── README.mdapiVersion: v1
kind: Namespace
metadata:
name: {{ .Values.namespace }}apiVersion: v1
kind: ConfigMap
metadata:
name: platform-config
namespace: {{ .Values.namespace }}
data:
api-gateway-url: "http://api-gateway:80"
user-service-url: "http://user-service:8080"
product-service-url: "http://product-service:8080"
database-host: "{{ .Values.postgresql.primary.service.name }}"
database-port: "5432"1. Buat struktur chart:
helm create microservices-platform2. Buat subchart untuk API Gateway:
cd microservices-platform/charts
helm create api-gatewayUlangi untuk user-service dan product-service.
3. Update Chart.yaml dengan dependensi:
cd ..
helm dependency update4. Validasi chart:
helm lint microservices-platform5. Dry-run instalasi:
helm install platform ./microservices-platform --dry-run --debug6. Instal chart:
helm install platform ./microservices-platform \
--namespace microservices \
--create-namespace7. Verifikasi instalasi:
helm status platform -n microservices8. Lihat sumber daya yang digunakan:
kubectl get all -n microservicesSkalakan user service ke 5 replika:
helm upgrade platform ./microservices-platform \
--set user-service.replicaCount=5 \
-n microservicesDeploy versi baru dari product service:
helm upgrade platform ./microservices-platform \
--set product-service.image.tag=1.1 \
-n microservicesRollback ke rilis sebelumnya:
helm rollback platform 1 -n microservicesPeriksa riwayat rilis:
helm history platform -n microservicesLihat nilai saat ini:
helm get values platform -n microservicesLihat manifest yang dihasilkan:
helm get manifest platform -n microservicesHelm Charts ada karena aplikasi Kubernetes memerlukan packaging, versioning, dan manajemen lifecycle. Mereka mengubah Kubernetes dari platform orkestrasi tingkat rendah menjadi sistem manajemen paket.
Meskipun Kubernetes kuat, Helm membuatnya dapat diakses. Ini mengurangi boilerplate, memungkinkan penggunaan kembali kode, dan menyediakan cara standar untuk menerapkan aplikasi.
Poin-poin kunci yang perlu diambil:
Mulai dengan chart yang ada dari Bitnami atau repository lain. Pelajari struktur dengan memeriksa contoh dunia nyata. Kemudian buat chart Anda sendiri untuk aplikasi Anda.
Untuk contoh platform microservices, Anda sekarang memiliki template siap produksi. Sesuaikan dengan persyaratan spesifik Anda, tambahkan monitoring dan logging, implementasikan manajemen secret yang tepat, dan Anda siap untuk deploy.
Helm bukan hanya alat - ini adalah filosofi: aplikasi harus semudah menginstal software di laptop Anda.