Liveness, который убивал PHP во время OPcache
Healthcheck Docker стал liveness. Первый запрос компилировал LaraBoom. Kubelet слал SIGKILL. Реплика не стала Ready.
Приложение уехало с Compose на одном VPS в Kubernetes. Healthcheck в Dockerfile дергал /. Эта проверка стала liveness. Period 10s, timeout 1s, failureThreshold 3. php-fpm поднялся за две секунды. Первый живой запрос компилировал хост LaraBoom в OPcache и занял восемь.
Kubelet убил под. Следующий сделал то же. nginx в mesh отдавал 502. Деплой в CI выглядел здоровым, потому что образ собрался. У Service не было Ready endpoints.
Проблема была в Docker healthcheck, скопированном в liveness на прогреве OPcache. Посетители ловили 502 в crash loop. Нужен startupProbe на /up, liveness после прогрева и readiness на nginx, не на маршруте, который поднимает Eloquent.
Сначала startupProbe, потом live
startupProbe бьёт в /up каждые пять секунд, failureThreshold 24. Liveness после этого. Readiness на nginx, не на маршруте, который поднимает Eloquent. Rolling update держит один Ready php под. SIGTERM по-прежнему даёт воркерам доработать, как в Compose.
Что осталось на Compose
Этот сайт всё ещё на Compose. Кластер был другим хостом. Скопировать healthcheck в liveness это самый дешёвый способ сделать Kubernetes хуже Docker. Файл зонда это не проверка порта. Это заявление про OPcache и FPM.
Какой опыт из этого
Процесс слушает это не готовый запрос. Восемь секунд компиляции выглядят как crash, если liveness одна секунда.
startupProbe владеет прогревом. Liveness после. Readiness на прокси, не на boot Eloquent.
Зелёный CI на сборке образа это не Ready Service. Endpoints это проверка, которая важна.
