Deployment Laravel di Kubernetes membutuhkan observabilitas menyeluruh dan mekanisme rollback otomatis agar tim DevOps dapat bereaksi cepat saat metrik menunjukkan degradasi. Artikel ini langsung menjelaskan bagaimana menyiapkan metrik, log, tracing Laravel; memvalidasi sebelum deployment; mengotomatiskan pipeline; serta memicu rollback berbasis alert yang relevan.
1. Observabilitas Laravel yang terintegrasi dengan Kubernetes
Laravel sendiri tidak memancarkan metrik secara default, jadi pada deployment ke Kubernetes perlu menambahkan endpoint yang bisa dikumpulkan Prometheus dan tool observasi lainnya. Pendekatan praktis adalah menambahkan route internal (misalnya /metrics) yang menggunakan library metric collector seperti promphp/laravel-prometheus-exporter atau implementasi manual yang membaca counter dari cache.
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Route;
Route::get('/metrics', function () {
$requests = Cache::get('metric:requests', 0);
return response()->stream(function () use ($requests) {
echo "laravel_requests_total $requests\n";
}, 200, ['Content-Type' => 'text/plain']);
});
Letakkan route ini di middleware group internal saja agar tidak terekspos ke publik. Di Kubernetes, tambahkan ServiceMonitor (jika menggunakan Prometheus Operator) yang men-scrape endpoint tersebut secara berkala. Gunakan label khusus untuk membedakan metric Laravel dan sistem lainnya.
Untuk log, pastikan Laravel mengirimkan output ke stdout dan stderr. Gunakan LOG_CHANNEL=stderr dan aktivitas penting (SQL error, exception, job failure) cukup dengan contextual data seperti trace id. Pada sisi Kubernetes, tools seperti Fluent Bit/Elastic Fluentd bisa mengumpulkan log container dan menambahkan metadata seperti nama namespace, pod, dan container.
Tracing distribusi bisa memakai OpenTelemetry atau Sentry. Instrumentasi HTTP client dan queue worker dapat mencatat span menggunakan middleware di app/Http/Middleware dan job traits. Pastikan trace id diteruskan ke logs agar Anda bisa korelasi span dengan log jika terjadi insiden.
2. Checklist Pra-deploy
Sebelum Kubernetes memulai rolling update, lakukan pengecekan otomatis:
- Validasi konfigurasi: Gunakan
kubevalataukubectl apply --dry-run=clientuntuk memeriksa schema Deployment/Service manifest. - Environment parity: Jalankan job CI yang mengeksekusi
php artisan migrate --pretenddanphp artisan testdi container berbasis image yang akan dideploy. - Health checks: Deployment manifest harus memiliki readiness dan liveness probe. Misalnya readiness memanggil
/health/readinessyang memvalidasi koneksi database, cache, dan queue default. - Feature flags: Jika ada fitur besar, lapisan feature flag (misalnya menggunakan
spatie/laravel-launchpad) membantu menurunkan risiko dengan mengaktifkan fase per fase.
Gunakan initContainers atau job pre-deploy untuk memvalidasi secret rotation dan memastikan config:cache sudah dijalankan.
3. Pipeline Deployment dan Automasi
Pilih pipeline CI/CD yang mengemas image dan menerapkan deployment dengan strategi yang sesuai. Contoh alur sederhana:
- CI builds container image dengan
composer install --no-dev,php artisan config:cache, dandocker push. - CD menjalankan lint manifest, memvalidasi
kustomization, lalu menerapkan ke cluster staging dengankubectl apply. - Setelah rollout, script menunggu readiness dengan command seperti
kubectl rollout status deployment/laravel-api.
Untuk Laravel queue worker, kelola lewat Deployment terpisah dengan podDisruptionBudget agar satu worker tetap berjalan saat update.
4. Trigger Rollback Otomatis Berdasarkan Metrik
Rollback otomatis sebaiknya didasarkan pada metrik yang benar-benar menunjukkan masalah bisnis atau kesehatan aplikasi. Contoh metrik kritis: error rate, latency response API utama, atau failure rate job queue. Berikut pendekatan praktis:
- Tambahkan alert Prometheus, misalnya jika error rate > 5% selama 5 menit atau
http_request_duration_seconds> threshold. - Hubungkan alert dengan webhook yang memicu job rollback (konteks: Argo Rollouts atau simple script yang menjalankan
kubectl rollout undo).
Contoh alert rule pendek:
groups:
- name: laravel-alerts
rules:
- alert: LaravelErrorRateHigh
expr: increase(laravel_requests_total{status=~"5.."}[5m]) / increase(laravel_requests_total[5m]) > 0.05
for: 5m
labels:
severity: page
annotations:
summary: "Error rate melebihi 5%"
Alert ini bisa memanggil webhook yang menjalankan rollback dengan script aman:
kubectl -n production rollout undo deployment/laravel-api
Tetap pastikan alert tersebut tidak sensitif terhadap fluktuasi jangka pendek. Gunakan alert tuning agar rollback hanya terjadi untuk degradasi yang nyata.
5. Postmortem Ringan dan Pencegahan Berkelanjutan
Setiap insiden wajib diselesaikan dengan postmortem sederhana:
- Dokumentasikan apa yang terjadi, dampak, langkah perbaikan, dan penyebab akar.
- Identifikasi mitigasi: apakah alert perlu diubah, apakah deployment sudah mengaktifkan safeguard (feature flag, circuit breaker)?
Berlatih rollback secara periodik membantu tim tetap siap. Jalankan chaos kecil dengan mematikan satu pod worker di staging untuk melihat monitoring berfungsi dan rollback trigger dapat dijalankan manual. Evaluasi juga tuning alert agar tidak terlalu sensitif, dan tambahkan noise filtering (misalnya ignore spiky latency saat proses background heavy).
Tambahkan latihan simulasi rollback setidaknya sekali per kuartal agar proses otomatis tetap aman. Dokumentasi langkah rollback harus tersedia dalam buku runbook, termasuk detail alternatif jika rollback gagal (misalnya reroute traffic ke cluster cadangan).
Kesimpulan
Untuk deployment Laravel di Kubernetes, observabilitas (metrics, logs, trace) harus dibangun dari aplikasi lalu diforward ke tool monitoring. Otomatisasi pipeline dan checklist pra-deploy memastikan stabilitas; sementara alert yang memicu rollback otomatis memberi perlindungan saat ada degradasi. Postmortem sederhana, alert tuning, chaos testing, dan latihan rollback membuat tim DevOps terus belajar tanpa mengulang kesalahan yang sama.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!