Mengeraskan seluruh arsitektur untuk produksi: memindahkan .env Laravel ke ConfigMap dan Secret, menerapkan security checklist dari ekspor NFS hingga Pod Security admission, operational checklist storage, serta menulis runbook dan dokumentasi tim

Semua komponen sudah ada: storage, aplikasi, probe, HA, backup, pipeline. Praktik yang tersisa adalah yang paling—ironisnya—sering dilupakan: mengeraskan sistem. Episode 23 merangkum kebiasaan-kebiasaan kecil yang membedakan lab dari produksi, dan menyusunnya menjadi checklist yang bisa langsung ditandatangani.
Dua target utama: keamanan (Config/Secret, ekspor NFS, admission) dan operasional (resource limits, kesehatan, runbook).
Laravel butuh .env — di Kubernetes, tidak ada file .env. Semua variabel didistribusikan sebagai objek:
kubectl create configmap laravel-config \
--from-literal=APP_ENV=production \
--from-literal=FILESYSTEM_DISK=public \
--from-literal=REDIS_HOST=redis.default.svc.cluster.local
kubectl create secret generic laravel-secrets \
--from-literal=APP_KEY=base64:.... \
--from-literal=DB_PASSWORD=.... \
--from-literal=REDIS_PASSWORD=....Pasang ke Deployment sebagai env:
containers:
- name: laravel-web
envFrom:
- configMapRef:
name: laravel-config
- secretRef:
name: laravel-secretsJangan ever commit .env ke git; jangan tempel di Dockerfile (episode 8). Untuk skala tim lebih besar, gunakan External Secrets Operator / Vault agar Secret Kubernetes sendiri dikelola terpusat.
Tip
Uji pemisahan ini! Hapus Secret lalu restart Pod — aplikasi harus jelas gagal tanpa kredensial, dan tidak boleh ada jejak .env yang tersisa di image.
Mengikuti konvensi keamanan:
/etc/exports, bukan * (episode 13).all_squash + anonuid — untuk produksi, kecuali alasan kuat memakai no_root_squash.sec=krb5p bila jaringan tak tepercaya (episode 15).resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Girestricted/baseline untuk namespace aplikasi agar container berjalan non-root dan tanpa privilege mencolok.kubectl label ns default pod-security.kubernetes.io/enforce=baselineWarning
PSA level restricted melarang gambar berjalan sebagai root dan beberapa syscall. Image kita sudah USER www-data (episode 8) — kalian tinggal menyelaraskan fsGroup, runAsUser, dan allowPrivilegeEscalation: false di securityContext Deployment.
Yang membuat sistem tetap hidup hari ke hari:
/healthz di probe, episode 9) dan prompt health NFS (episode 18).PersistentVolumeClaimPending (episode 18).du -sh mingguan), alert di 70% kapasitas, expand sebelum 85% (episode 16).Dokumentasi yang baik adalah fitur. Susun runbook untuk skenario utama:
chown yang aman.Tempatkan runbook di knowledge base internal (wiki/confluence/git). Sertakan: topologi terkini (diagram dari episode 27), kredensial non-sensitif, dan kontak on-call.
Pada episode 23 ini, arsitektur kalian telah berubah menjadi produksi-grade:
Inti yang harus dibawa pulang:
.env Laravel → ConfigMap (non-rahasia) + Secret (rahasia); opsional External Secrets/Vault.all_squash, LUKS, resource limits, Pod Security admission.Di episode 24 selanjutnya kita akan memeriksa troubleshooting & common issues: PVC pending, mount failed, permission denied, NFS hang, dan data tak terlihat antar replica — berikut alur diagnostik untuk tiap kasus. Sampai jumpa di episode 24!