В Kubernetes есть два типа проверок. Liveness probe отвечает на вопрос: "сервис ещё жив или завис?". Если не отвечает — Kubernetes убивает и перезапускает под. Readiness probe: "сервис готов принимать трафик?". Если не ready — под убирается из балансировщика, но не перезапускается.
На практике это разные эндпоинты с разной логикой:
// liveness — сервис работает, не завис
http.HandleFunc("/livez", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) // если ответил — жив
})
// readiness — готов к трафику
http.HandleFunc("/readyz", func(w http.ResponseWriter, r *http.Request) {
if !dbReady || !cacheReady {
w.WriteHeader(http.StatusServiceUnavailable)
return
}
w.WriteHeader(http.StatusOK)
})
Типичный сценарий: при старте сервис liveness-ready сразу, а readiness — только после прогрева кеша и проверки коннекта к БД. Ошибка новичков — делать liveness слишком умным, проверяя БД. Если БД лежит — перезапуск пода не поможет, а только добавит нагрузку.