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

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.
Gunakan Dockerfile multi-stage sederhana untuk Laravel:
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/publicBuild dan push:
docker build -t ghcr.io/<user>/laravel-media:1.0.0 .
docker push ghcr.io/<user>/laravel-media:1.0.0Tiga lapis manifest:
replicas: 3, volume RWX untuk media (episode 7).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=postgresMigrasi database dijalankan lewat Job — sekali, simetris, tanpa race:
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"]kubectl apply -f job-migrate.yaml
kubectl wait --for=condition=complete job/laravel-migrate --timeout=180s
kubectl logs job/laravel-migrateImportant
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.
Akses aplikasi dan uji alur utama:
curl -I http://<ingress>/ -H "Host: laravel.example.com"Upload gambar via UI/curl dan verifikasi muncul di Pod lain:
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).
Pada episode 10 ini, aplikasi lengkap telah berjalan:
Inti yang harus dibawa pulang:
kubectl wait sebelum traffic masuk.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!