Mempersiapkan image di registry: docker tag dan push, imagePullSecrets untuk registry privat, memilih model satu-pod untuk Nginx dan PHP-FPM, serta memasang readiness dan liveness probe agar kubelet tahu kondisi container

Image Laravel produksi sudah jadi di episode 8. Sekarang kita mempersiapkan dua hal yang membuat image itu siap dipakai Kubernetes: menaruhnya di registry yang bisa dijangkau cluster, dan menyatakan kapan Pod layak menerima traffic lewat probe.
Mengapa bagian ini penting bagi shared storage? Karena probe menentukan kapan Pod "siap" — dan Pod yang siap akan mulai membaca/menulis volume RWX bersama. Kubelet menilai kesehatan probe terhadap waktu startup dan saat mount volume. Understanding yang salah di sini berujung pada Pod yang menghabiskan hidupnya dalam status CrashLoopBackOff atau tidak menerima traffic.
Build image lalu beri tag yang konsisten (semantic versioning membantu episode 22):
docker tag ghcr.io/<user>/laravel-media:1.0.0 ghcr.io/<user>/laravel-media:1.0.0
docker push ghcr.io/<user>/laravel-media:1.0.0Jika registry private, buat Secret registry-credentials agar cluster bisa menarik image. Untuk GHCR:
kubectl create secret docker-registry registry-credentials \
--docker-server=ghcr.io \
--docker-username=<user> \
--docker-password=<ghcr-token>Secret ini ditambahkan lewat imagePullSecrets pada Deployment (episode 10).
Note
Jangan pernah memasukkan token registry ke dalam Dockerfile atau .env. Pakai Secret Kubernetes — dan di episode 23 kita naikkan levelnya dengan External Secrets Operator bila tim kalian sudah besar.
Untuk aplikasi PHP, arsitektur standar: PHP-FPM melayani request PHP, Nginx melayani statik dan proxy ke FPM. Dua pilihan layout:
emptyDir untuk socket bersama.supervisord yang menjalankan keduanya dalam satu container (kurang dianjurkan — menyulitkan probe terpisah).Series ini memakai model satu Pod, dua container (atau kontainer web yang sudah penuh dari image kita yang menjalankan keduanya). Kuncinya: setiap container punya probe sendiri.
Nginx sehat bila konfigurasinya valid dan daemon berjalan. Readiness bisa memakai nginx -t atau cek HTTP ke endpoint:
readinessProbe:
exec:
command: ["nginx", "-t"]
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /nginx-health
port: 80
initialDelaySeconds: 15
periodSeconds: 10PHP-FPM sehat bila ada worker yang siap. Manfaatkan endpoint status bawaan pm.status. Aktifkan di php-fpm.conf:
pm.status_path = /statusreadinessProbe:
httpGet:
path: /status
port: 9000
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
tcpSocket:
port: 9000
initialDelaySeconds: 20
periodSeconds: 10Aturan praktis:
Important
Bedakan peran: readiness melindungi pengguna dari Pod rusak, liveness menegakkan kesehatan proses. Untuk aplikasi yang tergantung volume RWX, prepare readiness yang bergantung juga pada mount (mis. cek symlink storage ada) — ini menjamin traffic baru tidak masuk sebelum storage siap.
Pada episode 9 ini, kalian telah menyiapkan image dan probe:
Inti yang harus dibawa pulang:
docker push ke registry; private registry butuh Secret docker-registry + imagePullSecrets.nginx -t, liveness cek HTTP.pm.status /status, liveness via TCP.Di episode 10 selanjutnya kita akan menulis Deployment multi-replica dengan shared PVC: manifest lengkap, mount volume ke path storage, dan simulasi verifikasi bahwa file yang ditulis Pod A terlihat di Pod B. Sampai jumpa di episode 10!