L
Docker • Literally Web ID

Zero-Downtime Deployment Pipeline dengan Docker, Kubernetes, dan ArgoCD

⏱️ 18 menit baca • 📅 19 Oct 2026 • 👁️ 4 views
Zero-Downtime Deployment Pipeline dengan Docker, Kubernetes, dan ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Di era modern, ekspektasi pengguna terhadap ketersediaan layanan digital mencapai level absolut (99.999% uptime). Pendekatan tradisional dalam melakukan deployment aplikasi web—seperti menggunakan script bash manual, SSH ke server production, melakukan git pull, lalu merestart service web server secara langsung—telah usang dan menjadi sumber utama kegagalan sistem (human error, downtime yang tidak terjadwal, dan inkonsistensi lingkungan).

Masalah krusial yang sering dihadapi oleh para DevOps engineer dan Infrastructure Architect meliputi:

  • Downtime Selama Pembaruan: Saat proses kompilasi ulang atau restart daemon service (seperti Nginx, PHP-FPM, Node.js, atau Go binary), terdapat jendela waktu di mana koneksi incoming terputus atau menghasilkan error 502/504 Bad Gateway.
  • Configuration Drift: Perbedaan state antara lingkungan development, staging, dan production akibat modifikasi manual langsung pada file konfigurasi server.
  • Kurangnya Visibilitas Rollback: Ketika rilis baru mengalami kegagalan fatal di production, proses pengembalian (rollback) ke versi stabil sebelumnya memakan waktu lama karena tidak adanya manajemen state deklaratif.

Sebelum penerapan Zero-Downtime Deployment Pipeline berbasis GitOps:

[Developer] ---> Git Push ---> [Manual SSH Server] ---> [Restart Service] ---> [POTENSI DOWNTIME / 502 ERROR]

Sesudah penerapan Zero-Downtime Deployment Pipeline berbasis Docker, Kubernetes, dan ArgoCD:

[Developer] ---> Git Push ---> [Git Repository] ---> [ArgoCD Sync] ---> [Kubernetes Cluster] ---> [Rolling Update Zero-Downtime]

Pendekatan modern ini mengintegrasikan containerisasi, orkestrasi kontainer tingkat lanjut, dan prinsip Continuous Delivery (CD) deklaratif untuk memastikan transisi versi aplikasi berjalan tanpa satupun koneksi pengguna yang terputus.

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur zero-downtime deployment mengandalkan tiga pilar utama: Docker untuk isolasi runtime, Kubernetes untuk manajemen lifecycle pod dan load balancing internal, serta ArgoCD sebagai engine GitOps yang menjaga agar state cluster selalu sinkron dengan state deklaratif di Git.

Di balik layar, Kubernetes menggunakan strategi RollingUpdate dengan parameter krusial maxSurge dan maxUnavailable. Ketika deployment baru dipicu:

  1. Kubernetes membuat Pod baru dengan versi aplikasi yang diperbarui.
  2. Kubernetes menunggu hingga Pod baru tersebut melewati Liveness Probe dan Readiness Probe.
  3. Setelah Readiness Probe mengembalikan status sukses (HTTP 200), Pod baru dimasukkan ke dalam EndpointSlice dari Service, sehingga load balancing mulai mengarahkan traffic ke Pod tersebut.
  4. Secara bersamaan, Kubernetes mulai menghentikan Pod lama secara anggun (graceful shutdown), memberikan kesempatan bagi koneksi aktif yang sedang berjalan untuk menyelesaikan permintaannya sebelum proses SIGTERM dan SIGKILL dieksekusi.

Berikut adalah visualisasi alur eksekusi arsitektur GitOps & Rolling Update:

+-----------------------------------------------------------------------------------------+
|                                      GIT REPOSITORY                                     | 
|  (Manifests: Deployment, Service, Ingress, ArgoCD Application CRD)                      | 
+-----------------------------------------------------------------------------------------+
                                             |
                                             | (Webhook / Polling)
                                             v
+-----------------------------------------------------------------------------------------+
|                                       ARGO-CD                                           |
|  (Sinkronisasi otomatis state Git dengan Kubernetes Cluster)                            | 
+-----------------------------------------------------------------------------------------+
                                             |
                                             | (Apply / Reconcile)
                                             v
+-----------------------------------------------------------------------------------------+
|                                  KUBERNETES CLUSTER                                     |
|                                                                                         |
|  +--------------------+      +--------------------+      +---------------------------+  |
|  |   Ingress Controller| ---> |  Kubernetes Service| ---> | Pod v1.1 (Ready & Serving)|  |
|  +--------------------+      +--------------------+      +---------------------------+  |
|                                                                                         |
|                                                          +---------------------------+  |
|                                                          | Pod v1.2 (Initializing)   |  |
|                                                          +---------------------------+  |
+-----------------------------------------------------------------------------------------+

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memahami mengapa pendekatan Kubernetes Rolling Update dengan ArgoCD lebih unggul dibandingkan metode lain, mari kita lihat analisis perbandingan mendalam berikut:

Parameter Komparasi Manual SSH / Script Bash Blue-Green Deployment (Tradisional) Kubernetes Rolling Update + ArgoCD
Downtime Risiko Tinggi (1-5 detik per rilis) Rendah (Tergantung Switch DNS/LB) Nol (Zero-Downtime Terjamin)
Konsumsi Sumber Daya (CPU/RAM) Minimal (Single Server) Sangat Tinggi (Duplikasi Seluruh Infrastruktur) Efisien (Hanya menambah Pod sementara via maxSurge)
Kecepatan Rollback Lambat (Manual Checkout & Restart) Cepat (Alihkan Traffic Router) Sangat Cepat (ArgoCD Rollback / Git Revert otomatis)
Audit Trail Buruk / Tidak Tercatat Sedang Sempurna (100% berbasis Git Commit & ArgoCD Sync History)
Kompleksitas Setup Rendah Sedang Tinggi (Membutuhkan kurva belajar Kubernetes)

Trade-off Sumber Daya: Pendekatan Kubernetes Rolling Update membutuhkan cadangan kapasitas CPU dan RAM di dalam cluster nodes untuk menampung lonjakan sesaat (maxSurge) saat Pod baru diinisialisasi sebelum Pod lama dihentikan.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum membangun pipeline, pastikan infrastruktur berikut telah tersedia dan terverifikasi:

  • Kubernetes Cluster: Versi 1.25 atau lebih baru (bisa menggunakan Minikube untuk lokal, EKS, GKE, atau k3s untuk production).
  • CLI Tools yang Terinstal: kubectl, helm, docker, dan argocd CLI.
  • Registry Container: Akses ke Docker Hub, GitHub Packages (GHCR), atau AWS ECR.
  • Hak Akses (RBAC): Akun dengan hak akses cluster-admin pada Kubernetes cluster untuk menginstal ArgoCD.

Verifikasi kesiapan cluster dengan perintah berikut:

kubectl cluster-info
kubectl get nodes

[!IMPORTANT] Pastikan port 80 dan 443 terbuka pada Ingress Controller Anda, serta pastikan resource quotas (CPU/Memory requests & limits) telah dikonfigurasi pada Namespace production untuk menghindari Resource Starvation.

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Dockerfile Multi-Stage yang Dioptimalkan untuk Produksi

Buat file Dockerfile pada root direktori aplikasi backend Anda (contoh menggunakan Node.js/Go/PHP, di sini kita gunakan contoh berbasis Node.js TypeScript):

# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json tsconfig.json ./
RUN npm ci
COPY src/ ./src
RUN npm run build

# Stage 2: Production Runtime
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production

# Buat user non-root untuk keamanan ketat
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodeapp -u 1001 -G nodejs

COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

COPY --from=builder --chown=nodeapp:nodejs /app/dist ./dist

USER nodeapp
EXPOSE 3000

CMD ["node", "dist/index.js"]

Langkah 2: Manifest Kubernetes Deployment & Service

Buat file manifest Kubernetes dengan nama deployment.yaml. File ini mencakup strategi RollingUpdate, konfigurasi Liveness dan Readiness Probe, serta alokasi resource:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-backend-app
  namespace: production
  labels:
    app: web-backend
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: web-backend
  template:
    metadata:
      labels:
        app: web-backend
    spec:
      containers:
      - name: backend
        image: ghcr.io/username/web-backend:v1.0.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000
          name: http
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 3000
          initialDelaySeconds: 15
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 3
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 5"]
---
apiVersion: v1
kind: Service
metadata:
  name: web-backend-svc
  namespace: production
  labels:
    app: web-backend
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 3000
    protocol: TCP
    name: http
  selector:
    app: web-backend

Langkah 3: Instalasi dan Konfigurasi ArgoCD

Instal ArgoCD ke dalam cluster Kubernetes Anda pada namespace argocd:

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

Dapatkan password awal untuk akun admin ArgoCD:

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

Langkah 4: Membuat ArgoCD Application Manifest

Buat file argocd-app.yaml untuk mendaftarkan repository Git Anda ke ArgoCD:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: web-backend-gitops
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/username/infrastructure-manifests.git'
    targetRevision: HEAD
    path: k8s/production
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

Terapkan aplikasi ArgoCD tersebut:

kubectl apply -f argocd-app.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa parameter paling krusial dari file konfigurasi di atas:

  • maxSurge: 1 dan maxUnavailable: 0: Kombinasi ini memastikan bahwa saat proses rolling update berjalan, Kubernetes diizinkan membuat 1 pod ekstra di atas jumlah replicas (maxSurge), dan tidak boleh ada satupun pod lama yang dimatikan sebelum pod baru benar-benar siap (maxUnavailable: 0). Hasilnya adalah kapasitas layanan tidak pernah berkurang dan selalu ada minimum 3 (atau lebih) pod yang melayani traffic.
  • readinessProbe vs livenessProbe: livenessProbe bertugas mendeteksi apakah aplikasi mengalami deadlock (jika gagal, container direstart). readinessProbe bertugas mendeteksi apakah aplikasi sudah siap menerima traffic (jika gagal, traffic dari Service diputus sementara ke pod tersebut tanpa merestart container).
  • lifecycle.preStop dengan sleep 5: Sangat penting untuk aplikasi web (Node.js/Go/PHP). Ketika Kubernetes memutuskan menghentikan Pod, terkadang Ingress/Service belum sepenuhnya memperbarui daftar EndpointSlice. Perintah sleep 5 memberikan jeda agar load balancer internal sempat memperbarui rute sebelum proses terminasi sinyal SIGTERM diterima aplikasi.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam sebuah studi kasus nyata pada platform e-commerce ber-traffic tinggi (mencapai 50.000 request per detik saat flash sale), penerapan pipeline ini diuji dengan melakukan rilis pembaruan backend secara terus-menerus di tengah beban puncak.

  • Hasil Observasi: Metrik pada Prometheus dan Grafana menunjukkan zero-drop pada success rate HTTP (tetap di angka 99.99%). Peningkatan latensi (p99 latency) hanya berfluktuasi kurang dari 3% selama proses sinkronisasi ArgoCD berlangsung.
  • Mitigasi Lonjakan Traffic: Dengan mengombinasikan ArgoCD GitOps bersama Kubernetes Horizontal Pod Autoscaler (HPA), kluster secara otomatis melakukan scale-out pod tambahan ketika CPU utilization melewati ambang batas 70%, memastikan ketersediaan layanan tetap terjaga tanpa intervensi manual dari sysadmin.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menggunakan tag latest pada Docker Image di Production
    • Dampak: Menyebabkan ketidakpastian versi saat rollback dan membuat Kubernetes gagal mendeteksi adanya pembaruan image.
    • Solusi: Gunakan Semantic Versioning yang unik (misal: v1.2.3 atau commit SHA hash git-<sha>) pada setiap build tag.
  2. Pitfall: Lupa Mengatur resources.requests dan limits
    • Dampak: Pod dapat menghabiskan seluruh memori node, memicu OOMKilled, dan merusak pod lain di node yang sama (noisy neighbor effect).
    • Solusi: Selalu definisikan resource requests dan limits yang sesuai dengan hasil profiling load testing.
  3. Kesalahan Konfigurasi Probe yang Terlalu Agresif
    • Dampak: initialDelaySeconds yang terlalu singkat membuat liveness probe gagal berkali-kali sebelum aplikasi selesai melakukan booting (terutama aplikasi Java, Spring Boot, atau Node.js yang butuh waktu inisialisasi koneksi database).

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memvalidasi bahwa pipeline zero-downtime Anda benar-benar tahan banting, lakukan uji beban menggunakan k6 atau wrk selama proses argocd sync dieksekusi.

Contoh skrip uji beban 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
    { 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 < 200ms': (r) => r.timings.duration < 200,
  });
  sleep(0.1);
}

Interpretasi Hasil: Pastikan metrik http_req_failed bernilai 0.00% selama siklus pembaruan deployment dijalankan dari ArgoCD.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis arsitektur ini ke lingkungan production yang sebenarnya, pastikan Anda telah mencentang seluruh item dalam checklist berikut:

  • Dockerfile menggunakan multi-stage build dan dijalankan dengan user non-root.
  • Strategi deployment menggunakan RollingUpdate dengan maxSurge dan maxUnavailable yang tepat.
  • Liveness probe, readiness probe, dan startup probe telah dikonfigurasi dengan delay dan threshold yang akurat.
  • Hook preStop diterapkan untuk graceful shutdown pada aplikasi backend.
  • ArgoCD dikonfigurasi dengan otomatisasi sinkronisasi yang aman serta proteksi RBAC.
  • Uji beban (load test) berhasil dijalankan tanpa menghasilkan error 5xx selama proses deployment.

Penerapan Zero-Downtime Deployment Pipeline dengan Docker, Kubernetes, dan ArgoCD bukan sekadar tren teknologi, melainkan fondasi fundamental bagi enterprise modern untuk mencapai stabilitas, kecepatan rilis, dan keandalan sistem yang tak tertandingi.

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