Health checks: liveness и readiness
↑ 3.5 Инфраструктура приложения: ошибки, health checks, фоновые задачи · ← Предыдущая · → Следующая
Зачем это на собесе
Разница liveness/readiness и что проверять — базовый вопрос для Kubernetes и DevOps.
Объяснение
| Проба | Вопрос | Реакция оркестратора |
|---|---|---|
| Liveness | процесс жив, не завис? | перезапустить контейнер |
| Readiness | готов принимать трафик? | убрать из балансировки |
| Startup | закончил ли запуск? | подождать, не убивать |
builder.Services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy(), tags: ["live"])
.AddNpgSql(cs, tags: ["ready"])
.AddRedis(redis, tags: ["ready"])
.AddKafka(kafkaCfg, tags: ["ready"]);
app.MapHealthChecks("/health/live", new() { Predicate = r => r.Tags.Contains("live") });
app.MapHealthChecks("/health/ready", new() { Predicate = r => r.Tags.Contains("ready") });livenessProbe: { httpGet: { path: /health/live, port: 8080 }, periodSeconds: 10 }
readinessProbe: { httpGet: { path: /health/ready, port: 8080 }, periodSeconds: 5 }Нюансы и подводные камни
- Liveness не должен проверять внешние зависимости: падение БД не должно приводить к перезапуску всех подов (каскад).
- Readiness с тяжёлыми проверками нагружает зависимости; кэшируйте результат.
- Не публикуйте подробности health-check наружу.
- Задавайте таймауты проверкам.
- Для деградации используйте статус
Degraded.
Практика
- Добавьте проверки БД и брокера в readiness.
- Остановите БД и понаблюдайте, как под выводится из балансировки.
- Настройте
startupProbeдля медленного старта.
Вопросы с ответами
Liveness или readiness?
Liveness — «перезапусти меня», readiness — «пока не присылай трафик».
Что нельзя проверять в liveness?
Внешние зависимости: их сбой вызовет ненужные перезапуски.
Зачем startup probe?
Даёт медленно стартующему приложению время, не убивая его liveness-пробой.