L
Kubernetes & CI/CD โ€ข Literally Web ID

Zero-Downtime Deployment Pipeline dengan ArgoCD dan Kubernetes

โฑ๏ธ 22 menit baca โ€ข ๐Ÿ“… 13 Oct 2026 โ€ข ๐Ÿ‘๏ธ 1 views
Zero-Downtime Deployment Pipeline dengan ArgoCD dan Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap rekayasa perangkat lunak modern, rilis aplikasi web skala enterprise sering kali menjadi sumber friksi terbesar antara tim Developer dan Site Reliability Engineering (SRE). Pola rilis tradisional yang mengandalkan pipeline Continuous Delivery berbasis script push (seperti Jenkins, GitLab CI Runner, atau GitHub Actions runner yang mengeksekusi kubectl apply -f manifest.yaml secara langsung ke cluster) membawa serangkaian masalah kritis yang memicu downtime, inkonsistensi status sistem, dan celah keamanan.

Masalah Utama Paradigma CI/CD Tradisional (Push-Based Deployment)

  1. Configuration Drift (Penyimpangan Konfigurasi): Operator melakukan intervensi darurat langsung di cluster menggunakan kubectl edit atau kubectl patch. Ketika pipeline CI dijalankan ulang, perubahan darurat tersebut tertimpa tanpa jejak audit, atau sebaliknya, cluster berada dalam kondisi yang tidak lagi mencerminkan kode di Git repository.
  2. Kelemahan Keamanan (Credential Sprawl): Runner CI eksternal harus memegang kredensial administratif cluster (kubeconfig dengan hak istimewa tinggi). Jika runner CI disusupi melalui dependency supply chain attack, seluruh infrastruktur Kubernetes enterprise terancam kompromi secara total.
  3. Keterbatasan RollingUpdate Bawaan Kubernetes: Strategi RollingUpdate standar pada Kubernetes Deployment hanya memeriksa kesiapan Pod (readinessProbe) pada layer transport atau HTTP status lokal. Strategi ini buta terhadap metrik bisnis nyata, seperti lonjakan HTTP error 5xx di ingress gateway, degradasi latency p99 database, atau memory leak bertahap. Pod baru dianggap sehat, Pod lama dimatikan seketika, dan seluruh pengguna terdampak oleh regresi kode yang fatal.
Metrik / Parameter Sebelum GitOps & Progressive Delivery Sesudah GitOps (ArgoCD + Argo Rollouts)
Model Keamanan Push (Kredensial cluster disimpan di CI runner luar) Pull (ArgoCD di dalam cluster menarik manifest via SSH/HTTPS)
Single Source of Truth Terpecah antara Git, CI Environment Variables, dan State Cluster Git Repository adalah satu-satunya acuan mutlak (Declarative)
Deteksi & Mitigasi Drift Manual, sering terabaikan hingga outage berikutnya Otomatis terdeteksi real-time & self-healing otomatis
Strategi Deployment RollingUpdate primitif (All-or-Nothing pod swap) Canary & Blue/Green berbasis analisis metrik Prometheus nyata
MTTR (Mean Time to Recover) Jam (Debugging log CI, mencari commit yang rusak, revert manual) Detik (Automated rollback instan triggered by metric threshold)
Downtime & Blast Radius Rawan cold-start drops, 502 Bad Gateway, kegagalan fatal 100% user Zero-downtime mutlak; blast radius canary dibatasi 10% - 20% user

Menjawab kebutuhan tersebut, perpaduan arsitektur GitOps menggunakan ArgoCD dan kemampuan Progressive Delivery menggunakan Argo Rollouts hadir sebagai standar baku de facto dalam orkestrasi infrastruktur web modern.


2. Konsep Inti & Deep Dive Arsitektur

Arsitektur GitOps menggeser paradigma deployment dari pendekatan imperatif (menjalankan rangkaian instruksi eksekusi) ke deklaratif murni (mendefinisikan target state sistem). Dalam model ini, Git bertindak sebagai representasi tunggal dari kondisi infrastruktur dan aplikasi yang diinginkan (Desired State). ArgoCD bertugas mengamati status aktual (Actual State) di dalam cluster Kubernetes secara terus-menerus dan melakukan rekonsiliasi jika terjadi perbedaan (Drift).

Siklus Hidup Alur Kerja Zero-Downtime Pipeline

Di bawah ini adalah representasi visual dari seluruh alur integrasi GitOps, mulai dari commit aplikasi oleh software engineer hingga evaluasi metrik real-time oleh Argo Rollouts Controller:

+----------------------------------------------------------------------------------------------------------------+
|                                             PENGEMBANGAN & CI (PUSH)                                           |
+----------------------------------------------------------------------------------------------------------------+
  [Developer] ---> Git Push (App Code) ---> [GitHub/GitLab CI] 
                                                   | 
                                                   +--> Build Container Image (Go/Node/PHP-FPM)
                                                   +--> Run Unit & Integration Tests
                                                   +--> Push Image to OCI Registry (Harbor/GHCR/ECR)
                                                   +--> Update Image Tag di [Git Manifest Repository] (Commit)
                                                                   |
+------------------------------------------------------------------v---------------------------------------------+
|                                       KUBERNETES PRODUCTION CLUSTER (PULL)                                     |
|                                                                                                                |
|   +-------------------------------- ArgoCD (GitOps Controller Engine) ------------------------------------+   |
|   |                                                                                                       |   |
|   |   [Git Repository] <==== Polling / Webhook ==== [ArgoCD Repo Server]                                  |   |
|   |                                                         |                                             |   |
|   |                                              Render Helm / Kustomize                                  |   |
|   |                                                         |                                             |   |
|   |   [Actual Cluster State] <==== Reconciliation Loop ==== [Application Controller]                      |   |
|   |                                                         |                                             |   |
|   +---------------------------------------------------------|---------------------------------------------+   |
|                                                             v                                                  |
|   +-------------------------------- Argo Rollouts Controller (Canary / Blue-Green) ------------------------+   |
|   |                                                                                                       |   |
|   |   1. Menerapkan Rollout Custom Resource Definition (CRD)                                              |   |
|   |   2. Membuat ReplicaSet Canary (misal: 10% traffic)                                                   |   |
|   |   3. Mengatur Ingress / Service Mesh (Nginx Ingress / Istio) untuk split traffic                          |   |
|   |   4. Eksekusi AnalysisRun: Query metrik ke Prometheus (HTTP error rate < 0.5% & Latency P99 < 200ms)  |   |
|   |                                                                                                       |   |
|   |       +------------------------------------+------------------------------------+                     |   |
|   |       | METRIK VALID                       | METRIK ANOMALI / GAGAL             |                     |   |
|   |       v                                    v                                    |                     |   |
|   |   Scale-up pod Canary bertahap             Instan Rollback ke Stable ReplicaSet |                     |   |
|   |   Hingga 100% traffic teralihkan           Traffic canary dialihkan ke 0%       |                     |   |
|   |   Hapus ReplicaSet versi lama              Kirim alert ke tim SRE               |                     |   |
|   +-------------------------------------------------------------------------------------------------------+   |
+----------------------------------------------------------------------------------------------------------------+

Anatomi Komponen ArgoCD Internal

  1. API Server: Layanan gRPC/REST internal yang menangani komunikasi dengan Web UI, CLI, dan sistem eksternal, mengelola autentikasi (OIDC, SSO), serta otorisasi RBAC.
  2. Repository Server: Layanan internal yang mengkloning repositori Git, menjaga cache lokal, dan merender manifest deklaratif (Kustomize, Helm, atau file Kubernetes Plain YAML).
  3. Application Controller: Worker controller inti yang mengamati Kubernetes API Server secara real-time melalui watch streams. Controller ini membandingkan output yang dihasilkan oleh Repository Server dengan kondisi aktual di cluster. Jika terjadi divergensi (OutOfSync), ia memicu sync phase sesuai kebijakan otomasi yang ditentukan (Automated Sync & Self-Healing).

Mengapa Kubernetes Deployment Bawaan Tidak Cukup untuk Zero-Downtime?

Kubernetes standar hanya memiliki objek Deployment dengan strategi Recreate (menyebabkan downtime total) atau RollingUpdate. Pada RollingUpdate, pod baru dibuat, dan begitu lolos probe sederhana, traffic dialihkan secara proporsional berdasarkan jumlah Pod tanpa kemampuan pemisahan traffic (Traffic Splitting) berbasis persentase pada level Ingress/Gateway. Jika aplikasi mengalami bug fatal yang hanya muncul di bawah beban koneksi dinamis (misal: kebocoran memori Redis connection pool), seluruh pod lama tetap akan dimatikan dan digantikan pod rusak tersebut. Argo Rollouts mengatasi keterbatasan fundamental ini dengan menyediakan CRD Rollout yang mengontrol ingress router secara granular serta terhubung langsung dengan penyedia metrik eksternal.


3. Perbandingan Komparatif: Canary vs. Blue/Green Deployment

Memilih strategi rilis yang tepat merupakan keputusan arsitektural penting yang berdampak langsung pada alokasi infrastruktur dan toleransi risiko organisasi.

STRATEGI BLUE/GREEN:
Traffic: 100% [Active Service] --------> [ReplicaSet V1 - Blue (100% Pod)]
                                         [ReplicaSet V2 - Green (100% Pod Ready, 0% Traffic)]
-- Switch Switch Over --
Traffic: 100% [Active Service] --------> [ReplicaSet V2 - Green (100% Pod)]

STRATEGI CANARY:
Traffic:  90% -------------------------> [Stable Service] -> [ReplicaSet V1 (9 Pods)]
          10% -------------------------> [Canary Service] -> [ReplicaSet V2 (1 Pod)]
-- Evaluasi Sukses -> Scale Up Step-by-Step hingga 100% --
Parameter Evaluasi Blue/Green Deployment Canary Deployment (Progressive)
Overhead Sumber Daya (Compute) Tinggi (+100% Resource Spike). Membutuhkan alokasi kuota CPU dan RAM dua kali lipat selama proses rilis berlangsung karena dua versi berjalan paralel secara penuh. Rendah (10% - 25% Resource Spike). Pod baru dinaikkan secara bertahap seiring pod versi lama diturunkan.
Mekanisme Verifikasi Smoke test manual atau automated suite pada preview URL privat sebelum traffic dialihkan secara instan (cutover). Evaluasi bertahap pada pengguna nyata (live traffic) menggunakan verifikasi metrik telemetri otomatis (Prometheus Analysis).
Waktu Rollback Hampir Instan (< 1 detik). Hanya membalikkan selector Service Kubernetes kembali ke ReplicaSet Blue. Cepat (Detik hingga Menit). Bergantung pada kecepatan penurunan traffic canary dan proses scale down ReplicaSet eksperimen.
Risiko Blast Radius Biner (All-or-Nothing). Jika terdapat bug yang lolos dari smoke test, seluruh 100% pengguna akan langsung terdampak saat switch over. Minimal. Hanya sebagian kecil persentase request (misal: 5%) yang terpapar risiko bug pada rilis baru.
Kesesuaian State Database Sangat rentan terhadap schema drift database jika migrasi skema tabel tidak backward-compatible. Memerlukan migrasi database backward-compatible multi-tahap (Expand and Contract Pattern).

[!TIP] Rekomendasi Arsitek: Gunakan Canary Deployment untuk aplikasi web monolitik maupun microservices dengan throughput tinggi (high concurrency) di mana degradasi latency atau error p99 harus ditangkap sebelum berdampak luas. Gunakan Blue/Green Deployment jika aplikasi memiliki keterikatan ketat yang sulit mempertahankan backward-compatibility komunikasi API antar versi Pod.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum melangkah ke implementasi teknis, pastikan cluster Kubernetes dan dependensi infrastruktur telah memenuhi standar spesifikasi produksi berikut:

Spesifikasi Infrastruktur Minimal (Production Ready)

  • Kubernetes Cluster: Versi 1.28 ke atas (EKS, GKE, AKS, atau Bare-Metal kubeadm).
  • Node Pool Minimum: 3 Worker Nodes (Masing-masing 4 vCPU, 16 GB RAM) guna mengakomodasi high-availability control plane dan beban kerja workload.
  • Ingress Controller: NGINX Ingress Controller (versi v1.9.0+) yang telah dikonfigurasi untuk mendukung dynamic traffic splitting annotations.
  • Monitoring Stack: Prometheus Server dan Prometheus Operator aktif di namespace monitoring.
  • Tools Administratif Lokal:
    • kubectl (v1.28+)
    • helm (v3.12+)
    • argocd CLI (v2.10+)
    • kubectl-argo-rollouts plugin

Verifikasi kesiapan koneksi cluster dan API server menggunakan perintah berikut:

# Verifikasi versi node dan API server
kubectl get nodes -o wide

# Pastikan namespace target monitoring sudah berjalan dan Prometheus Service dapat diakses
kubectl get svc -n monitoring prometheus-k8s

# Verifikasi Ingress Controller terpasang
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

Pastikan Ingress Controller telah mengaktifkan cuplikan snippet atau dynamic configuration reload yang dibutuhkan untuk modul canary routing.


5. Panduan Implementasi Langkah demi Langkah

Panduan ini membagi pipeline GitOps menjadi tiga fase: Penyiapan ArgoCD High-Availability, Instalasi Argo Rollouts Controller, dan Penerapan Aplikasi Web Berbasis Progressive Canary Delivery.

Langkah 1: Instalasi ArgoCD High Availability (HA) di Namespace argocd

Jangan gunakan instalasi non-HA untuk lingkungan produksi. Gunakan manifest resmi ArgoCD HA yang mencakup replikasi Redis Sentinel dan Application Controller multi-pod.

# 1. Buat namespace terisolasi
kubectl create namespace argocd

# 2. Terapkan konfigurasi manifest ArgoCD High Availability resmi
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.10.4/manifests/ha/install.yaml

# 3. Verifikasi ketersediaan semua Pod ArgoCD
kubectl wait --for=condition=Available deployment/argocd-server -n argocd --timeout=300s

Buat file manifest Ingress untuk mengamankan Web UI ArgoCD menggunakan domain terdaftar dengan enkripsi SSL/TLS Let's Encrypt.

Simpan sebagai file argocd-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: argocd.internal.domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              name: https
  tls:
  - hosts:
    - argocd.internal.domain.com
    secretName: argocd-server-tls

Terapkan Ingress tersebut ke cluster:

kubectl apply -f argocd-ingress.yaml

Dapatkan initial secret password akun admin untuk login awal via CLI:

# Ambil initial admin secret
ARGOCD_INITIAL_PWD=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
echo "Initial Admin Password: ${ARGOCD_INITIAL_PWD}"

# Login via ArgoCD CLI
argocd login argocd.internal.domain.com --username admin --password "${ARGOCD_INITIAL_PWD}" --grpc-web

[!WARNING] Hapus secret argocd-initial-admin-secret dari namespace argocd segera setelah Anda berhasil melakukan login dan mengganti password atau mengintegrasikan Single Sign-On (SSO via OIDC/Dex). Menyimpan secret ini di cluster menimbulkan celah eskalasi hak akses.

Langkah 2: Instalasi Argo Rollouts Controller & Kubectl Plugin

Argo Rollouts bertindak sebagai pengendali independen yang mengelola lifecycle Custom Resource Definition (CRD) Rollout.

# 1. Buat namespace khusus untuk controller
kubectl create namespace argo-rollouts

# 2. Instalasi CRD dan controller Argo Rollouts resmi
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.6.6/install.yaml

# 3. Unduh dan pasang plugin kubectl argo-rollouts untuk workstation/bastion host
curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.6/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

# 4. Verifikasi plugin
kubectl argo-rollouts version

Langkah 3: Konfigurasi GitOps Repository Structure

Struktur direktori GitOps harus memisahkan repositori kode aplikasi dari repositori konfigurasi deployment (Manifest Repo) untuk mencegah siklus rekursi tak terbatas (infinite CI build loops). Bentuk direktori repositori Git manifest deklaratif (web-infra-gitops) harus tersusun seperti berikut:

web-infra-gitops/
โ”œโ”€โ”€ apps/
โ”‚   โ””โ”€โ”€ web-application.yaml       # ArgoCD Application Definition
โ””โ”€โ”€ base/
    โ”œโ”€โ”€ analysis-template.yaml     # Template Evaluasi Metrik Prometheus
    โ”œโ”€โ”€ ingress.yaml               # Ingress Controller Routing Rules
    โ”œโ”€โ”€ kustomization.yaml         # Kustomize Entrypoint
    โ”œโ”€โ”€ rollout.yaml               # Argo Rollout Controller Definition (Core)
    โ””โ”€โ”€ services.yaml              # Stable and Canary Services

Langkah 4: Deklarasi Resource Manifest Progressive Delivery

Berikut adalah file-file manifest terpadu yang harus dimasukkan ke dalam Git manifest repository:

A. Service Definition (base/services.yaml)

Kita membutuhkan dua Service independen: satu Service yang selalu menunjuk ke Pod stabil, dan satu Service yang menunjuk ke Pod canary.

apiVersion: v1
kind: Service
metadata:
  name: web-app-stable
  namespace: production
  labels:
    app: web-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: web-app
---
apiVersion: v1
kind: Service
metadata:
  name: web-app-canary
  namespace: production
  labels:
    app: web-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: web-app

B. Ingress Definition (base/ingress.yaml)

Ingress ini mendefinisikan routing utama. Argo Rollouts akan secara dinamis menyuntikkan annotation manipulasi traffic ke Nginx Ingress.

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

C. AnalysisTemplate Prometheus (base/analysis-template.yaml)

Template ini bertugas mengeksekusi Prometheus PromQL query secara berkala untuk mengevaluasi kesehatan Canary Pod selama masa rilis.

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: web-app-canary-analysis
  namespace: production
spec:
  metrics:
  - name: success-rate
    interval: 30s
    successCondition: len(result) > 0 && result[0] >= 0.995
    failureLimit: 3
    provider:
      prometheus:
        address: http://prometheus-k8s.monitoring.svc.cluster.local:9090
        query: |
          sum(rate(nginx_ingress_controller_requests{namespace="production",ingress="web-app-ingress",status=~"[1-4].*"}[1m]))
          /
          sum(rate(nginx_ingress_controller_requests{namespace="production",ingress="web-app-ingress"}[1m]))
  - name: latency-p99
    interval: 30s
    successCondition: len(result) > 0 && result[0] <= 0.250
    failureLimit: 2
    provider:
      prometheus:
        address: http://prometheus-k8s.monitoring.svc.cluster.local:9090
        query: |
          histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{namespace="production",ingress="web-app-ingress"}[1m])) by (le))

D. Rollout Custom Resource (base/rollout.yaml)

Resource ini menggantikan objek Deployment Kubernetes biasa.

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: web-app-rollout
  namespace: production
  labels:
    app: web-app
spec:
  replicas: 10
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: web-app
  strategy:
    canary:
      analysis:
        templates:
        - templateName: web-app-canary-analysis
        startingStep: 1
      canaryService: web-app-canary
      stableService: web-app-stable
      trafficRouting:
        nginx:
          stableIngress: web-app-ingress
      steps:
      - setWeight: 10
      - pause: { duration: 2m }
      - setWeight: 25
      - pause: { duration: 5m }
      - setWeight: 50
      - pause: { duration: 5m }
      - setWeight: 75
      - pause: { duration: 2m }
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: enterprise-web
        image: ghcr.io/org/enterprise-web:v1.2.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: http
        resources:
          limits:
            cpu: "1000m"
            memory: "1024Mi"
          requests:
            cpu: "250m"
            memory: "512Mi"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 15"]

E. Kustomization Manifest (base/kustomization.yaml)

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- services.yaml
- ingress.yaml
- analysis-template.yaml
- rollout.yaml

F. ArgoCD Application Manifest (apps/web-application.yaml)

Deklarasi ini menyatukan semuanya ke dalam kontrol otomatis ArgoCD.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: production-web-app
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/organization-corp/web-infra-gitops.git'
    targetRevision: HEAD
    path: 'base'
  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 Application Manifest ini ke dalam ArgoCD:

kubectl apply -f apps/web-application.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Setiap parameter deklarasi dalam arsitektur Progressive Delivery memiliki korelasi langsung terhadap kestabilan sistem under load:

1. base/rollout.yaml - lifecycle & preStop

lifecycle:
  preStop:
    exec:
      command: ["/bin/sh", "-c", "sleep 15"]
  • Fungsi: Mencegah dropped packets saat penarikan Pod lama. Ketika pod akan dihentikan, Kubernetes menghapus IP-nya dari Service endpoint bersamaan dengan pengiriman sinyal SIGTERM ke aplikasi. Tanpa jeda ini, Nginx Ingress Controller mungkin masih mengarahkan request masuk ke pod yang telah menghentikan event loop aplikasinya.
  • Parameter Alternatif: Jeda 15 hingga 30 detik (sleep 15 - sleep 30) disesuaikan dengan ingress-nginx keep-alive pooling connection timeout.
  • Dampak Kesalahan: Pengguna akan mengalami error HTTP 502 Bad Gateway sesaat secara acak di tengah-tengah proses rollout penggantian pod.

2. base/rollout.yaml - spec.strategy.canary.trafficRouting

trafficRouting:
  nginx:
    stableIngress: web-app-ingress
  • Fungsi: Memerintahkan Argo Rollouts untuk memanipulasi ingress controller secara langsung. Alih-alih membagi traffic berdasarkan rasio pod (misal: 1 pod canary dari total 10 pod = 10%), Argo Rollouts secara otomatis membuat Canary Ingress Object bayangan dengan annotation nginx.ingress.kubernetes.io/canary: "true" dan nginx.ingress.kubernetes.io/canary-weight: "10".
  • Dampak Kesalahan: Jika field ini salah atau referensi Ingress tidak cocok, pembagian traffic akan gagal, dan Pod canary akan langsung menerima request secara tidak terduga atau tidak menerima request sama sekali.

3. base/analysis-template.yaml - Metric Calculation

successCondition: len(result) > 0 && result[0] >= 0.995
failureLimit: 3
  • Fungsi: Syarat wajib kelulusan metrik. Angka 0.995 berarti tingkat keberhasilan transaksi request HTTP (Status non-5xx) minimal harus berada di 99.5% (Error budget tolerance: 0.5%). Nilai failureLimit: 3 menginstruksikan sistem untuk mentolerir kegagalan metrik maksimal 2 kali berturut-turut. Pada anomali ketiga, proses rollout dihentikan seketika dan dibatalkan (Aborted Rollout).
  • Parameter Alternatif: Menggunakan threshold absolut atau baseline metric comparison jika sistem memiliki fluktuasi error natural.

4. apps/web-application.yaml - syncPolicy.selfHeal & prune

automated:
  prune: true
  selfHeal: true
  • Fungsi: selfHeal: true memastikan jika ada operator yang secara manual merubah konfigurasi di dalam cluster via kubectl edit, ArgoCD akan otomatis menimpa kembali perubahan manual tersebut sesuai apa yang tertulis di Git dalam hitungan detik. prune: true memastikan objek resource yang dihapus dari Git akan dihapus pula dari cluster.
  • Dampak Kesalahan: Mematikan selfHeal akan membuka pintu terjadinya Configuration Drift yang merusak integritas GitOps.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Skenario: Penanganan Traffic Flash-Sale 20.000 Requests/Sec (RPS)

Sebuah platform e-commerce high-traffic merilis versi baru layanan transaksi checkout (v1.2.0). Kode baru tersebut secara tidak sengaja memuat bug konkurensi: pembukaan koneksi redis pool berulang di setiap request yang memicu memory leak dan lonjakan response time pada p99.

Eksekusi Update Gambar Aplikasi di GitOps

CI pipeline memodifikasi image tag di Git manifest repository:

cd web-infra-gitops/base
kustomize edit set image ghcr.io/org/enterprise-web=ghcr.io/org/enterprise-web:v1.2.0
git commit -am "chore: bump web-app version to v1.2.0"
git push origin main

Kronologi Operasional Rollout di Cluster

  1. Deteksi GitOps: ArgoCD mendeteksi commit baru di branch main dalam 15 detik (atau seketika via GitHub Webhook). ArgoCD menyinkronkan perubahan ke resource Rollout.
  2. Eksekusi Step 1: Argo Rollouts membuat ReplicaSet baru (v1.2.0) dengan 1 pod. Annotation Nginx Ingress disetel ke canary-weight: 10 (10% traffic dialihkan ke v1.2.0, 90% traffic tetap di v1.1.0).
  3. Eksekusi AnalysisRun: Prometheus Analysis berjalan di background. Dari beban total 20.000 RPS, Canary Pod menerima beban sekitar 2.000 RPS.
  4. Deteksi Anomali: Latency p99 pod canary melonjak hingga 780ms, jauh melampaui batas ambang pada analysis-template.yaml yaitu 0.250 (250ms). Tingkat kesuksesan HTTP turun menjadi 98.1% karena kegagalan alokasi koneksi pool.
# Pemantauan real-time via Argo Rollouts CLI
kubectl argo-rollouts get rollout web-app-rollout -n production --watch

Output CLI menampilkan status abort secara otomatis:

Name:            web-app-rollout
Namespace:       production
Status:          โœ– Degraded
Message:         RolloutAborted: Rollout aborted update to revision 2: metric 'latency-p99' failed 2 times
Strategy:        Canary
  Step:          1/7 (Aborted)
  SetWeight:     0
Replicas:
  Desired:       10
  Current:       10
  Updated:       0
  Stable:        10

Images:
  ghcr.io/org/enterprise-web:v1.1.0 (stable)

Analysis Runs:
  web-app-rollout-657788cbbf-2-1  Failed
  1. Hasil Reduksi Dampak: Bobot traffic canary dikembalikan seketika ke 0%. ReplicaSet rusak di-scale down menjadi 0. 90% pengguna tidak pernah merasakan adanya penurunan performa sama sekali, dan 10% pengguna canary hanya terpapar anomali selama rentang waktu 60 detik analisis metrik. Tidak ada intervensi manual yang diperlukan di tengah malam.

8. Common Pitfalls, Anti-Patterns & Solusi

Dalam membangun pipeline zero-downtime berbasis GitOps, kesalahan arsitektur sering kali berakibat fatal. Berikut adalah anti-pattern yang sering ditemukan beserta solusinya:

1. Inkompatibilitas Skema Database (Database Migration Trap)

  • Anti-Pattern: Menjalankan migrasi skema database yang memodifikasi atau menghapus kolom secara langsung via Kubernetes Job sebelum rollout aplikasi selesai. Pod stabil (v1.1.0) seketika gagal mengeksekusi query karena kolom telah hilang, menyebabkan downtime 100% pada traffic stabil.
  • Solusi Arsitektural: Wajib terapkan Expand and Contract Pattern (Parallel Run).
    1. Fase 1 (Expand): Tambahkan kolom baru tanpa menghapus kolom lama. Tulis data ke kedua kolom secara ganda jika diperlukan.
    2. Fase 2 (Rollout): Luncurkan aplikasi baru yang memanfaatkan kolom baru.
    3. Fase 3 (Contract): Setelah versi lama benar-benar mati dan dihapus dari cluster, jalankan migrasi lanjutan untuk menghapus kolom lama.

2. DNS Caching & Sticky Connection Bypass

  • Anti-Pattern: Mengandalkan pembagian traffic Canary hanya pada layer transport (L4 - TCP load balancing), sementara koneksi HTTP/1.1 atau HTTP/2 keep-alive dari Edge CDN (seperti Cloudflare) tetap mempertahankan soket TCP persisten ke Pod stabil.
  • Solusi: Pastikan Ingress Controller beroperasi pada Layer 7 (HTTP) dan dukung header injection. Atur keepalive_requests dan keepalive_timeout pada ingress secara proporsional agar koneksi didistribusikan ulang secara merata ke upstream endpoints.

3. Sync-Loop Hell Akibat Resource Mutation Controller

  • Anti-Pattern: ArgoCD terus-menerus menampilkan status OutOfSync padahal sinkronisasi berhasil. Hal ini terjadi karena ada Mutating Admission Webhook (seperti Istio Sidecar Injector atau HashiCorp Vault Agent Injector) yang memodifikasi spec Pod di cluster secara dinamis, sehingga manifes cluster tidak pernah identik dengan Git.
  • Solusi: Deklarasikan ignoreDifferences pada konfigurasi Application ArgoCD untuk mengabaikan field yang dimutasi secara dinamis oleh webhook eksternal:
spec:
  ignoreDifferences:
  - group: apps
    kind: Rollout
    jsonPointers:
    - /spec/template/metadata/annotations/sidecar.istio.io~1status

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memvalidasi bahwa strategi rilis benar-benar mencapai zero-downtime, uji beban harus dieksekusi secara intensif selama proses rollout berlangsung.

Metodologi Pengujian dengan K6

Jalankan skenario beban konstan sebesar 5.000 virtual users (VUs) dengan target 10.000 RPS selama transisi rollout dari v1.1.0 ke v1.2.0:

// k6-loadtest.js
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 5000 }, // Ramp-up
    { duration: '10m', target: 5000 }, // Steady state selama proses rollout
    { duration: '2m', target: 0 },    // Ramp-down
  ],
  thresholds: {
    'http_req_failed': ['rate<0.001'], // Kegagalan HTTP harus di bawah 0.1%
    'http_req_duration': ['p(99)<300'], // 99% request harus selesai di bawah 300ms
  },
};

export default function () {
  const res = http.get('https://application.domain.com/api/v1/ping');
  check(res, {
    'status is 200': (r) => r.status === 200,
  });
  sleep(0.1);
}

Eksekusi beban pengujian dari node independen di luar cluster:

k6 run k6-loadtest.js

Sembari k6 berjalan, lakukan update image pada GitOps repo untuk memicu Canary Rollout.

Interpretasi Hasil Benchmark & Profiling Latency

running (14m00.0s), 0000/5000 VUs, 8400000 complete and 0 interrupted iterations
default โœ“ [======================================] 5000 VUs  14m0s

     โœ“ status is 200

     checks.........................: 100.00% โœ“ 8400000     โœ— 0
     data_received..................: 1.8 GB  2.1 MB/s
     data_sent......................: 739 MB  880 kB/s
     http_req_blocked...............: avg=21.4ยตs  min=1.2ยตs  med=4.8ยตs   max=142.1ms p(99)=52.1ยตs
     http_req_connecting............: avg=7.1ยตs   min=0s     med=0s      max=89.2ms  p(99)=0s
     http_req_duration..............: avg=42.31ms min=8.2ms  med=38.41ms max=288.4ms p(99)=112.4ms
       { expected_response:true }...: avg=42.31ms min=8.2ms  med=38.41ms max=288.4ms p(99)=112.4ms
     http_req_failed................: 0.00%   โœ“ 0           โœ— 0
     http_reqs......................: 8400000 10000/s

Hasil Analisis:

  • HTTP Error Rate: 0.00% kegagalan dari total 8.400.000 request yang dilayani. Ini membuktikan bahwa mekanisme preStop hook dan traffic routing Nginx bekerja secara presisi tanpa ada koneksi yang terputus (zero-downtime tercapai).
  • p99 Latency: Terjaga di angka 112.4ms, berada di bawah ambang batas SLA (< 300ms).

Optimasi Lanjutan Kinerja NGINX Ingress Controller

Tambahkan konfigurasi berikut ke ConfigMap Ingress Nginx global (ingress-nginx-controller) untuk memastikan pemrosesan request berkapasitas besar tidak terhambat pada antrean buffer worker:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  keep-alive: "75"
  keep-alive-requests: "100000"
  max-worker-connections: "65536"
  upstream-keepalive-connections: "256"
  upstream-keepalive-requests: "8192"
  upstream-keepalive-timeout: "60"

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meresmikan pipeline ini sebagai jalur rilis utama sistem enterprise Anda, lakukan verifikasi menyeluruh terhadap checklist kesiapan berikut:

CHECKLIST KESIAPAN PRODUKSI PIPELINE GITOPS:

[ Keamanan & Aksesibilitas ]
[ ] ArgoCD Web UI diamankan di balik Private Ingress / VPN perusahaan.
[ ] RBAC ArgoCD terkonfigurasi dengan batasan akses (Read-Only untuk Devs, Admin untuk SRE).
[ ] Secret default admin telah dihapus dari namespace argocd.
[ ] Repository GitOps diisolasi dan hanya dapat di-push oleh CI machine user (Branch Protection).

[ Keandalan Deployment & Pod Lifecycle ]
[ ] Setiap container Pod wajib memiliki deklarasi resource Requests & Limits CPU/Memory.
[ ] Readiness dan Liveness Probe terkonfigurasi dengan parameter failureThreshold realistis.
[ ] Lifecycle preStop hook (sleep 15s) terpasang di seluruh Pod untuk graceful connection draining.
[ ] PodDisruptionBudget (PDB) aktif untuk mencegah down massal akibat maintenance node.

[ Monitoring & Automated Rollback ]
[ ] Prometheus metrics exporter (Nginx Ingress / Application runtime) beroperasi stabil.
[ ] AnalysisTemplate memiliki query yang telah divalidasi keakuratan datanya.
[ ] failureLimit pada Rollout diatur proporsional guna mencegah false-positive rollback.

Kesimpulan

Perpaduan arsitektur GitOps melalui ArgoCD dan progressive delivery menggunakan Argo Rollouts mengubah paradigma deployment dari aktivitas menegangkan berisiko tinggi menjadi proses deterministik, aman, dan sepenuhnya terotomasi. Dengan memindahkan kendali status sistem ke Git dan memanfaatkan metrik telemetri nyata untuk memvalidasi setiap fase rilis, tim engineering dapat mempercepat frekuensi pengiriman software ke lingkungan produksi secara signifikan tanpa mengorbankan reliabilitas infrastruktur atau menimbulkan downtime bagi pengguna akhir.

๐Ÿท๏ธ Tags: #Devops #Kubernetes #Sre #Gitops #Argocd