L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment Aplikasi E-Commerce Menggunakan Kubernetes & ArgoCD

⏱️ 18 menit baca • 📅 20 Oct 2026 • 👁️ 2 views
Zero-Downtime Deployment Aplikasi E-Commerce Menggunakan Kubernetes & ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap e-commerce modern, ketersediaan layanan (availability) adalah parameter finansial yang langsung berdampak pada pendapatan perusahaan. Setiap detik sistem down atau mengalami gangguan pada saat proses checkout atau flash sale berarti hilangnya transaksi, penurunan kepercayaan pelanggan, dan potensi kerugian jutaan rupiah. Secara historis, pembaruan aplikasi web dilakukan dengan mematikan server yang sedang berjalan (downtime deployment), melakukan overwrite kode, migrasi skema basis data secara langsung (destructive migration), dan menyalakan kembali layanan tersebut. Pendekatan primitif ini menciptakan Single Point of Failure dan menghentikan seluruh sesi pengguna aktif, yang berakibat pada kegagalan transaksi (cart drop-off).

Bottleneck performa dan keamanan yang sering muncul di dunia nyata meliputi:

  • Koneksi Database yang Terputus: Pembaruan monolitik sering kali mengubah struktur basis data secara destruktif tanpa mempertimbangkan kompatibilitas mundur (backward compatibility), mengakibatkan aplikasi versi lama langsung error ketika mencoba mengakses kolom tabel yang telah dihapus atau diubah tipenya.
  • Waktu Startup Aplikasi yang Lambat: Aplikasi backend berbasis Go, Node.js, atau PHP-FPM membutuhkan waktu untuk melakukan pemanasan cache (warm-up), melakukan koneksi awal ke Redis, dan menginisialisasi connection pool ke database. Jika Kubernetes langsung mengarahkan traffic sebelum proses ini selesai, pengguna akan mendapati error 502/504 Bad Gateway.
  • Manajemen Konfigurasi yang Manual: Perubahan variabel lingkungan (environment variables) atau sertifikat SSL yang dilakukan secara manual di mesin produksi sering memicu inkonsistensi antar node, kegagalan otentikasi API pihak ketiga (seperti payment gateway Midtrans, Stripe, atau PayPal), serta celah keamanan konfigurasi.

Perbandingan antara kondisi Sebelum dan Sesudah penerapan Zero-Downtime Deployment dengan Kubernetes dan ArgoCD dapat dilihat pada matriks berikut:

Parameter Sebelum (Manual / Tradisional) Sesudah (Kubernetes + ArgoCD + GitOps)
Metode Rilis SSH manual, rsync, atau FTP/SFTP Declarative GitOps, otomatis via ArgoCD
Downtime 2 - 15 menit per deployment 0 detik (Continuous Availability)
Rollback Manual, rentan human error, lambat Otomatis atau satu klik tombol di ArgoCD
Konsistensi Sering terjadi drift konfigurasi Terjaga mutlak oleh State-of-Git
Keamanan Kredensial tersebar di server lokal Terenkripsi dalam Kubernetes Secrets / SealedSecrets

2. Konsep Inti & Deep Dive Arsitektur

Zero-downtime deployment di dalam Kubernetes bertumpu pada orkestrasi objek Deployment, Service, Ingress Controller, serta mekanisme RollingUpdate strategy. Ketika sebuah rilis baru didorong ke repositori Git, ArgoCD mendeteksi perubahan tersebut dan menyinkronkannya ke kluster Kubernetes. Kubernetes kemudian membuat ReplicaSet baru dan menjalankan pod baru secara paralel dengan pod lama yang masih melayani traffic.

Alur eksekusi data dan traffic dapat divisualisasikan melalui diagram ASCII berikut:

[ Pengguna / Browser ] (HTTPS: 443)
         |
         v
[ Cloudflare CDN & WAF / Edge ]
         |
         v
[ Ingress Controller (Nginx / Traefik) ]
         |
         v
[ Kubernetes Service (ClusterIP) ]
         |
         +---> [ Pod v1 (Running & Serving Traffic) ]  <-- (Sedang Terminasi)
         |
         +---> [ Pod v2 (Initializing / Readiness Probe) ] <-- (Masuk ke Endpoint)

Proses di balik layar (under the hood) saat terjadi pembaruan:

  1. Git Commit: Developer melakukan merge pull request ke branch production. ArgoCD mendeteksi perbedaan hash commit antara Git dan kluster.
  2. Sync Process: ArgoCD menerapkan manifes Kubernetes baru ke kluster. Kubernetes menginisialisasi Pod v2.
  3. Readiness Probe Check: Kubernetes secara periodik mengirimkan HTTP GET ke endpoint /healthz pada Pod v2. Selama probe mengembalikan status error, Kubernetes tidak akan mendaftarkan IP Pod v2 ke dalam Endpoints Service.
  4. Traffic Splitting / Transition: Setelah Pod v2 lulus uji Readiness Probe (biasanya setelah beberapa kali percobaan sukses), Kubernetes mulai mengarahkan traffic baru ke Pod v2 dan secara bersamaan mengirimkan sinyal SIGTERM ke Pod v1.
  5. Graceful Shutdown: Pod v1 menerima sinyal SIGTERM, menghentikan penerimaan koneksi baru, menyelesaikan proses HTTP request yang sedang berlangsung (misalnya menyelesaikan pembayaran cart), menutup koneksi database secara aman, lalu melakukan termination.

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk mencapai zero-downtime, terdapat beberapa pendekatan strategi deployment yang dapat dipilih di dalam ekosistem Kubernetes. Pemilihan strategi ini sangat mempengaruhi konsumsi sumber daya (CPU/RAM) dan latensi jaringan.

Strategi Deployment Kelebihan Kekurangan Konsumsi Sumber Daya Latency Impact
Rolling Update Efisien sumber daya, standar industri Membutuhkan kompatibilitas versi database yang ketat Rendah (Hanya butuh ekstra 1-2 Pod saat transisi) Sangat Rendah
Blue/Green Deployment Rollback instan, pengujian isolasi sempurna Membutuhkan kapasitas kluster 2x lipat (Double Compute) Tinggi (Butuh 100% resource cadangan) Nihil
Canary Deployment Pengujian aman pada subset traffic kecil Kompleksitas routing (Butuh Istio / Ingress advanced) Sedang (Sedikit pod tambahan untuk canary) Rendah

[!TIP] Untuk aplikasi e-commerce skala menengah ke atas, Rolling Update dengan konfigurasi maxSurge: 1 dan maxUnavailable: 0 adalah pilihan paling optimal dari segi biaya infrastruktur, asalkan aplikasi dirancang stateless dan skema database mendukung backward compatibility.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan pipeline GitOps dan Kubernetes untuk e-commerce, pastikan komponen infrastruktur berikut telah tersedia dan terverifikasi:

  • Kluster Kubernetes: Versi minimum 1.25+ dengan akses kubectl yang terotorisasi.
  • ArgoCD: Terinstal pada namespace argocd dengan CLI yang terhubung.
  • Ingress Controller: Nginx Ingress Controller atau Traefik terpasang dengan dukungan SSL Termination.
  • Storage & Database: Managed database (MySQL / MariaDB) dan Redis untuk session store serta caching terisolasi.
  • Domain & DNS: Record A menunjuk ke IP publik Ingress Controller.

Verifikasi kesiapan kluster dengan perintah terminal berikut:

# Memeriksa status node kluster Kubernetes
kubectl get nodes -o wide

# Memeriksa status namespace ArgoCD
kubectl get pods -n argocd

# Memeriksa ketersediaan Ingress Controller
kubectl get svc -n ingress-nginx

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah konfigurasi manifes Kubernetes lengkap yang siap produksi untuk aplikasi e-commerce backend (misalnya ditulis dalam Node.js atau Go) yang menerapkan zero-downtime deployment, lengkap dengan konfigurasi database migration init container, liveness/readiness probe, serta ArgoCD Application.

A. Manifes Deployment & Service (ecommerce-app.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ecommerce-backend
  namespace: production
  labels:
    app: ecommerce-backend
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: ecommerce-backend
  template:
    metadata:
      labels:
        app: ecommerce-backend
    spec:
      initContainers:
      - name: db-migration
        image: registry.company.com/ecommerce/backend:v2.1.0
        command: ["npm", "run", "db:migrate"]
        env:
        - name: DB_HOST
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: host
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
      containers:
      - name: backend
        image: registry.company.com/ecommerce/backend:v2.1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
        env:
        - name: NODE_ENV
          value: "production"
        - name: REDIS_URL
          value: "redis://redis-master.production.svc.cluster.local:6379"
        resources:
          limits:
            cpu: "1"
            memory: "1Gi"
          requests:
            cpu: "500m"
            memory: "512Mi"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 2
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 10"]
---
apiVersion: v1
kind: Service
metadata:
  name: ecommerce-backend-svc
  namespace: production
  labels:
    app: ecommerce-backend
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: ecommerce-backend

B. Manifes Ingress Controller dengan SSL Termination (ecommerce-ingress.yaml)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ecommerce-ingress
  namespace: production
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - shop.company.com
    secretName: ecommerce-tls-cert
  rules:
  - host: shop.company.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ecommerce-backend-svc
            port:
              number: 80

C. Manifes ArgoCD Application (argocd-app.yaml)

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

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa parameter krusial di dalam manifes di atas yang menentukan keberhasilan Zero-Downtime Deployment:

  1. strategy.rollingUpdate.maxSurge: 1 & maxUnavailable: 0

    • maxSurge: 1 memberitahu Kubernetes untuk mengizinkan pembuatan 1 pod ekstra di atas jumlah desired replicas (3 pod) selama proses update berlangsung (total 4 pod). Ini memastikan kapasitas komputasi tidak berkurang.
    • maxUnavailable: 0 adalah kunci utama zero-downtime. Parameter ini melarang Kubernetes mematikan pod lama sebelum pod baru benar-benar siap dan sehat.
  2. initContainers: db-migration

    • Menjalankan migrasi database sebelum pod aplikasi utama dijalankan. Namun, perlu dicatat bahwa migrasi harus bersifat backward compatible (misalnya menambahkan kolom dengan nilai default, bukan menghapus kolom yang masih dipakai versi lama).
  3. readinessProbe vs livenessProbe

    • livenessProbe bertugas mendeteksi apakah aplikasi mengalami deadlock atau crash total; jika gagal, Kubernetes akan merestart pod.
    • readinessProbe bertugas menentukan apakah pod siap menerima traffic web. Jika gagal, Kubernetes mengeluarkan pod dari rotasi Service tanpa merestartnya.
  4. lifecycle.preStop dengan perintah sleep 10

    • Saat pod lama akan dihentikan, Kubernetes mencabut endpoint pod dari Service, namun terkadang Ingress/Load Balancer membutuhkan waktu beberapa detik untuk memperbarui tabel routing mereka. Perintah sleep 10 memberikan jeda waktu agar tidak ada request masuk yang mendapati koneksi tertutup secara mendadak (mencegah error 502).

7. Skenario Produksi & Studi Kasus Dunia Nyata

[!IMPORTANT] Studi Kasus: Sistem e-commerce menghadapi lonjakan traffic hingga 50.000 request per detik (RPS) saat kampanye tanggal kembar (11.11). Pada saat yang sama, tim merilis fitur keranjang belanja baru.

Solusi Arsitektur yang Diterapkan:

  • Database Read Replica & Connection Pooling: Menggunakan ProxySQL atau PgBouncer untuk menahan lonjakan koneksi database. Skema migrasi dijalankan menggunakan expand and contract pattern (ekspansi kolom baru, migrasi data secara asinkron, baru kemudian menghapus kolom lama pada rilis berikutnya).
  • Redis Session Clustering: Sesi keranjang belanja pengguna disimpan di dalam kluster Redis terdistribusi, bukan di memori lokal pod. Hal ini memastikan jika pod mengalami rolling update, pengguna tidak kehilangan isi keranjang belanja mereka (cart persistence).
  • Cloudflare Edge Caching: Aset statis (gambar produk, file JS/CSS) di-cache secara agresif di edge Cloudflare, mengurangi beban ke Ingress Controller hingga 70%.

8. Common Pitfalls, Anti-Patterns & Solusi

Berikut adalah kesalahan fatal yang sering dilakukan oleh praktisi infrastruktur:

  • Anti-Pattern 1: Menggunakan tag latest pada citra Docker di produksi.
    • Dampak: ArgoCD tidak dapat melacak perubahan versi secara akurat, dan rollback menjadi mustahil dilakukan.
    • Solusi: Gunakan Semantic Versioning (misal: v2.1.0) atau Git commit SHA hash.
  • Anti-Pattern 2: Mengabaikan preStop hook pada aplikasi Node.js/PHP-FPM.
    • Dampak: Terjadi lonjakan error 502 sesaat setelah deployment dimulai karena koneksi terputus tiba-tiba.
    • Solusi: Selalu tambahkan jeda sleep atau tangkap sinyal SIGTERM secara eksplisit di dalam kode aplikasi untuk menyelesaikan request HTTP yang sedang aktif.
  • Anti-Pattern 3: Migrasi Database yang Destruktif dalam Init Container.
    • Dampak: Pod baru gagal start karena mengubah struktur tabel yang masih diakses oleh pod lama yang masih berjalan secara paralel.
    • Solusi: Terapkan pola Expand-Contract untuk migrasi database lintas versi.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan sistem e-commerce tahan banting, lakukan pengujian beban (load testing) menggunakan tool seperti k6 atau wrk selama proses rolling update berlangsung.

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 pengguna
    { duration: '5m', target: 500 }, // Pertahankan beban
    { duration: '2m', target: 0 },   // Ramp-down
  ],
  thresholds: {
    http_req_duration: ['p(99)<500'], // 99% request harus di bawah 500ms
    http_req_failed: ['rate<0.01'],   // Error rate harus di bawah 1%
  },
};

export default function () {
  const res = http.get('https://shop.company.com/healthz');
  check(res, {
    'status is 200': (r) => r.status === 200,
  });
  sleep(1);
}

Jalankan benchmark dengan perintah:

k6 run load-test.js

Interpretasi Hasil & Tuning Lanjutan: Jika metrik http_req_failed menunjukkan angka di atas 0% selama deployment, periksa kembali nilai readinessProbe dan pastikan maxUnavailable diset ke 0. Lakukan tuning kernel sysctl pada node worker Kubernetes untuk meningkatkan batas maksimal file descriptors dan TCP connection backlog (somaxconn).


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis sistem ke lingkungan produksi live, pastikan seluruh item dalam checklist berikut telah terpenuhi:

  • Strategi RollingUpdate dikonfigurasi dengan maxSurge: 1 dan maxUnavailable: 0.
  • LivenessProbe dan ReadinessProbe telah diuji secara fungsional di endpoint aplikasi.
  • Skrip migrasi database bersifat backward compatible (Expand-Contract pattern).
  • ArgoCD dikonfigurasi dengan fitur selfHeal dan prune aktif.
  • Sertifikat SSL Let's Encrypt terpasang otomatis melalui Cert-Manager.
  • Redis Session Store terisolasi dan tidak bergantung pada memori pod lokal.
  • Alur rollback darurat telah diuji dalam staging environment.

Dengan mengintegrasikan Kubernetes, strategi RollingUpdate yang presisi, dan otomatisasi GitOps menggunakan ArgoCD, arsitektur e-commerce Anda kini memiliki fondasi yang tangguh, aman, dan sepenuhnya bebas dari gangguan downtime saat melakukan pembaruan kode di masa depan.

🏷️ Tags: #Devops #Kubernetes #Gitops #Argocd #E-Commerce