L
Cloud Architecture & Serverless • Literally Web ID

Arsitektur Zero-Downtime Deployment Menggunakan Kubernetes & ArgoCD

⏱️ 18 menit baca • 📅 19 Oct 2026 • 👁️ 4 views
Arsitektur Zero-Downtime Deployment Menggunakan Kubernetes & ArgoCD

Arsitektur Zero-Downtime Deployment Menggunakan Kubernetes & ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap pengembangan perangkat lunak modern, ekspektasi terhadap ketersediaan layanan sistem (SLA) berada pada level tertinggi sepanjang sejarah. Pengguna akhir, baik dalam konteks B2C maupun B2B enterprise, menuntut layanan yang dapat diakses 24 jam sehari, 7 hari seminggu, tanpa ada toleransi untuk jeda pemeliharaan (maintenance window). Di sinilah tantangan terbesar bagi Infrastructure Engineer, Site Reliability Engineer (SRE), dan DevOps Architect muncul: bagaimana memperbarui kode aplikasi, melakukan migrasi skema database, atau menambal celah keamanan infrastruktur tanpa memutus koneksi aktif dari klien.

Secara historis, deployment aplikasi web dilakukan menggunakan teknik rolling update manual pada server monolitik berbasis LAMP (Linux, Apache, MySQL, PHP) atau Nginx dengan proses graceful reload menggunakan perintah seperti systemctl reload php-fpm. Meskipun metode ini memadai untuk lalu lintas rendah, ia memiliki kelemahan fatal ketika diterapkan pada arsitektur microservices yang terdistribusi. Bottleneck utama meliputi:

  • Kegagalan Sinkronisasi State: Ketika node backend diperbarui secara sekuensial tanpa manajemen traffic routing yang presisi, klien sering kali menemui broken requests, HTTP 502 Bad Gateway, atau HTTP 504 Gateway Timeout akibat inkonsistensi antara versi API lama dan baru.
  • Ketiadaan Visibilitas Konfigurasi (Configuration Drift): Perubahan infrastruktur yang dilakukan secara manual melalui SSH rentan terhadap kesalahan manusia, menyebabkan perbedaan konfigurasi antar server produksi dan staging.
  • Waktu Rollback yang Lambat: Saat terjadi kegagalan pada versi baru, proses pengembalian sistem ke versi stabil sebelumnya sering kali memakan waktu berjam-jam karena harus membangun ulang artefak atau memulihkan snapshot disk.

[!WARNING] Ketergantungan pada proses deployment manual melalui skrip Bash yang dieksekusi dari mesin lokal pengembang adalah ancaman terbesar terhadap integritas data produksi. Tanpa audit trail yang tercatat dalam sistem Version Control (Git), insiden kegagalan sistem hampir mustahil untuk dilacak secara forensik.

Sebelum penerapan Kubernetes dan ArgoCD, skenario pembaruan aplikasi sering kali melibatkan downtime terjadwal. Setelah adopsi arsitektur GitOps menggunakan Kubernetes dan ArgoCD, seluruh siklus hidup deployment berjalan secara otonom, deklaratif, dan transparan. Kondisi sebelum dan sesudah dapat diringkas sebagai berikut:

  • Sebelum (Legacy Deployment): Downtime periodik, konfigurasi manual yang rentan drift, rollback lambat, tidak ada automated health check yang terintegrasi dengan pengalihan traffic.
  • Sesudah (Kubernetes + ArgoCD): Zero downtime mutlak, infrastruktur sebagai kode (IaC) yang sepenuhnya deklaratif, rollback otomatis berbasis metrik kesehatan, dan konsistensi status klaster yang dijamin secara real-time.

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur Zero-Downtime Deployment yang tangguh dibangun di atas fondasi orkestrasi kontainer Kubernetes dan prinsip GitOps yang diorkestrasi oleh ArgoCD. Untuk memahami cara kerjanya di balik layar (under the hood), kita perlu membedah siklus hidup permintaan (request lifecycle) dan bagaimana lalu lintas jaringan dikelola saat transisi versi terjadi.

Alur Kerja GitOps dan Rekonsiliasi ArgoCD

ArgoCD bertindak sebagai agen Continuous Delivery yang berjalan di dalam klaster Kubernetes. ArgoCD secara kontinu memantau repositori Git (tempat manifest Kubernetes disimpan) dan membandingkannya dengan kondisi aktual (actual state) di dalam klaster.

+-----------------------+
|    Git Repository     |
| (Declarative Manifest)|--+
+-----------------------+  |
                           | (Watch/Poll)
                           v
                     +-----------+
                     |  ArgoCD   |
                     | Controller|
                     +-----------+
                           |
                           | (Reconcile / Apply)
                           v
+---------------------------------------------------+
|               Kubernetes Cluster                  |
|  +-------------------+     +-------------------+  |
|  | Ingress Controller| --> |  Service (Load)   |  |
|  +-------------------+     +-------------------+  |
|                                     |             |
|         +---------------------------+             |
|         v                                         |
|  +--------------+       +--------------+          |
|  | Pod (v1.0.0) |       | Pod (v1.1.0) |          |
|  |  [Running]   |       |  [Terminating|          |
|  +--------------+       +--------------+          |
+---------------------------------------------------+

Ketika seorang pengembang melakukan merge pada Pull Request ke branch main, ArgoCD mendeteksi perbedaan hash commit. ArgoCD kemudian memicu proses sinkronisasi (sync) ke klaster Kubernetes. Kubernetes API Server menerima manifest baru dan memulai strategi RollingUpdate pada objek Deployment.

Mekanisme Rolling Update & Canary

  1. Deployment Strategy (RollingUpdate): Parameter maxSurge dan maxUnavailable memegang peran kunci. maxSurge menentukan berapa banyak pod tambahan yang dapat dibuat di atas jumlah desired replicas selama proses pembaruan. maxUnavailable menentukan berapa banyak pod yang boleh berada dalam kondisi mati (offline) secara bersamaan.
  2. Liveness & Readiness Probes: Kubernetes tidak akan mengarahkan lalu lintas dari Service ke pod baru sebelum probe readiness mengembalikan status sukses (HTTP 200). Sementara itu, liveness probe memastikan bahwa jika aplikasi mengalami kebuntuan (deadlock), Kubernetes akan secara otomatis memulai ulang pod tersebut.
  3. Graceful Shutdown: Ketika pod lama dihentikan, Kubernetes mengirimkan sinyal SIGTERM ke proses utama di dalam kontainer (misalnya PHP-FPM atau Node.js process). Aplikasi harus menangkap sinyal ini, menghentikan penerimaan koneksi baru, menyelesaikan permintaan yang sedang berjalan (selama terminationGracePeriodSeconds), dan kemudian keluar dengan status 0.

3. Perbandingan Komparatif / Analisis Pendekatan

Memilih strategi deployment yang tepat sangat bergantung pada arsitektur aplikasi, toleransi risiko, dan ketersediaan sumber daya komputasi. Berikut adalah analisis komparatif mendalam antara tiga pendekatan utama.

Parameter Perbandingan Rolling Update Canary Deployment Blue/Green Deployment
Konsumsi Sumber Daya (CPU/RAM) Rendah (Hanya butuh ekstra cadangan sebesar maxSurge) Sedang (Membutuhkan kapasitas ekstra untuk pod Canary) Tinggi (Membutuhkan duplikasi infrastruktur penuh secara paralel)
Waktu Transisi Trafik Bertahap (Seiring rotasi pod) Terkendali (Menggunakan Ingress/Service Mesh weight shifting) Seketika (Peralihan DNS atau Ingress Selector secara instan)
Kompleksitas Implementasi Rendah (Bawaan Kubernetes) Tinggi (Membutuhkan Argo Rollouts / Service Mesh) Sedang (Membutuhkan manajemen load balancer yang canggih)
Risiko Dampak Kegagalan Sedang (Menjanggal sebagian pengguna jika probe gagal) Sangat Rendah (Hanya berdampak pada sebagian kecil trafik uji) Rendah (Namun berdampak penuh jika kedua lingkungan memiliki bug yang sama)
Latensi Jaringan Minimal Dapat meningkat sedikit jika routing melalui Service Mesh Minimal

[!TIP] Untuk aplikasi skala menengah dengan siklus rilis yang sering, strategi Rolling Update dengan konfigurasi maxSurge: 25% dan maxUnavailable: 0 sudah lebih dari cukup untuk mencapai zero downtime. Gunakan Canary Deployment (menggunakan Argo Rollouts) hanya jika aplikasi Anda menangani transaksi finansial bernilai tinggi yang memerlukan validasi metrik real-time.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan konfigurasi teknis, pastikan lingkungan infrastruktur Anda memenuhi spesifikasi minimum berikut:

  • Kubernetes Cluster: Versi 1.25 atau lebih tinggi (mendukung API stabilitas tinggi).
  • CLI Tools: kubectl, argocd CLI, dan helm terinstal di mesin lokal pengembang atau CI/CD runner.
  • Infrastruktur Pendukung: Ingress Controller (seperti Nginx Ingress Controller atau Traefik) dan Cert-Manager untuk manajemen SSL/TLS otomatis.
  • Akses Hak Istimewa: Akses cluster-admin untuk pembuatan Custom Resource Definitions (CRD) dan konfigurasi RBAC ArgoCD.

Verifikasi kesiapan klaster dengan menjalankan perintah berikut:

# Memeriksa versi Kubernetes server dan client
kubectl version --client

# Memastikan ketersediaan node klaster dalam status Ready
kubectl get nodes -o wide

# Memeriksa namespace argocd
kubectl get namespaces

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah panduan praktis implementasi lengkap, mulai dari manifes Kubernetes aplikasi, konfigurasi Ingress, hingga sinkronisasi ArgoCD. Seluruh file konfigurasi di bawah ini siap digunakan di lingkungan produksi.

A. Manifest Kubernetes Aplikasi (deployment.yaml dan service.yaml)

Buat file bernama k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: enterprise-web-app
  namespace: production
  labels:
    app.kubernetes.io/name: enterprise-web-app
    app.kubernetes.io/part-of: core-services
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: enterprise-web-app
  template:
    metadata:
      labels:
        app.kubernetes.io/name: enterprise-web-app
    spec:
      containers:
      - name: web-backend
        image: registry.internal.net/core/web-app:v1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 3
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
          timeoutSeconds: 2
          failureThreshold: 3
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 10"]
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: false
          runAsNonRoot: true
          runAsUser: 10001
      terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: enterprise-web-service
  namespace: production
  labels:
    app.kubernetes.io/name: enterprise-web-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app.kubernetes.io/name: enterprise-web-app

B. Manifest Ingress Controller (ingress.yaml)

Buat file bernama k8s/ingress.yaml:

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

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

Buat file bernama argocd/application.yaml untuk mendaftarkan repositori Git ke ArgoCD:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-web-app-sync
  namespace: argocd
  finalizers:
    - resources-finalizer.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/enterprise/web-infrastructure.git'
    targetRevision: HEAD
    path: k8s
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

Terapkan manifes aplikasi ArgoCD ke klaster:

kubectl apply -f argocd/application.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa parameter krusial dari konfigurasi di atas untuk memastikan pemahaman mendalam:

  1. strategy.rollingUpdate.maxSurge: 1 & maxUnavailable: 0:
    • Kombinasi ini adalah rahasia utama terciptanya zero downtime. maxUnavailable: 0 melarang Kubernetes mematikan pod lama sebelum pod baru berhasil dibuat dan siap. maxSurge: 1 mengizinkan pembuatan 1 pod ekstra di atas jumlah replicas (4 + 1 = 5 pod aktif sementara). Klien tidak akan pernah mengalami kekurangan kapasitas layanan.
  2. readinessProbe vs livenessProbe:
    • readinessProbe bertugas memberi tahu Ingress/Service apakah pod siap menerima trafik. Jika aplikasi memuat koneksi database yang lama saat startup, probe ini menunda pengarahan trafik hingga aplikasi benar-benar siap. Sebaliknya, livenessProbe memantau kesehatan internal kontainer secara berkala; jika gagal, kontainer direstart secara otomatis.
  3. lifecycle.preStop dan sleep 10:
    • Saat pod dihapus, Kubernetes secara asinkron menghapus endpoint pod dari objek Service. Terkadang terjadi race condition di mana Ingress masih mengirimkan trafik ke pod yang sedang dimatikan. Perintah sleep 10 memberikan jeda waktu agar Ingress memperbarui tabel perutean internalnya sebelum proses aplikasi benar-benar menerima sinyal SIGTERM.
  4. syncPolicy.automated pada ArgoCD:
    • Parameter prune: true memastikan bahwa jika sebuah manifes dihapus dari Git, sumber daya terkait di Kubernetes juga akan dihapus secara otomatis. selfHeal: true memaksa ArgoCD mengembalikan konfigurasi klaster jika ada administrator yang mengubah parameter secara manual melalui kubectl edit (configuration drift prevention).

7. Skenario Produksi & Studi Kasus Dunia Nyata

Pada sistem skala enterprise dengan jutaan pengguna harian (misalnya platform e-commerce saat flash sale), beban trafik mencapai puluhan ribu Requests Per Second (RPS). Dalam skenario ini, proses deployment tidak boleh hanya berfokus pada ketersediaan pod, tetapi juga pada manajemen memori dan koneksi basis data.

Studi Kasus: Perusahaan Fintech X melakukan pembaruan layanan pembayaran mikrolayanan berbasis Go. Saat deployment berjalan:

  • Kloning kontainer baru memicu lonjakan koneksi ke pool database MySQL secara simultan.
  • Tanpa pembatasan yang tepat, lonjakan koneksi ini memicu connection exhaustion pada database server.

Solusi Arsitektural:

  1. Mengintegrasikan Horizontal Pod Autoscaler (HPA) berdasarkan metrik kustom (seperti kueri CPU atau latensi HTTP) yang bekerja selaras dengan ArgoCD.
  2. Mengonfigurasi Connection Pooling di sisi aplikasi menggunakan middleware seperti PgBouncer untuk PostgreSQL atau ProxySQL untuk MySQL.
  3. Mengatur initialDelaySeconds pada readiness probe agar memberikan waktu bagi aplikasi untuk melakukan warming cache terlebih dahulu sebelum menerima trafik penuh.

8. Common Pitfalls, Anti-Patterns & Solusi

Kesalahan implementasi sering kali terjadi bukan karena teknologi Kubernetes atau ArgoCD itu sendiri, melainkan karena kelalaian dalam mendefinisikan parameter operasional dasar:

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

    • Dampak: ArgoCD dan Kubernetes tidak dapat mendeteksi perubahan versi jika tag citra tetap sama (latest), mengakibatkan kegagalan rolling update karena Kubernetes menganggap manifes tidak berubah.
    • Solusi: Selalu gunakan Semantic Versioning (misal: v1.2.0) atau SHA-256 digest dari citra kontainer pada setiap commit Git.
  • Anti-Pattern 2: Mengabaikan Resource Limits & Requests

    • Dampak: Pod dapat mengonsumsi seluruh sumber daya CPU/RAM pada sebuah Node, menyebabkan Node Starvation dan memicu Eviction Policy Kubernetes yang mematikan pod secara acak (menyebabkan downtime).
    • Solusi: Selalu definisikan blok resources.requests dan resources.limits secara akurat berdasarkan hasil load testing.
  • Anti-Pattern 3: Tidak Menangani Sinyal SIGTERM di Aplikasi

    • Dampak: Aplikasi langsung terhenti secara paksa saat menerima perintah terminasi, memutuskan koneksi klien yang sedang melakukan pengunggahan data (file upload) atau transaksi pembayaran.
    • Solusi: Implementasikan graceful shutdown listener pada kode backend (Node.js/Go/PHP) untuk merespons sinyal terminasi dengan baik.

9. Benchmark, Metrik Kinerja & Tuning Performa

Sebelum merilis konfigurasi ke lingkungan produksi penuh, verifikasi ketahanan sistem menggunakan perangkat uji beban seperti k6 atau wrk. Berikut adalah skrip pengujian beban sederhana menggunakan k6 untuk menguji stabilitas endpoint selama proses deployment berlangsung:

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

export const options = {
  stages: [
    { duration: '1m', target: 50 },  // Ramp-up ke 50 VUs
    { duration: '3m', target: 200 }, // Pertahankan 200 VUs selama deployment
    { duration: '1m', target: 0 },   // Ramp-down
  ],
  thresholds: {
    http_req_duration: ['p(95)<250'], // 95% permintaan harus di bawah 250ms
    http_req_failed: ['rate<0.01'],   // Tingkat kegagalan harus di bawah 1%
  },
};

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

Parameter Tuning Lanjutan

  • Kernel Tuning (sysctl): Pada node pekerja Kubernetes, sesuaikan parameter jaringan untuk menangani koneksi TCP masif:
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.ip_local_port_range = 1024 65535
    
  • ArgoCD Controller Tuning: Untuk klaster skala besar, tingkatkan jumlah pekerja rekonsiliasi ArgoCD melalui variabel lingkungan ARGOCD_CONTROLLER_REPLICAS untuk mencegah antrean sinkronisasi.

10. Checklist Penerapan Produksi & Kesimpulan

Sebagai langkah akhir sebelum sistem dinyatakan siap beroperasi penuh (Go-Live), pastikan seluruh poin dalam checklist berikut telah terpenuhi:

  1. Manifes Kubernetes menggunakan versi API stabil (apps/v1, networking.k8s.io/v1).
  2. Strategi RollingUpdate dikonfigurasi dengan maxUnavailable: 0 dan maxSurge optimal.
  3. LivenessProbe dan ReadinessProbe aktif dengan waktu tunggu yang wajar.
  4. Blok resources (CPU dan Memory Requests/Limits) telah didefinisikan pada setiap kontainer.
  5. ArgoCD diatur dengan kebijakan selfHeal: true dan prune: true untuk mencegah configuration drift.
  6. Pengujian beban (load testing) telah dilakukan selama simulasi rolling update tanpa mencatat adanya lonjakan HTTP 5xx errors.

Dengan memadukan orkestrasi presisi dari Kubernetes, manajemen siklus hidup aplikasi yang ketat, dan otomatisasi GitOps melalui ArgoCD, organisasi Anda kini memiliki kapabilitas infrastruktur kelas dunia yang mampu menjalankan pembaruan sistem secara kontinu, aman, dan tanpa gangguan sedikit pun bagi pengguna akhir.

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