Health checks: liveness и readiness

↑ 3.5 Инфраструктура приложения: ошибки, health checks, фоновые задачи · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Разница 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.

Практика

  1. Добавьте проверки БД и брокера в readiness.
  2. Остановите БД и понаблюдайте, как под выводится из балансировки.
  3. Настройте startupProbe для медленного старта.

Вопросы с ответами

Связанные темы