L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment Microservices Menggunakan Kubernetes dan ArgoCD

⏱️ 18 menit baca • 📅 14 Oct 2026 • 👁️ 1 views
Zero-Downtime Deployment Microservices Menggunakan Kubernetes dan ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern dan ekosistem infrastruktur enterprise, kecepatan rilis fitur berbanding terbalik dengan stabilitas sistem jika tidak dikelola dengan presisi tingkat milidetik. Kegagalan melakukan deployment tanpa henti (zero-downtime deployment) pada aplikasi berbasis microservices sering kali berakar pada proses manual, skrip Bash kustom yang rapuh, ketidaksinkronan antara state Git dengan cluster Kubernetes, serta konfigurasi liveness dan readiness probe yang buruk. Akibatnya, saat pembaruan (rolling update) dilakukan, pengguna mengalami 502 Bad Gateway, Connection Reset, atau kegagalan transaksi database akibat race condition antar versi aplikasi yang berjalan bersamaan.

Secara historis, administrator infrastruktur mengandalkan Continuous Integration / Continuous Deployment (CI/CD) tradisional berbasis push (seperti Jenkins, GitLab CI, atau GitHub Actions) yang langsung menembakkan perintah kubectl apply atau Helm upgrade ke cluster produksi. Pendekatan push-based ini menyimpan celah keamanan krusial: kredensial cluster (kubeconfig) harus disimpan di server CI/CD eksternal yang jika disusupi, penyerang mendapatkan akses penuh ke seluruh klaster. Selain itu, terjadi drift configuration di mana kondisi nyata di cluster menyimpang dari kode sumber akibat perubahan manual (hotfix) yang tidak tercatat di repository.

Analisis Sebelum vs Sesudah penerapan Zero-Downtime Deployment dengan Kubernetes dan ArgoCD:

  • Sebelum (Manual / Push-based CI/CD): Deploy memakan waktu 15-30 menit, sering terjadi downtime 5-10 detik per rilis karena pod lama langsung dimatikan sebelum pod baru siap melayani HTTP traffic, konfigurasi database sering breaking change tanpa migrasi terisolasi, dan proses rollback memakan waktu lama karena harus mencari artefak build lama secara manual.
  • Sesudah (GitOps dengan Kubernetes & ArgoCD): Rilis sepenuhnya otomatis via pull-based mechanism, zero downtime mutlak berkat implementasi strategi RollingUpdate dengan maxSurge: 25% dan maxUnavailable: 0, readiness/liveness probe tervalidasi ketat, serta automatic rollback instan dalam hitungan detik jika health check pod baru gagal memenuhi parameter SLI/SLO.

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur GitOps mengubah paradigma pengelolaan infrastruktur dengan menjadikan Git sebagai Single Source of Truth. ArgoCD, sebagai engine Continuous Delivery berbasis Kubernetes, berjalan di dalam cluster dan secara periodik (atau berbasis webhook) melakukan reconciliation (rekonsiliasi) antara state yang didefinisikan di Git repository dengan state aktual di dalam cluster.

+-------------------------------------------------------------------------+
|                        Git Repository (Manifests)                       | 
|                   (Helm Charts / Kustomize / YAML)                      |
+-------------------------------------------------------------------------+
                                     |
                                     | (Webhook / Polling)
                                     v
+-------------------------------------------------------------------------+
|                              ArgoCD Server                              |
|                      (Controller & UI / CLI Engine)                     |
+-------------------------------------------------------------------------+
                                     |
                                     | (Reconcile / Apply)
                                     v
+-------------------------------------------------------------------------+
|                           Kubernetes Cluster                            |
|  +-----------------------+   +---------------------------------------+  |
|  |      Ingress /        |   |           Service Mesh /              |
|  |     Load Balancer     |-->|             Pods (v1.0)               |  |
|  +-----------------------+   +---------------------------------------+  |
|                                          ^                              |
|                                          | (Rolling Update)             |  |
|                              +---------------------------------------+  |
|                              |             Pods (v1.1)               |  |
|                              +---------------------------------------+  |
+-------------------------------------------------------------------------+

Alur eksekusi saat developer melakukan git push kode baru:

  1. Pipeline CI membangun Docker image baru, melakukan scanning keamanan (CVE), mem-push image ke container registry privat, dan memperbarui tag image pada file values.yaml atau manifest Kubernetes di Git repository.
  2. ArgoCD mendeteksi adanya perbedaan (OutOfSync) antara manifest di Git dan objek di Kubernetes API server.
  3. ArgoCD melakukan sinkronisasi otomatis (automated sync) dengan menerapkan objek baru ke klaster secara bertahap.
  4. Kubernetes Controller menangani RollingUpdate: membuat Pod versi baru (v1.1), menunggu hingga readinessProbe bernilai sukses, lalu secara perlahan menurunkan (terminate) Pod versi lama (v1.0) tanpa memutus koneksi aktif (graceful shutdown).

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memilih strategi deployment yang paling optimal bagi ekosistem backend web (Go, Node.js, PHP-FPM, Nginx) dan database/caching (MySQL, Redis), berikut adalah matriks perbandingan mendalam:

Parameter / Metrik Push-Based CI/CD (GitHub Actions / Jenkins) GitOps Pull-Based (ArgoCD + Kubernetes) Blue/Green Deployment via Argo Rollouts Canary Deployment via Istio / Argo Rollouts
Keamanan Kredensial Rendah (Kubeconfig disimpan di eksternal CI) Tinggi (ArgoCD di dalam cluster, tanpa akses luar) Tinggi (Cluster-internal) Tinggi (Traffic shifting di level service mesh)
Resource Overhead Minimal di cluster, tinggi di build server Sedang (ArgoCD Controller memakan RAM/CPU) Tinggi (Membutuhkan 2x kapasitas pod aktif) Tinggi (Membutuhkan infrastruktur service mesh)
Latensi Rollback Lambat (Harus memicu ulang pipeline build) Sangat Cepat (Revert commit Git atau Argo UI) Instan (Alihkan router/service selector) Cepat (Turunkan bobot traffic weight ke 0%)
Kompleksitas Setup Rendah hingga Sedang Sedang Tinggi Sangat Tinggi
Cocok Untuk Tim kecil, staging environment Enterprise microservices standar Mission-critical backend (Financial/Payment) High-traffic SaaS dengan A/B testing konstan

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan pipeline Zero-Downtime, pastikan infrastruktur memenuhi standar spesifikasi berikut:

  • Kubernetes Cluster: Versi 1.26+ dengan minimal 3 worker nodes (Rekomendasi spesifikasi node: 4 vCPU, 16 GB RAM untuk menangani beban tinggi).
  • CLI Tools: kubectl, helm, argocd CLI terpasang pada workstation atau runner.
  • Storage & Ingress: Ingress Controller (Nginx Ingress atau Traefik) dengan dukungan konfigurasi timeout dan connection draining yang tepat.
  • Akses & Namespace: Hak akses cluster-admin untuk instalasi ArgoCD, serta namespace terisolasi (production, argo).

Verifikasi kesiapan cluster:

kubectl cluster-info
kubectl get nodes -o wide

Install ArgoCD pada namespace argo:

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

Ambil password awal admin ArgoCD:

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

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Struktur Helm Chart Aplikasi Microservice

Buat struktur direktori chart Helm untuk aplikasi backend Go/Node.js:

charts/
└── backend-service/
    ├── Chart.yaml
    ├── values.yaml
    └── templates/
        ├── deployment.yaml
        ├── service.yaml
        └── ingress.yaml

File Chart.yaml:

apiVersion: v2
name: backend-service
description: Helm chart untuk zero-downtime deployment microservice
type: application
version: 1.0.0
appVersion: "1.0.0"

File values.yaml:

replicaCount: 3
image:
  repository: registry.internal.net/apps/backend
  pullPolicy: IfNotPresent
  tag: "v1.0.0"

service:
  type: ClusterIP
  port: 8080

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

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

File templates/deployment.yaml (Implementasi Zero-Downtime mutlak):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "backend-service.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "backend-service.name" . }}
    helm.sh/chart: {{ include "backend-service.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 "backend-service.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "backend-service.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: 8080
              name: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          readinessProbe:
            httpGet:
              path: /healthz/ready
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
            timeoutSeconds: 2
            failureThreshold: 3
          livenessProbe:
            httpGet:
              path: /healthz/live
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 10
            timeoutSeconds: 3
            failureThreshold: 3
          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 10"]

Langkah 2: Konfigurasi ArgoCD Application Manifest

Buat file argocd-application.yaml di luar repository aplikasi untuk mendaftarkan git repository ke ArgoCD:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: backend-production
  namespace: argo
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/company/infrastructure-gitops.git'
    targetRevision: HEAD
    path: charts/backend-service
    helm:
      valueFiles:
        - values.yaml
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true

Terapkan manifest aplikasi ke ArgoCD:

kubectl apply -f argocd-application.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Analisis mendalam pada parameter krusial dalam file deployment:

  • strategy.type: RollingUpdate dengan maxSurge: 1 dan maxUnavailable: 0: Konfigurasi ini memastikan bahwa saat update terjadi, Kubernetes tidak pernah mematikan pod lama sebelum pod baru benar-benar hidup dan siap melayani traffic (maxUnavailable: 0). maxSurge: 1 mengizinkan pembuatan 1 pod ekstra di atas replicaCount selama proses rollout.
  • readinessProbe vs livenessProbe:
    • Readiness Probe menentukan apakah sebuah pod siap menerima traffic dari Kubernetes Service. Jika endpoint /healthz/ready gagal (misalnya karena koneksi database MySQL sedang pemanasan), pod dikeluarkan dari service endpoints tanpa mematikan container.
    • Liveness Probe menentukan kapan container harus di-restart. Jika /healthz/live gagal berulang kali, Kubelet akan membunuh container dan membuat yang baru.
  • lifecycle.preStop: Baris perintah sleep 10 memberikan jeda waktu bagi load balancer atau Ingress controller untuk memperbarui tabel routing mereka sebelum proses penghentian (SIGTERM) benar-benar mematikan proses aplikasi di dalam container. Ini krusial untuk mencegah error 502 Bad Gateway sesaat.

7. Skenario Produksi & Studi Kasus Dunia Nyata

[!TIP] Pada lingkungan produksi dengan beban traffic tinggi (misal 50.000 req/s), pastikan aplikasi backend (Go/Node.js) menangani sinyal SIGTERM dengan benar. Jangan langsung menutup koneksi TCP yang sedang aktif; lakukan drain koneksi HTTP selama minimal 15 detik.

Studi Kasus: E-Commerce Flash Sale. Sistem backend memproses 20.000 request per detik dengan koneksi Redis cluster dan MySQL master-replica. Saat rilis fitur keranjang belanja baru dilakukan di tengah 1campain flash sale:

  1. ArgoCD mendeteksi perubahan tag image di Git.
  2. Kubernetes membuat pod baru v1.1.
  3. Pod v1.1 menjalankan migrasi database otomatis yang aman secara backward-compatible (tidak menghapus kolom lama yang masih digunakan v1.0).
  4. Setelah migrasi sukses, readinessProbe mengembalikan status HTTP 200 OK.
  5. Kubernetes mengalihkan traffic secara bertahap ke pod v1.1 sembari mematikan pod v1.0 menggunakan preStop hook.
  6. Seluruh proses berjalan tanpa kehilangan satu pun transaksi pembayaran pengguna.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menggunakan Image Tag latest di Produksi.
    • Dampak: ArgoCD tidak dapat mendeteksi perubahan versi secara deterministik karena hash image tidak berubah di mata manifest statis.
    • Solusi: Selalu gunakan semantic versioning (v1.2.3) atau SHA digest dari container image.
  2. Pitfall: Tidak Mengatur Resource Limits.
    • Dampak: Pod baru memakan seluruh resource CPU/RAM node saat startup, memicu OOMKilled pada pod aplikasi lain (noisy neighbor effect).
    • Solusi: Definisikan resources.requests dan resources.limits secara akurat berdasarkan hasil load testing.
  3. Kesalahan Fatal Migrasi Database:
    • Dampak: Mengubah struktur tabel secara destruktif (breaking schema change) saat pod v1.0 dan v1.1 berjalan bersamaan.
    • Solusi: Terapkan pola Expand and Contract (perluas schema terlebih dahulu pada rilis N, gunakan pada rilis N+1, hapus kolom lama pada rilis N+2).

9. Benchmark, Metrik Kinerja & Tuning Performa

Lakukan pengujian performa zero-downtime menggunakan tool k6 selama proses argocd sync berlangsung untuk memastikan tidak ada drop pada throughput request.

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 }, // Pertahankan beban konstan saat deployment
    { duration: '1m', target: 0 },   // Ramp-down
  ],
};

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

Jalankan benchmark:

k6 run load-test.js

Metrik sukses: Pastikan persentase error (http_req_failed) bernilai 0.00% selama proses deployment berlangsung.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum mendeklarasikan sistem siap rilis ke publik (Production Ready), pastikan seluruh poin dalam checklist berikut terpenuhi:

  • Repository Git GitOps terlindungi dengan branch protection rules (Wajib Pull Request & Code Review).
  • ArgoCD dikonfigurasi dengan autentikasi berbasis RBAC dan SSO (OIDC/SAML).
  • Seluruh Deployment memiliki readinessProbe dan livenessProbe yang valid.
  • Konfigurasi strategy.rollingUpdate diset dengan maxUnavailable: 0.
  • Skrip migrasi database bersifat backward-compatible.
  • Alerting Prometheus/Grafana aktif untuk memantau metrik kube_deployment_status_replicas_unavailable.

Dengan mengombinasikan kekuatan deklaratif Kubernetes dan otomatisasi GitOps dari ArgoCD, organisasi Anda tidak hanya mencapai zero-downtime deployment yang konsisten, tetapi juga membangun budaya operasional yang transparan, aman, dan tahan banting terhadap skala enterprise.

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