L
Kubernetes & CI/CD β€’ Literally Web ID

Zero-Downtime Deployment Kubernetes dengan ArgoCD dan Helm

⏱️ 15 menit baca β€’ πŸ“… 13 Oct 2026 β€’ πŸ‘οΈ 1 views
Zero-Downtime Deployment Kubernetes dengan ArgoCD dan Helm

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap enterprise modern, ketersediaan layanan (high availability) dan kecepatan rilis (time-to-market) adalah dua pilar penentu daya saing bisnis. Arsitektur web modern yang menopang beban beratβ€”mulai dari frontend berbasis single-page application (SPA), backend service dengan Go, Node.js, hingga PHP-FPM, sistem manajemen basis data seperti MySQL/MariaDB, hingga caching layer dengan Redisβ€”menuntut infrastruktur yang tidak boleh mengalami downtime sedikit pun saat pembaruan aplikasi dilakukan.

Secara historis, deployment manual menggunakan skrip Bash kustom atau pipeline CI/CD yang langsung melakukan kubectl apply dari mesin runner eksternal menyimpan celah keamanan dan risiko operasional yang masif. Pendekatan ini sering disebut sebagai "Push-based CI/CD". Masalah utamanya meliputi:

  • Kurangnya Keterlacakan (Traceability): Sulit mengetahui dengan pasti revisi kode apa yang saat ini berjalan di kluster Kubernetes produksi dibandingkan dengan repositori sumber kebenaran tunggal (single source of truth).
  • Drift Konfigurasi: Perubahan manual yang dilakukan langsung pada kluster menggunakan kubectl edit atau kubectl patch membuat status kluster menyimpang dari definisi deklaratif di Git, menyebabkan kegagalan audit dan inkonsistensi lingkungan.
  • Risiko Kemanan Kredensial: Mesin CI/CD harus memegang kredensial akses Kubernetes (kubeconfig dengan hak cluster-admin), yang jika berhasil disusupi oleh penyerang, akan memberikan kontrol penuh atas seluruh infrastruktur.

Sebaliknya, adopsi paradigma GitOps mengubah pendekatan tersebut menjadi pull-based. ArgoCD berjalan di dalam kluster Kubernetes, secara proaktif memantau repositori Git, dan merekonsiliasi status aktual kluster agar selalu selaras dengan manifestasi deklaratif. Ketika dikombinasikan dengan sistem manajemen paket Helm Chart, organisasi dapat mendistribusikan konfigurasi aplikasi yang modular, dapat digunakan kembali, dan terstandardisasi di berbagai lingkungan (staging, uat, production).

2. Konsep Inti & Deep Dive Arsitektur

ArgoCD mengimplementasikan pola arsitektur Kubernetes Controller kustom. Komponen utamanya meliputi:

  • API Server: Endpoint gRPC/HTTPS untuk antarmuka CLI, Web UI, dan webhook integrasi Git.
  • Repository Server: Komponen yang bertugas melakukan clone repositori Git, merender template Helm atau Kustomize, dan menghasilkan manifest Kubernetes mentah.
  • Application Controller: Otak utama yang membandingkan status target (manifestasi di Git) dengan status aktual (resource yang berjalan di kluster Kubernetes).

Berikut adalah alur eksekusi (workflow) dari Git commit hingga zero-downtime deployment:

[ Developer ] 
      β”‚
      β–Ό (1. Git Push)
[ Git Repository ] ──(Webhook)──► [ ArgoCD API Server ]
                                        β”‚
                                        β–Ό
                         [ ArgoCD Repository Server ]
                                (Render Helm / Kustomize)
                                        β”‚
                                        β–Ό
                         [ ArgoCD Application Controller ]
                                        β”‚
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β–Ό                                     β–Ό
            (2. Sync & Apply)                     (3. Rolling Update)
                     β”‚                                     β”‚
                     β–Ό                                     β–Ό
         [ Kubernetes API Server ] ──────────────► [ Ingress / Service ]
                     β”‚                                     β”‚
                     β–Ό                                     β–Ό
         [ Pod v1 (Terminating) ]                 [ Pod v2 (Ready) ]

Pada saat siklus sinkronisasi (sync), ArgoCD tidak menghapus seluruh infrastruktur, melainkan melakukan patching atau pergantian terkelola melalui Kubernetes Deployment Controller, memastikan lalu lintas (traffic) dari load balancer (Nginx/Caddy/Cloudflare) tetap terarah ke pod yang sehat.

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memahami mengapa kombinasi ArgoCD dan Helm menjadi standar emas industri, mari kita bandingkan dengan pendekatan deployment tradisional.

Parameter Perbandingan Push-Based CI/CD (GitHub Actions / Jenkins ke K8s) Pull-Based GitOps (ArgoCD + Helm) Scripting Bash Manual di Server Web Tradisional
Sumber Kebenaran CI/CD Pipeline / Runner Repositori Git (Deklaratif) File lokal di server / rsync
Manajemen Kredensial Kubeconfig disimpan di secret CI/CD Kluster menarik sendiri, aman di dalam kluster SSH Key di mesin deployment
Deteksi Drift Konfigurasi Tidak ada (hanya saat pipeline berjalan) Otomatis & Real-time oleh ArgoCD Manual / Tidak ada
Kemudahan Rollback Re-run pipeline versi lama (rentan gagal) git revert atau klik tombol Rollback di ArgoCD Manual restore file backup
Penggunaan Sumber Daya Ringan di kluster, berat di runner Menambah pod controller di kluster Kubernetes Tergantung spesifikasi VPS/Baremetal
Dukungan Skala Enterprise Rendah-Menengah Sangat Tinggi Sangat Rendah

[!IMPORTANT] Pendekatan GitOps menghilangkan kebutuhan pemberian akses tulis eksternal ke kluster Kubernetes. Semua akses dikendalikan melalui repositori Git dengan kebijakan Branch Protection dan Pull Request Review.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum memulai implementasi teknis, pastikan komponen berikut telah tersedia dan terverifikasi:

  • Kluster Kubernetes (v1.26 ke atas) dengan minimal 3 worker node untuk ketersediaan tinggi aplikasi web.
  • Helm CLI (v3.12+).
  • ArgoCD CLI (v2.8+).
  • Akses administrator (cluster-admin) untuk instalasi awal ArgoCD.
  • Ingress Controller (seperti Nginx Ingress Controller atau Traefik) dan cert-manager untuk manajemen SSL/TLS Let's Encrypt otomatis.

Verifikasi kesiapan kluster dengan menjalankan perintah berikut:

kubectl cluster-info
kubectl get nodes -o wide

Instalasi ArgoCD pada namespace terdedikasi (argocd):

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

Verifikasi bahwa seluruh pod ArgoCD berjalan dengan normal:

kubectl get pods -n argocd -w

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Struktur Repositori Helm Chart Modular

Buat struktur direktori untuk Helm chart aplikasi web enterprise kita (misalnya backend Go dengan frontend statis Nginx):

helm-charts/
β”œβ”€β”€ enterprise-webapp/
    β”œβ”€β”€ Chart.yaml
    β”œβ”€β”€ values.yaml
    β”œβ”€β”€ templates/
    β”‚   β”œβ”€β”€ deployment.yaml
    β”‚   β”œβ”€β”€ service.yaml
    β”‚   β”œβ”€β”€ ingress.yaml
    β”‚   └── hpa.yaml

Isi file Chart.yaml:

apiVersion: v2
name: enterprise-webapp
description: A Helm chart for Kubernetes Zero-Downtime Enterprise Web Application
type: application
version: 1.0.0
appVersion: "2.1.0"

Isi file values.yaml:

replicaCount: 3

image:
  repository: registry.internal.net/enterprise/webapp
  pullPolicy: IfNotPresent
  tag: "2.1.0"

imagePullSecrets: 
  - name: regcred

service:
  type: ClusterIP
  port: 80
  targetPort: 8080

ingress:
  enabled: true
  className: "nginx"
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  hosts:
    - host: app.enterprise.com
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 75

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

Isi file templates/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "enterprise-webapp.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "enterprise-webapp.name" . }}
    helm.sh/chart: {{ include "enterprise-webapp.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  strategy:
    type: {{ .Values.strategy.type }}
    rollingUpdate:
      maxSurge: {{ .Values.strategy.rollingUpdate.maxSurge }}
      maxUnavailable: {{ .Values.strategy.rollingUpdate.maxUnavailable }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "enterprise-webapp.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "enterprise-webapp.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      containers:
        - name: webapp
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: {{ .Values.service.targetPort }}
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /healthz
              port: http
            initialDelaySeconds: 15
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: http
            initialDelaySeconds: 5
            periodSeconds: 5
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

Langkah 2: Setup ArgoCD Application Manifest

Buat file argocd-application.yaml untuk mendaftarkan chart Helm ke ArgoCD:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-webapp-prod
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
  
    repoURL: 'https://github.com/enterprise/infrastructure-gitops.git'
    targetRevision: HEAD
    path: helm-charts/enterprise-webapp
    helm:
      valueFiles:
        - values.yaml
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas

Terapkan manifest aplikasi ArgoCD ke kluster:

kubectl apply -f argocd-application.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah parameter paling krusial yang menjamin tercapainya zero-downtime:

  1. maxSurge: 1 dan maxUnavailable: 0 pada Deployment Strategy:

    • Parameter maxUnavailable: 0 memastikan bahwa tidak ada satu pun pod lama yang dimatikan sebelum pod baru berhasil dibuat dan berada dalam status Ready. Ini adalah kunci utama ketersediaan layanan mutlak.
    • Parameter maxSurge: 1 mengizinkan pembuatan 1 pod tambahan melebihi replicaCount saat proses rolling update berlangsung.
  2. Readiness Probe & Liveness Probe:

    • readinessProbe memberitahu Kubernetes kapan pod siap menerima lalu lintas HTTP dari Ingress Nginx. Jika endpoint /ready mengembalikan status selain 200 OK, Kubernetes akan menghentikan pengiriman traffic ke pod tersebut tanpa mematikan prosesnya.
    • livenessProbe mendeteksi apakah aplikasi mengalami kebuntuan (deadlock). Jika gagal berulang kali, Kubernetes akan melakukan restart otomatis pada pod.
  3. Automated Sync Policy dengan selfHeal: true:

    • Memastikan bahwa jika ada insinyur infrastruktur yang secara tidak sengaja atau darurat mengubah parameter langsung di kluster (kubectl scale atau kubectl edit), ArgoCD akan mendeteksi perbedaan tersebut (drift) dan secara otomatis mengembalikannya ke kondisi yang didefinisikan di Git.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam skenario penanganan lonjakan lalu lintas tinggi (high concurrency), misalnya event Flash Sale e-commerce dengan 100.000 request per detik (RPS):backend Go dioptimalkan dengan koneksi pool database MySQL/MariaDB yang stabil serta caching Redis terdistribusi.

Ketika versi baru aplikasi dirilis melalui Git push:

  1. ArgoCD menarik pembaruan citra kontainer (image tag v2.1.0).
  2. Kubernetes membuat 1 pod baru (maxSurge: 1).
  3. Nginx Ingress Controller terus meneruskan traffic ke 3 pod lama sambil pod ke-4 (v2.1.0) melakukan warm-up dan koneksi awal ke Redis serta MySQL.
  4. Setelah /ready mengembalikan HTTP 200 OK, Ingress secara otomatis memasukkan pod baru ke dalam pool load balancing dan mulai mencopot pod lama secara bertahap tanpa satupun dropped connection (Error 502/504).

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Menggunakan Tag latest pada Citra Kontainer Produksi.

    • Dampak: ArgoCD tidak dapat mendeteksi perubahan jika tag tidak berubah, dan rollback menjadi mustahil dilakukan secara deterministik.
    • Solusi: Selalu gunakan immutable semantic versioning tags (misalnya v1.2.3 atau SHA commit git).
  • Anti-Pattern 2: Tidak Mengatur readinessProbe dengan Benar.

    • Dampak: Pod baru langsung menerima traffic sebelum koneksi database atau cache siap, menyebabkan lonjakan Error 500.
    • Solusi: Pastikan endpoint /ready memvalidasi koneksi ke MySQL/MariaDB dan Redis sebelum merespons HTTP 200.
  • Anti-Pattern 3: Menyimpan Kredensial Sensitif Plain Text di Git Chart.

    • Dampak: Kebocoran data rahasia (secret leakage) jika repositori bersifat publik atau diretas.
    • Solusi: Integrasikan ArgoCD dengan External Secrets Operator atau SOPS (Secrets OPerationS) untuk enkripsi data sensitif langsung di Git.

9. Benchmark, Metrik Kinerja & Tuning Performa

Lakukan pengujian beban (load testing) menggunakan perangkat k6 atau wrk selama proses rolling update sedang berjalan untuk memastikan stabilitas latensi.

Contoh skrip pengujian k6 sederhana (load-test.js):

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

export const options = {
  stages: [
    { duration: '2m', target: 500 }, // Naik hingga 500 virtual users
    { duration: '5m', target: 500 }, // Tahan beban selama proses deployment
    { duration: '2m', target: 0 },   // Turunkan beban
  ],
};

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

Jalankan perintah benchmark:

k6 run load-test.js

Metrik keberhasilan: Tingkat keberhasilan request (success rate) harus berada di angka 100% (status is 200) meskipun proses sinkronisasi ArgoCD dan rolling update sedang berlangsung di kluster Kubernetes.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis arsitektur ini ke lingkungan produksi tingkat enterprise, pastikan checklist berikut telah terpenuhi:

  • Repositori Git dilindungi dengan Branch Protection Rules dan aturan Pull Request Review.
  • Semua chart Helm menggunakan version pinning yang ketat.
  • Konfigurasi livenessProbe dan readinessProbe terpasang pada setiap pod aplikasi web.
  • Strategi maxUnavailable: 0 diterapkan untuk mencegah penurunan kapasitas layanan.
  • ArgoCD dikonfigurasi dengan otentikasi berbasis RBAC (Role-Based Access Control) terintegrasi SSO perusahaan.
  • Pemantauan metrik kluster terhubung dengan Prometheus & Grafana untuk visualisasi performa real-time.

Dengan mengintegrasikan ArgoCD dan Helm Chart modular secara disiplin, organisasi Anda tidak hanya mencapai otomatisasi rilis yang andal, tetapi juga membangun fondasi infrastruktur cloud-native yang tangguh, aman, dan siap menghadapi beban konkurensi tinggi tanpa celah downtime.

🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server