Жизненный цикл пода — Graceful Shutdown, Probes и Requests/Limits
Почему бывают 502 при rollout, как настроить preStop sleep, Liveness vs Readiness и не застрелить прод жадными healthcheck’ами и CPU throttling.
Содержание
Жизненный цикл пода — Graceful Shutdown, Probes и Requests/Limits
Три связанных темы из канала: «красивый уход», healthchecks и ресурсы.
Graceful Shutdown
При остановке: SIGTERM → ждём terminationGracePeriodSeconds (дефолт 30с) → SIGKILL.
Код: на SIGTERM перестать принимать новые запросы → дождаться текущих → закрыть БД/очереди → exit 0.
Race в K8s: SIGTERM и снятие из Endpoints асинхронны — Ingress ещё шлёт трафик, а приложение уже закрыло порт → 502.
preStop sleep (best practice):
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 5"]За 5–10 секунд балансировщик успевает убрать под из ротации, затем приходит SIGTERM. terminationGracePeriodSeconds — с запасом под длинные запросы (например 60).
Liveness vs Readiness
Probe | Вопрос | При сбое | Что проверять |
|---|---|---|---|
Liveness | Я жив? | Рестарт | Лёгкий |
Readiness | Готов к трафику? | Убрать из Service | БД, кэш, зависимости |
Слабый чек («порт открыт») → зомби отдаёт 500. Жадный чек (БД+Redis+S3 в liveness) → каскадный рестарт всех подов при деградации БД.
livenessProbe:
httpGet: { path: /health/live, port: 8080 }
periodSeconds: 10
readinessProbe:
httpGet: { path: /health/ready, port: 8080 }
failureThreshold: 3Requests vs Limits
- Requests — гарантия для scheduler.
- Limits RAM — OOMKill при превышении.
- Limits CPU — throttling (тормоза без явных ошибок).
QoS:
- Guaranteed — requests = limits;
- Burstable — requests < limits;
- BestEffort — без ресурсов (первые под нож).
Практика: Memory requests == limits; CPU requests честные, limits осторожно (иногда не ставят, чтобы не троттлить пики).
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "512Mi"Чек-лист деплоя
- SIGTERM в коде
- preStop sleep
- Раздельные live/ready
- Честные resources / QoS
Связано: Troubleshooting, Autoscaling.