L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment Pipeline dengan Kubernetes dan ArgoCD

⏱️ 15 menit baca • 📅 12 Oct 2026 • 👁️ 1 views
Zero-Downtime Deployment Pipeline dengan Kubernetes dan ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern, ekspektasi pengguna terhadap ketersediaan layanan (availability) adalah 99.99% atau setara dengan downtime tahunan kurang dari 52 menit. Namun, dalam siklus hidup pengembangan perangkat lunak tradisional (Software Development Life Cycle), proses deployment kode baru sering kali menjadi momok yang memicu gangguan layanan. Pendekatan konvensional—seperti mematikan instans aplikasi yang sedang berjalan, menyalin biner baru, dan memulai ulang layanan (stop-the-world deployment)—mengakibatkan interupsi koneksi yang fatal bagi pengguna akhir, memutus transaksi aktif pada database (MySQL/MariaDB), serta menghentikan pemrosesan pesan pada antrean (queue) seperti Redis.

Bottleneck performa dan keamanan yang paling sering ditemukan di dunia nyata meliputi:

  1. Ketiadaan Isolasi Trafik selama Transisi: Load balancer (Nginx/Caddy) atau Ingress Controller terus merutekan permintaan ke pod Kubernetes yang sedang dalam proses penghentian (terminating), menghasilkan HTTP 502 Bad Gateway atau 504 Gateway Timeout.
  2. Korupsi Status Basis Data: Pembaruan skema database yang tidak sinkron dengan versi aplikasi baru menyebabkan kegagalan kueri SQL secara masif.
  3. Konfigurasi Manual yang Rawan Kesalahan (Human Error): Perintah kubectl apply manual langsung ke cluster produksi menciptakan kondisi inkonsistensi antara state aktual di cluster dan state yang diinginkan di repositori Git, yang dikenal sebagai Configuration Drift.

Sebelum menerapkan otomatisasi GitOps dengan ArgoCD dan Kubernetes, sebuah perusahaan biasanya mengalami waktu pemulihan (Mean Time to Recovery / MTTR) yang tinggi, proses rollback yang memakan waktu hingga berjam-jam karena harus mendaur ulang server fisik atau VM secara manual, serta visibilitas audit trail yang buruk terhadap siapa yang mengubah konfigurasi infrastruktur. Sesudah menerapkan pipeline zero-downtime berbasis ArgoCD, perubahan manifes Kubernetes dikelola sepenuhnya melalui Pull Request, validasi otomatis dijalankan oleh CI, dan ArgoCD melakukan sinkronisasi deklaratif secara aman dengan strategi rolling update yang menjamin ketersediaan tanpa intervensi manusia.

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur Zero-Downtime Deployment berbasis ArgoCD menggabungkan prinsip Infrastructure as Code (IaC) dan GitOps di atas orkestrasi kontainer Kubernetes. ArgoCD bertindak sebagai pengawas (controller) yang berjalan di dalam kluster, terus-menerus membandingkan status aktual kluster (Live State) dengan status yang dideklarasikan di repositori Git (Desired State).

[ Developer ] ---> Push Git Commit ---> [ Git Repository ]
                                              |
                                              v
[ Kubernetes Pods ] <--- Sync & Apply --- [ ArgoCD Controller ]
        |
   (Zero-Downtime)
        |
[ Ingress / Service ] ---> Load Balancing ---> [ New Pods / Old Pods ]

Alur eksekusi data di balik layar saat terjadi pembaruan aplikasi:

  1. Commit & Push: Developer melakukan penggabungan kode (merge) ke branch utama di Git (misalnya main).
  2. Deteksi Perubahan: ArgoCD mendeteksi adanya perbedaan (out-of-sync) antara repositori Git dan kluster Kubernetes berdasarkan interval polling atau webhook.
  3. Rekonsiliasi Otomatis: ArgoCD memulai proses sinkronisasi manifes YAML/Helm/Kustomize ke dalam kluster.
  4. Rolling Update Kubernetes: Kubernetes Deployment Controller membuat pod baru dengan versi aplikasi yang diperbarui. Selama proses ini, Kubernetes menggunakan Liveness, Readiness, dan Startup Probes untuk menentukan kapan pod baru benar-benar siap menerima trafik.
  5. Graceful Termination: Pod versi lama diberi sinyal SIGTERM, diberikan waktu penundaan (termination grace period) untuk menyelesaikan koneksi HTTP yang sedang berlangsung, sebelum akhirnya dihentikan total (SIGKILL).

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memilih strategi deployment yang tepat, tabel komparasi berikut membedah tiga pendekatan utama di ekosistem Kubernetes berdasarkan parameter sumber daya dan operasional:

Parameter Komparasi Rolling Update (Native) Recreate Strategy Blue/Green Deployment Canary Deployment
Downtime Nol (Zero-Downtime) Tinggi (Ada jeda mati) Nol (Zero-Downtime) Nol (Zero-Downtime)
Kebutuhan Sumber Daya (CPU/RAM) Rendah (Hanya butuh buffer kecil) Minimal (Semua dimatikan dulu) Tinggi (Butuh 2x kapasitas penuh) Sedang (Alokasi pod kecil untuk rilis awal)
Kompleksitas Konfigurasi Rendah Sangat Rendah Sedang Tinggi (Butuh Service Mesh / Ingress Weight)
Kecepatan Rollback Cepat (Otomatis oleh K8s) Lambat (Harus deploy ulang versi lama) Sangat Cepat (Alihkan router/selector) Cepat (Kurangi bobot trafik canary)
Risiko Dampak Bug Menyeluruh ke semua pengguna secara bertahap Menyeluruh secara instan Rendah (Diuji di env Green dulu) Sangat Rendah (Hanya berdampak ke sedikit pengguna)

[!TIP] Gunakan Rolling Update dengan konfigurasi maxSurge dan maxUnavailable yang tepat untuk aplikasi web standar berbeban menengah. Untuk aplikasi mission-critical dengan jutaan pengguna konkuren, kombinasikan ArgoCD dengan Argo Rollouts untuk pendekatan Canary berbasis metrik.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum membangun pipeline, pastikan infrastruktur pendukung telah memenuhi spesifikasi berikut:

  • Kluster Kubernetes: Versi 1.25 atau lebih baru dengan hak akses cluster-admin.
  • CLI Tools: kubectl, argocd CLI, dan helm terpasang di mesin lokal atau runner CI/CD.
  • Domain & SSL: Sertifikat TLS valid yang dikelola melalui Cert-Manager serta Ingress Controller (seperti Nginx Ingress Controller atau Traefik).
  • Registry Kontainer: Akses baca/tulis ke Docker Hub, GitHub Packages, atau AWS ECR.

Verifikasi kesiapan kluster dengan menjalankan perintah berikut:

# Verifikasi koneksi dan versi kluster Kubernetes
kubectl version --client
kubectl cluster-info

# Verifikasi ketersediaan Ingress Controller
kubectl get pods -n ingress-nginx

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD ke Kluster Kubernetes

Buat namespace khusus untuk ArgoCD dan instal manifes stabil:

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

Periksa status pod ArgoCD hingga seluruhnya berada dalam status Running:

kubectl get pods -n argocd -w

Dapatkan kata sandi awal untuk akun admin:

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

Langkah 2: Konfigurasi Deployment Aplikasi dengan Rolling Update

Buat file manifes deployment.yaml untuk aplikasi web (misalnya backend Node.js/Go) yang menerapkan parameter Rolling Update secara eksplisit:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app-backend
  namespace: production
  labels:
    app: web-app-backend
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1       # Jumlah maksimum pod yang dapat dibuat di atas jumlah yang diinginkan
      maxUnavailable: 0 # Jumlah maksimum pod yang boleh tidak tersedia selama proses update
  selector:
    matchLabels:
      app: web-app-backend
  template:
    metadata:
      labels:
        app: web-app-backend
    spec:
      containers:
      - name: backend
        image: registry.example.com/org/web-app:v1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "250m"
            memory: "512Mi"
          limits:
            cpu: "500m"
            memory: "1Gi"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
          failureThreshold: 3
        livenessProbe:
          httpGet:
            path: /livez
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
          failureThreshold: 3
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 10"]
---
apiVersion: v1
kind: Service
metadata:
  name: web-app-service
  namespace: production
spec:
  selector:
    app: web-app-backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

Langkah 3: Konfigurasi ArgoCD Application Manifes

Buat file manifes ArgoCD argocd-app.yaml untuk menghubungkan repositori Git Anda dengan kluster Kubernetes:

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

Terapkan manifes aplikasi ke ArgoCD:

kubectl apply -f argocd-app.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah parameter paling krusial yang menjamin zero downtime pada konfigurasi di atas:

  • maxUnavailable: 0: Parameter ini sangat esensial. Jika Anda memiliki 3 replika, Kubernetes diinstruksikan untuk tidak boleh mematikan satu pun pod lama sebelum pod baru benar-benar siap dan sehat (healthy). Ini memastikan kapasitas layanan selalu 100% selama proses deployment.
  • maxSurge: 1: Memungkinkan Kubernetes untuk meluncurkan 1 pod tambahan di atas kuota normal (menjadi 4 pod sementara waktu) guna mempercepat proses transisi.
  • lifecycle.preStop: Baris `command: ["sh
🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server