Belajar Kubernetes Simple Shared Storage - Deploy Aplikasi Laravel + Build Image
Episode 10 of 28

Belajar Kubernetes Simple Shared Storage - Deploy Aplikasi Laravel + Build Image

Merakit seluruh komponen: membangun image Laravel production dan push ke registry, menulis Deployment dengan volume RWX untuk media, menjalankan migrasi database via Job, dan melakukan uji end-to-end upload hingga tampil antar Pod

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

Pendahuluan

Semua bahan sudah di meja: StorageClass RWX (episode 5), NFS server per-PVC (episode 6), PostgreSQL di Local PV (episode 8), dan pemahaman volume (episode 7). Episode 10 merakit semuanya menjadi satu aplikasi yang berjalan penuh: Laravel + Nginx + PostgreSQL + media RWX dengan pipeline build image sendiri.

Ini adalah episode "full stack" dalam arti sesungguhnya — dari kode sampai ke server.

Build Container Image

Gunakan Dockerfile multi-stage sederhana untuk Laravel:

Dockerfile
FROM composer:2 AS builder
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist --no-interaction
COPY . .
RUN composer dump-autoload --optimize
 
FROM php:8.3-fpm AS runtime
RUN apt-get update && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_pgsql \
    && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app /var/www
WORKDIR /var/www
RUN mkdir -p storage/app/public && chown -R www-data:www-data /var/www
USER www-data
 
FROM nginx:1.27-alpine AS web
COPY nginx-default.conf /etc/nginx/conf.d/default.conf
COPY --from=runtime /var/www/public /var/www/public

Build dan push:

Build dan push image
docker build -t ghcr.io/<user>/laravel-media:1.0.0 .
docker push ghcr.io/<user>/laravel-media:1.0.0

Kelas Deployment Aplikasi

Tiga lapis manifest:

  1. Deployment Laravelreplicas: 3, volume RWX untuk media (episode 7).
  2. Nginx Ingress — host aplikasi → Service laravel (episode 11 berikutnya).
  3. PostgreSQL StatefulSet — di Local PV (episode 8).
KubernetesApply lapisan aplikasi
kubectl apply -f pvc-media-storage.yaml
kubectl apply -f deployment-laravel.yaml
kubectl apply -f statefulset-postgres.yaml
kubectl get pod -l app=laravel -o wide
kubectl get pod -l app=postgres

Migrations

Migrasi database dijalankan lewat Job — sekali, simetris, tanpa race:

job-migrate.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: laravel-migrate
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: migrate
          image: ghcr.io/<user>/laravel-media:1.0.0
          command: ["php", "artisan", "migrate", "--force"]
KubernetesJalankan migrasi dan tunggu selesai
kubectl apply -f job-migrate.yaml
kubectl wait --for=condition=complete job/laravel-migrate --timeout=180s
kubectl logs job/laravel-migrate

Important

Urutan menyelamatkan sistem: verifikasi Postgres Ready, jalankan migrasi sampai complete, baru biarkan traffic masuk lewat Ingress. Menerapkan aplikasi sebelum database siap = 500 saat dibuka pertama.

E2E Test

Akses aplikasi dan uji alur utama:

Akses homepage
curl -I http://<ingress>/ -H "Host: laravel.example.com"

Upload gambar via UI/curl dan verifikasi muncul di Pod lain:

Upload dan verifikasi lintas Pod
curl -F "photo=@/tmp/foto.jpg" https://laravel.example.com/api/upload
kubectl exec deploy/laravel -- ls /var/www/storage/app/uploads/

File foto.jpg harus tampak dari Pod mana pun — membuktikan pipeline media RWX bekerja end-to-end.

Tip

Jika I/O mencurigakan lambat saat upload besar, periksa client_max_body_size di nginx (episode 11/ingress) dan lihat metrik I/O backing Local PV (episode 18).

Penutup

Pada episode 10 ini, aplikasi lengkap telah berjalan:

Inti yang harus dibawa pulang:

  • Dockerfile multi-stage: builder composer → runtime FPM → web Nginx.
  • Build & push image ke registry (GHCR/registry privat).
  • Layer manifest: Deployment RWX + Ingress + PostgreSQL Local PV.
  • Migrasi via Job + kubectl wait sebelum traffic masuk.
  • E2E: upload via curl → file terlihat dari semua replica.

Di episode 11 selanjutnya kita akan mengamankan jalur network dan port: port yang dipakai CSI dan NFS Server Pod, NetworkPolicy untuk membatasi mount NFS, Ingress ke Laravel, dan TLS untuk HTTPS. Sampai jumpa di episode 11!

Belajar Kubernetes Simple Shared Storage - Deploy Aplikasi Laravel + Build Image | Belajar Kubernetes Simple Shared Storage