L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment Pipeline dengan ArgoCD dan Helm di Kubernetes

⏱️ 18 menit baca • 📅 14 Oct 2026 • 👁️ 1 views
Zero-Downtime Deployment Pipeline dengan ArgoCD dan Helm di Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Di era komputasi modern, reliabilitas dan kecepatan pengiriman perangkat lunak adalah dua pilar utama yang menentukan kesuksesan bisnis digital. Pengguna akhir mengharapkan layanan web—baik itu frontend berbasis HTML/CSS/JS, backend Go atau Node.js, hingga pemrosesan antrean asinkron—selalu tersedia 24/7 tanpa ada gangguan sedikit pun saat pembaruan kode dilakukan. Namun, realitas operasional di banyak organisasi infrastruktur web masih dihantui oleh metode deployment tradisional: skrip SSH manual, penggunaan Jenkins atau GitLab CI/CD yang langsung menembak cluster Kubernetes (push-based), hingga konfigurasi file manifest mentah (kubectl apply) yang rentan terhadap human error.

Bottleneck terbesar dari pendekatan tradisional adalah drift state (ketidaksesuaian antara kondisi aktual di cluster Kubernetes dengan apa yang didefinisikan dalam repositori kode), tidak adanya mekanisme visibilitas real-time yang terpusat, serta absennya jaminan zero-downtime yang terintegrasi secara native dengan manajemen traffic edge (seperti Nginx Ingress, Cloudflare CDN, atau service mesh). Ketika terjadi kegagalan deployment pada jam-jam sibuk, tim SRE terpaksa melakukan rollback manual yang memakan waktu, menyebabkan downtime, merusak reputasi layanan, dan memicu kerugian finansial yang masif.

Untuk mengatasi masalah ini, industri beralih secara masif ke paradigma GitOps menggunakan ArgoCD sebagai Continuous Delivery orchestrator dan Helm sebagai package manager untuk Kubernetes. Tabel di bawah ini merangkum perbandingan langsung antara kondisi sebelum dan sesudah penerapan arsitektur ini:

Parameter Sebelum (Push-based CI/CD Tradisional) Sesudah (GitOps dengan ArgoCD & Helm)
Sumber Kebenaran (Source of Truth) Pipeline CI/CD (Jenkins/GitLab) Repositori Git (GitOps Repository)
Deteksi Drift State Tidak ada, perubahan manual (kubectl edit) dibiarkan Otomatis terdeteksi dan dapat disinkronkan otomatis
Keamanan Kredensial Cluster token disimpan di CI/CD runner luar Cluster menginisiasi pull dari dalam, minim eksposur kunci
Mekanisme Rollback Manual atau trigger pipeline lama Satu klik di UI ArgoCD atau otomatis via health check
Manajemen Multi-Environment Script bash kompleks / duplikasi file YAML Helm Charts dengan values per environment (dev/staging/prod)

2. Konsep Inti & Deep Dive Arsitektur

GitOps adalah kerangka kerja operasional yang mengambil praktik terbaik dari pengembangan perangkat lunak—seperti version control, kolaborasi, dan compliance—lalu menerapkannya ke manajemen infrastruktur. Dalam ekosistem Kubernetes, ArgoCD bertindak sebagai controller yang berjalan di dalam cluster (in-cluster controller) yang secara kontinu memantau repositori Git target dan membandingkannya dengan state aktual di cluster.

Alur Data dan Eksekusi (Under the Hood)

  1. Developer commit & push: Developer mendorong perubahan kode aplikasi (misal: image tag baru untuk layanan Node.js atau PHP-FPM) atau perubahan konfigurasi Helm chart ke Git.
  2. ArgoCD Polling / Webhook: ArgoCD menerima sinyal webhook dari GitHub/GitLab atau melakukan polling berkala terhadap repositori Git.
  3. Render Manifest: ArgoCD mengeksekusi perintah Helm (helm template) secara lokal menggunakan parameter values yang telah ditentukan untuk menghasilkan set manifes Kubernetes mentah.
  4. Reconciliation Loop: ArgoCD membandingkan Desired State (hasil render Helm) dengan Live State (kondisi nyata objek di API Server Kubernetes).
  5. Sync & Deployment: Jika ditemukan perbedaan, ArgoCD melakukan sinkronisasi secara otomatis atau manual, menerapkan pembaruan dengan strategi rolling update Kubernetes yang menjamin zero-downtime.

Berikut adalah representasi visual arsitektur GitOps menggunakan ArgoCD dan Helm:

+-------------------------------------------------------------------------+
|                           GIT REPOSITORY                                | 
|  +------------------------+      +-----------------------------------+  | 
|  | Helm Chart (Templates) |      | Environment Values (prod/staging) |  | 
|  +------------------------+      +-----------------------------------+  | 
+---------------------------------------+---------------------------------+
                                        | (Webhook / Polling)
                                        v
+-------------------------------------------------------------------------+
|                         KUBERNETES CLUSTER                              |
|                                                                         | 
|  +-------------------------------------------------------------------+  | 
|  |                           ARGOCD POD                              |  | 
|  |  +---------------------+      +-------------------------------+   |  | 
|  |  | Git Client Module   | ---> | Helm Renderer Engine          |   |  | 
|  |  +---------------------+      +-------------------------------+   |  | 
|  |                                             |                     |  | 
|  |                                             v                     |  | 
|  |  +---------------------+      +-------------------------------+   |  | 
|  |  | Controller (Reconc) | <--- | Desired vs Live State Engine  |   |  | 
|  |  +---------------------+      +-------------------------------+   |  | 
|  +---------------------------------------------+---------------------+  | 
|                                                | Apply                  | 
|                                                v                        | 
|  +-------------------------------------------------------------------+  | 
|  |                         K8S API SERVER                            |  | 
|  +---------------------------------------------+---------------------+  | 
|                                                |                      | 
|                                                v                      | 
|  +-------------------------------------------------------------------+  | 
|  |                       DEPLOYMENT / PODS                           |  | 
|  |  [ Pod v1 (Terminating) ] <--- Rolling Update ---> [ Pod v2 (Ready) ] |  | 
|  +-------------------------------------------------------------------+  | 
+-------------------------------------------------------------------------+

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun pipeline deployment berbasis Kubernetes, arsitek sering kali dihadapkan pada pilihan pendekatan manajemen konfigurasi. Berikut adalah analisis mendalam antara Raw YAML / Kustomize vs Helm Charts yang diorkestrasi oleh ArgoCD:

Aspek Penilaian Kustomize + ArgoCD Helm Charts + ArgoCD
Kompleksitas Pembelajaran Rendah - Menengah. Berbasis patch file YAML murni. Tinggi. Membutuhkan pemahaman templating Go ({{ .Values... }}).
Reusability & Parameterisasi Terbatas pada overlay direktori (base/overlays). Sangat Tinggi. Satu chart dapat dipakai untuk ratusan microservices.
Manajemen Release & History Bergantung penuh pada histori objek Kubernetes native. Memiliki konsep release tersendiri (helm history), memudahkan rollback versi chart.
Overhead Sumber Daya (CPU/RAM) Minimal. ArgoCD hanya melakukan apply manifest. Menengah. ArgoCD memanggil binary Helm untuk merender template di dalam memory pod.
Cocok Untuk Aplikasi monolitik sederhana atau infrastruktur statis. Ekosistem enterprise dengan ratusan layanan backend (Go, Node, PHP) yang dinamis.

[!TIP] Untuk arsitektur enterprise berskala besar, penggunaan Helm Charts jauh lebih unggul karena memungkinkan standardisasi template deployment (inress, probes, resource limits) yang seragam bagi seluruh tim engineering, sementara konfigurasi spesifik lingkungan cukup dipisahkan melalui file values-{env}.yaml.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan pipeline ini, pastikan lingkungan infrastruktur Anda memenuhi spesifikasi minimum berikut:

  • Kubernetes Cluster: Versi 1.25 hingga 1.30 (mendukung Server-Side Apply).
  • CLI Tools: kubectl, helm (v3.12+), dan argocd CLI terinstall di mesin lokal.
  • Infrastruktur Pendukung: Nginx Ingress Controller atau Traefik, Cert-Manager untuk SSL/TLS Let's Encrypt, serta storage class yang memadai.

Verifikasi akses cluster dengan menjalankan perintah berikut:

kubectl cluster-info
kubectl get nodes

Pastikan output menunjukkan status Ready pada semua node worker dan control plane.


5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD di Kubernetes

Buat namespace khusus untuk ArgoCD dan lakukan instalasi manifes resmi menggunakan kubectl:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Verifikasi bahwa seluruh pod ArgoCD berjalan dengan normal:

kubectl get pods -n argocd

Ambil password awal untuk user admin yang digenerate secara otomatis oleh Kubernetes:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
echo ""

Langkah 2: Membangun Struktur Helm Chart untuk Aplikasi Web

Buat struktur direktori untuk Helm chart aplikasi web enterprise kita (misal: backend Go berkinerja tinggi):

helm create webapp-chart
cd webapp-chart
rm -rf templates/*

Buat file template deployment.yaml di dalam direktori templates/ dengan konfigurasi zero-downtime yang ketat (rolling update strategy, liveness/readiness probes, dan graceful shutdown):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "webapp-chart.fullname" . }}
  namespace: {{ .Release.Namespace }}
  labels:
    app.kubernetes.io/name: {{ include "webapp-chart.name" . }}
    helm.sh/chart: {{ include "webapp-chart.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "webapp-chart.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "webapp-chart.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: {{ .Values.service.port }}
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          livenessProbe:
            httpGet:
              path: /healthz
              port: http
            initialDelaySeconds: 5
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: http
            initialDelaySeconds: 3
            periodSeconds: 5
          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 10"]

Buat file service.yaml untuk mengekspos aplikasi:

apiVersion: v1
kind: Service
metadata:
  name: {{ include "webapp-chart.fullname" . }}
  namespace: {{ .Release.Namespace }}
  labels:
    app.kubernetes.io/name: {{ include "webapp-chart.name" . }}
    helm.sh/chart: {{ include "webapp-chart.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: {{ include "webapp-chart.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}

Sesuaikan file values.yaml utama di root chart dengan konfigurasi default yang aman:

replicaCount: 3

image:
  repository: mydockerhub/enterprise-webapp
  pullPolicy: IfNotPresent
  tag: "v1.0.0"

service:
  type: ClusterIP
  port: 80

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 200m
    memory: 256Mi

Langkah 3: Mendaftarkan Aplikasi ke ArgoCD

Buat file manifes ArgoCD Application (argocd-app.yaml) untuk menghubungkan repositori Git Anda dengan cluster Kubernetes:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-webapp-prod
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/your-org/enterprise-infra-repo.git'
    targetRevision: HEAD
    path: charts/webapp-chart
    helm:
      valueFiles:
        - values-prod.yaml
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Terapkan manifes aplikasi ArgoCD tersebut ke cluster:

kubectl apply -f argocd-app.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa komponen paling krusial dalam konfigurasi di atas yang memastikan tercapainya Zero-Downtime Deployment:

  1. strategy: RollingUpdate dengan maxSurge: 1 dan maxUnavailable: 0:

    • Parameter ini memerintahkan Kubernetes untuk membuat pod baru versi terbaru terlebih dahulu (maxSurge: 1) sebelum mematikan pod lama, dan memastikan tidak ada pod yang mati selama proses transisi (maxUnavailable: 0). Hasilnya, kapasitas total kapasitas layanan tidak pernah berkurang di bawah jumlah minimum yang ditentukan.
  2. lifecycle.preStop hook dengan perintah sleep 10:

    • Ketika pod lama akan dihentikan (terminating), Kubernetes langsung mencabut endpoint pod tersebut dari Service Load Balancer. Namun, terkadang ada jeda waktu (propagation delay) antara kube-proxy dan Ingress Controller. Perintah sleep 10 memberikan waktu bagi trafik yang sedang berjalan (in-flight requests) untuk diselesaikan oleh pod lama sebelum proses terminasi benar-benar dieksekusi oleh sistem operasi kontainer.
  3. readinessProbe dan livenessProbe:

    • Kubernetes tidak akan mengarahkan trafik dari Nginx Ingress ke pod baru hingga readinessProbe mengembalikan status HTTP 200 pada endpoint /ready. Ini mencegah pengiriman trafik ke aplikasi yang belum sepenuhnya siap (misalnya, koneksi pool database belum terbentuk sempurna).

7. Skenario Produksi & Studi Kasus Dunia Nyata

[!IMPORTANT] Pada lingkungan produksi dengan trafik tinggi (lebih dari 50.000 req/sec), lonjakan pembuatan pod baru dapat membebani node worker dan database backend (seperti MySQL/MariaDB atau Redis). Pastikan pengaturan Horizontal Pod Autoscaler (HPA) dan konfigurasi resource limits diselaraskan dengan hasil load testing.

Studi Kasus: Sebuah platform e-commerce mengalami lonjakan traffic 10x lipat saat kampanye flash sale. Tim melakukan pembaruan kode backend Node.js secara langsung saat event berlangsung. Berkat kombinasi ArgoCD Automated Sync, Helm Rolling Update (maxUnavailable: 0), dan Graceful Shutdown hook, deployment berjalan mulus tanpa ada satupun request pengguna yang gagal (HTTP 5xx), dan latensi rata-rata tetap stabil di bawah 45 milidetik.


8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Menggunakan Tag latest pada Citra Kontainer (Container Image)

    • Dampak: ArgoCD tidak dapat mendeteksi adanya perubahan aktual jika image tag tidak berubah, dan Kubernetes gagal melakukan rolling update secara deterministik.
    • Solusi: Selalu gunakan tag semantik unik (misal: SHA commit git atau versi semver v1.2.3).
  • Anti-Pattern 2: Mengabaikan Resource Limits pada Helm Chart

    • Dampak: Pod baru menghabiskan seluruh memori node saat startup, memicu OOMKilled, dan menyebabkan kegagalan deployment massal.
    • Solusi: Tentukan requests dan limits CPU/RAM secara ketat di setiap chart Helm.
  • Anti-Pattern 3: Tidak Mengonfigurasi preStop Hook untuk Koneksi Database & Real-time (WebSocket)

    • Dampak: Koneksi WebSocket terputus tiba-tiba saat deployment, mengakibatkan error pada sisi klien browser.
    • Solusi: Terapkan penanganan sinyal SIGTERM di level kode aplikasi backend (Go/Node/PHP) yang dikombinasikan dengan preStop sleep di Kubernetes.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memvalidasi bahwa pipeline zero-downtime Anda benar-benar tahan banting, lakukan pengujian beban menggunakan tool benchmark modern seperti k6 atau wrk secara bersamaan saat proses argocd app sync dijalankan.

Contoh skrip pengujian k6 (load-test.js):

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 500 }, // Ramp-up ke 500 virtual users
    { duration: '5m', target: 500 }, // Sustained load
    { duration: '2m', target: 0 },   // Ramp-down
  ],
};

export default function () {
  const res = http.get('https://app.production.internal/healthz');
  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 50ms': (r) => r.timings.duration < 50,
  });
  sleep(0.1);
}

Interpretasi Hasil: Pastikan metrik http_req_failed bernilai 0.00% selama rentang waktu deployment dilakukan. Jika ditemukan error rate di atas 0%, periksa kembali konfigurasi readinessProbe dan waktu tunggu preStop hook.


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan pipeline ini ke lingkungan live production, pastikan Anda telah memverifikasi daftar periksa berikut:

  • Repositori Git terisolasi dan dilindungi dengan aturan Branch Protection (PR wajib melalui code review).
  • ArgoCD dikonfigurasi dengan autentikasi berbasis RBAC yang ketat (integrasi OIDC/Keycloak).
  • Helm chart telah melalui uji helm lint dan helm template tanpa error.
  • Readiness dan Liveness probe telah disesuaikan dengan karakteristik endpoint aplikasi.
  • Mekanisme pemantauan (Prometheus & Grafana) memantau metrik pod restart dan error rate secara real-time.

Dengan mengintegrasikan ArgoCD dan Helm secara disiplin, organisasi Anda tidak hanya mencapai otomatisasi penuh melalui prinsip GitOps, tetapi juga menjamin ketersediaan layanan tingkat tinggi (high availability) yang konsisten bagi seluruh pengguna web modern.

🏷️ Tags: #Devops #Kubernetes #Gitops #Argocd #Helm