Belajar Kubernetes Simple Shared Storage - CI/CD & GitOps Sederhana
Episode 21 of 28

Belajar Kubernetes Simple Shared Storage - CI/CD & GitOps Sederhana

Mengotomasi pipeline delivery: workflow CI yang membangun dan mem-push image Laravel, manifest infrastruktur storage yang ber-version dengan GitOps (ArgoCD/Flux), menyuntikkan konfigurasi StorageClass dan PVC, serta deployment otomatis ke cluster

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

Pendahuluan

Sampai episode 20, sebagian interaksi dengan cluster masih manual: kubectl apply, docker build, push. Episode 21 menutup siklus itu dengan CI/CD & GitOps: Git menjadi sumber kebenaran, pipeline membangun dan mengirim, dan cluster menarik perubahan sendiri.

Bagi tim kecil, keputusannya strategis: GitOps sederhana (semua manifest di repo + ArgoCD/Flux) memberikan jejak perubahan, rollback yang mudah, dan on-boarding yang jelas — dengan kompleksitas yang masih masuk akal.

Penyimpanan sebagai Elemen GitOps

Dalam GitOps, StorageClass & PVC adalah resources biasa — dideklarasikan di repo, direview lewat PR, dan di-deploy dengan pull model:

text
perbaikan/gitops/kubernetes/
├── storage/
│   ├── storageclass-openebs-hostpath.yaml
│   ├── storageclass-openebs-nfs-rwx.yaml
│   ├── storageclass-openebs-lvm.yaml
│   └── networkpolicy-nfs.yaml        (episode 11)
├── apps/
│   ├── laravel/
│   │   ├── pvc-media-storage.yaml
│   │   ├── deployment-laravel.yaml
│   │   └── ingress-laravel.yaml
│   └── postgres/
│       ├── statefulset-postgres.yaml
│       └── pvc-data-postgres.yaml
└── monitoring/
    └── podmonitor-openebs.yaml       (episode 18)

Kelebihan besar: perubahan StorageClass (mis. menonaktifkan kelas lama) melalui review PR, bukan perintah langsung ke cluster.

CI Pipeline

Workflow GitHub Actions untuk membangun & mem-push image:

.github/workflows/ci-docker.yml
name: Build Laravel Image
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:latest,ghcr.io/${{ github.repository }}:${{ github.sha }}

Setiap push ke main memproduksi image ter-tag dengan SHA — jejak build yang unik dan mudah di-rollback.

ArgoCD Sederhana

ArgoCD menyinkronkan folder manifest dengan cluster:

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

Daftarkan aplikasi laravel dari repo GitOps:

app-laravel.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laravel
  namespace: argocd
spec:
  project: default
source:
      repoURL: https://github.com/<org>/perbaikan-gitops
      path: kubernetes/apps/laravel
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: apps
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
KubernetesApply Application
kubectl apply -f app-laravel.yaml
kubectl -n argocd get app laravel

Note

selfHeal mengembalikan kondisi yang "dikoreksi" manual kembali ke Git — inilah filosofi GitOps: Git adalah norma, drift adalah bug. Untuk storage, aktifkan ini dengan hati-hati (StorageClass/ReclaimPolicy jangan "dikoreksi" oleh ArgoCD bila kalian ingin mengelola perubahan via Git saja).

Video Storage dalam Pipeline

Bagi pipeline aplikasi, storage adalah API standar — cukup tiga kebiasaan:

  1. PVC dideklarasikan di repo GitOps — bukan dibuat manual dengan kubectl.
  2. Reset database dimasukkan ke pipeline hanya untuk namespace development, ter-kunci dari production.
  3. Migrasi sebagai Job (episode 10) dijalankan pada tahap release — bukan main process.
Tahap release helper (digest singkat)
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Apply manifest aplikasi dari GitOps
          run: kubectl apply -k kubernetes/apps/laravel
        - name: Jalankan migrasi (Job)
          run: kubectl apply -f job-migrate.yaml && kubectl wait --for=condition=complete job/laravel-migrate

Tip

Mulailah dari ArgoCD + satu folder apps/laravel. Jangan proyek besar di awal — nilai GitOps muncul justru ketika pola sudah berjalan stabil selama dua-tiga pekan, bukan saat pertama kali dipasang.

Penutup

Pada episode 21 ini, delivery menjadi otomatis dan dapat dipertanggungjawabkan:

Inti yang harus dibawa pulang:

  • Penyimpanan (StorageClass, PVC, NetworkPolicy) adalah resources GitOps yang biasa.
  • CI: GitHub Actions membangun & push image (latest + SHA tag).
  • ArgoCD sinkronkan folder apps/* dari repo ke cluster dengan prune + selfHeal.
  • PVC dideklarasikan bukan di-script manual; migrasi = Job terpisah.
  • Mulai kecil: satu aplikasi, satu repo, ArgoCD — baru melebar setelah stabil.

Di episode 22 selanjutnya kita akan mengemas bare minimum produksi small: checklist kapasitas, keamanan, observability, backup yang wajib terpenuhi sebelum merilis, beserta estimasi risiko bila menangguhkan bagian tertentu. Sampai jumpa di episode 22!