Belajar Kubernetes Block Storage RWO - CI/CD & GitOps untuk Aplikasi + DB
Episode 23 of 28

Belajar Kubernetes Block Storage RWO - CI/CD & GitOps untuk Aplikasi + DB

Menyatukan storage dengan alur deployment modern: pipeline CI/CD untuk image Laravel, GitOps dengan Argo CD/Flux untuk manifest aplikasi dan database, job migrasi sebagai gerbang deploy, dan injeksi secret via External Secrets Operator.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Storage kita sudah andal, dimonitor, dan bisa di-maintenance (episode 17-22). Episode 23 menutup lingkaran dengan alur pengiriman: bagaimana aplikasi + database dikelola secara modern lewat CI/CD dan GitOps.

Mengapa penting? Storage yang hebat tidak berharga jika deployment aplikasi manual dan rawan salah. GitOps menjadikan seluruh konfigurasi — termausk volume, StorageClass, dan StatefulSet DB — sebagai kode yang di-version control, ter-review, dan otomatis disinkronkan ke cluster.

Pipeline DevOps

Build Image Laravel → Registry → Deploy

Alur pipeline (GitHub Actions/GitLab CI) yang umum:

  1. Test: unit & integration (tanpa DB nyata, gunakan SQLite/mock).
  2. Build image Laravel.
  3. Push ke registry (GHCR/Docker Hub).
  4. Update image tag di manifest (Helm values atau GitOps repo).
yaml
# contoh pipeline (GitHub Actions) — hanya bagian inti
jobs:
  deploy:
    steps:
      - run: docker build -t ghcr.io/org/laravel-app:${{ github.sha }} .
      - run: docker push ghcr.io/org/laravel-app:${{ github.sha }}
      - run: ./update-manifest.sh ${{ github.sha }}

Update StatefulSet DB Jarang

StatefulSet database (episode 6) tidak berubah setiap deploy. Image DB diganti hanya saat upgrade PostgreSQL versi/patch — dan itu pun melalui proses review yang hati-hati. Jangan ikut-ikut "redeploy semua" — database adalah komponen yang stabil.

GitOps (Argo CD/Flux)

Manifest Aplikasi + DB di Repo Git

Seluruh struktur environment ada di git:

text
gitops/
  apps/
    laravel/
      deployment.yaml
      service.yaml
      configmap.yaml
  stateful-db/
    postgres-sts.yaml
    postgres-svc.yaml
  storage/
    storageclass-longhorn-ha.yaml
    pvc-postgres.yaml

Reconcile Otomatis

Argo CD/Flux memantau repo:

  • Perubahan ditarik & di-applied ke cluster.
  • Drift antara cluster dan repo otomatis di-heal (kembali ke desired state).
  • Jika seseorang kubectl edit manual, GitOps mengembalikan.

Keamanan GitOps untuk DB

  • StatefulSet DB berada di repo yang sama — setiap perubahan direview via PR.
  • Pemisahan env: apps/, db/, storage/ dengan perannya masing-masing.
  • allowVolumeExpansion di StorageClass dikelola di repo — jadi tidak mudah diubah.

Migration pada Deploy

Job Migrate Sebelum Rollout

Urutan yang benar saat ada perubahan migrasi schema:

text
PR deploy →
  1. Job `php artisan migrate --force`  (terapkan schema)
  2. Sukses → rollout Deployment Laravel
  3. Gagal → abort (jangan lanjut)

Policy: Jangan Lanjut Jika Gagal

Di Argo CD, kalian bisa memakai PreSync hook untuk menjalankan migrasi dan menghentikan sync jika gagal:

yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laravel
spec:
  syncPolicy:
    automated: {}
  # Job migrate sebagai PreSync hook (merupakan resource di repo)

Plikasi praktis: Job dijalankan sebelum rollout; jika exit code non-zero, sync gagal total. Ini mencegah aplikasi baru berjalan di schema lama (atau gagal total karena schema belum ada).

Secret Injection

External Secrets Operator / Vault

Jangan menaruh DB password & APP_KEY langsung di manifest. Integrasikan store rahasia:

yaml
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-secret
spec:
  secretStoreRef:
    name: vault
    kind: SecretStore
  target:
    name: db-secret      # Secret di cluster yang dibuat otomatis
  data:
    - secretKey: username
      remoteRef:
        key: database/postgres
        property: username
    - secretKey: password
      remoteRef:
        key: database/postgres
        property: password

Setiap perubahan di vault otomatis mensinkronkan Secret — rotasi kredensial tanpa rollout.

Tip

Perlakukan StorageClass & manifest DB seperti kode aplikasi: tunduk pada PR review dan history git. Lindungi branch, beri approval untuk perubahan CRD storage — karena satu salah edit StorageClass bisa membuat semua PVC baru Pending.

Penutup

Inti yang harus dibawa pulang:

  • Pipeline CI: build image Laravel → push registry → update manifest; DB tidak ikut final setiap deploy.
  • GitOps (Argo CD/Flux) mengelola manifest app + DB dari repo; drift auto-healed.
  • Job migrate --force sebagai PreSync gate — gagal = stop deploy.
  • Secret dikelola External Secrets Operator/Vault — bukan literal di manifest.

Di episode 24 selanjutnya kita akan membahas backup automation & RTO/RPO drift — RecurringBackup CRD, integrasi Velero untuk resource + volume, mengukur RPO nyata, dan melakukan uji DR tahunan untuk membuktikan pemulihan. Sampai jumpa di episode 24!

Belajar Kubernetes Block Storage RWO - CI/CD & GitOps untuk Aplikasi + DB | Belajar Kubernetes Block Storage RWO