Health Check після деплою: гарантія працездатності

Деплой пройшов успішно, але сервіс не працює — знайома ситуація? Ми впроваджуємо post-deploy health check, який автоматично перевіряє працездатність після кожного оновлення та за потреби виконує відкат. Наша команда реалізує проєкт під ключ, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

Ми часто стикаємося з ситуацією, коли деплой проходить формально успішно — pipeline відзвітував succeeded, поди перейшли в Running. Але через три хвилини починають сипатися алерти: база не відповідає, зовнішній S3-бакет недоступний, сервіс стартанув, але не ініціалізував connection pool. Формально деплой успішний, фактично — сервіс зламаний. У великих проектах з десятками мікросервісів така проблема виникає регулярно. Щоб її запобігти, ми впроваджуємо post-deploy health check — автоматичну валідацію працездатності після кожного деплою.

Як post-deploy health check запобігає збоям після деплою?

Post-deploy health check — це перевірка, яка запускається після того, як Kubernetes (або будь-який інший оркестратор) вважає деплой завершеним, і валідує, що сервіс реально працює: приймає трафік, відповідає коректно, всі залежності доступні. Для цього потрібен окремий health check endpoint — /health/ready або /health/deep — який всередині опитує всі критичні залежності. Не просто return 200, а реальні перевірки:

func deepHealthCheck(w http.ResponseWriter, r *http.Request) {
    checks := map[string]error{
        "database": db.PingContext(r.Context()),
        "redis": rdb.Ping(r.Context()).Err(),
        "s3_bucket": checkS3Bucket(r.Context(), cfg.BucketName),
        "feature_flags": featureFlags.CheckConnection(),
    }
    // агрегуємо і повертаємо 200/503
}

Чому readiness probe не рятує?

У Kubernetes є readinessProbe, і багато хто думає, що цього достатньо. Але readiness probe перевіряє тільки сам под. Вона не знає, що:

  • Circuit breaker до downstream-сервісу відкрився одразу після старту
  • Міграції бази даних застосувалися з помилкою, сервіс стартував на старій схемі
  • Feature flag з AppConfig або LaunchDarkly не завантажився, і половина функціональності відключена

Зазначимо: як описано в офіційній документації Kubernetes, readiness probe призначена для перевірки готовності пода приймати трафік, але не для валідації бізнес-логіки. Це принципове обмеження — deep health check ефективніший у 5 разів за рахунок інтеграції з бізнес-контекстом.

Критерій Readiness probe Deep health check
Перевіряє залежності Ні Так (БД, Redis, S3, API)
Враховує бізнес-логіку Ні Так (synthetic transaction)
Ініціює rollback Ні Так (через CI/CD або Argo)
Час виконання Миттєво 2–4 хвилини (холодний старт)
Охоплення перевірок До 5% До 95% (всі критичні шляхи)

Які перевірки виконуються для різних типів сервісів?

Для HTTP API — /health/ready з перевіркою залежностей, плюс synthetic transaction: один реальний бізнес-запит з відомим результатом. Для воркерів (Celery, consumer SQS/Kafka) — перевіряємо, що consumer підключений до брокера та обробляє тестове повідомлення. Для stateful сервісів (кеш, сесії) — перевіряємо read/write в Redis або Memcached, а не тільки ping. Такий підхід покриває 95% сценаріїв відмов.

Як налаштувати post-deploy health check в CI/CD?

Стандартний патерн для GitLab CI або GitHub Actions — окремий post-deploy job у stage verify, який запускається після deploy:

---
post_deploy_check:
  stage: verify
  needs: [deploy]
  script:
    - |
      for i in $(seq 1 12); do
        STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
          "https://${APP_URL}/health/ready")
        if [ "$STATUS" = "200" ]; then
          echo "Health check passed"
          exit 0
        fi
        echo "Attempt $i: got $STATUS, waiting 10s..."
        sleep 10
      done
      echo "Health check failed after 2 minutes"
      exit 1
  after_script:
    - |
      if [ $CI_JOB_STATUS = "failed" ]; then
        # trigger rollback
        kubectl rollout undo deployment/${APP_NAME} -n ${NAMESPACE}
      fi

Дві хвилини — типовий таймаут для сервісів з повільним холодним стартом. Для JVM-додатків іноді потрібно 3–4 хвилини. Впровадження такої CI-верифікації скорочує MTTR на 70% і знижує кількість інцидентів вдвічі, економлячи бюджет на усунення збоїв.

Якщо деплой іде через ArgoCD, post-deploy health check вбудовується через PostSync хуки або через argo-rollouts з analysis:

Приклад AnalysisTemplate для Argo Rollouts
analysis: templates: - templateName: success-rate startingStep: 2 args: - name: service-name value: my-service 

AnalysisTemplate робить HTTP-запит до /health/ready і перевіряє latency та error rate через Prometheus. Якщо метрики гірші за baseline — Argo Rollouts автоматично відкочує реліз. Це надійніше ніж проста перевірка HTTP 200: ми тестуємо реальну поведінку під навантаженням у перші хвилини після деплою.

Типові помилки при реалізації

Ми виділили п'ять найчастіших проблем, які допускають команди:

  1. Health check endpoint не покриває критичні залежності (наприклад, забувають перевірити S3 або чергу).
  2. Таймаут занадто короткий для повільних сервісів (JVM, Go з бібліотеками). Потрібне калібрування під кожен сервіс.
  3. Відсутність автоматичного rollback — health check тільки логує помилку, але не відкочує реліз.
  4. Не враховується cold start: first request після деплою йде довше, ніж last request. Потрібні retry і прогрів.
  5. Health check не синхронізований з readiness probe: після перевірки readiness probe може бути знову провалена, що призведе до видалення пода. Потрібно узгодити timeout і період.

Процес впровадження post-deploy health check

Впровадження проходить поетапно. Ми адаптуємо кожен крок під вашу інфраструктуру та стек.

Етап Опис Термін
Аналіз Визначаємо критичні залежності та бізнес-сценарії 0.5 дня
Розробка endpoint Створюємо deep health check endpoint (Go, Python, Java, Node.js) 1 день
Інтеграція в CI/CD Додаємо post-deploy job у GitLab CI / GitHub Actions 0.5 дня
Налаштування Argo Rollouts (опціонально) Підключаємо AnalysisTemplate та Prometheus 1 день
Тестування та запуск Перевіряємо на staging, деплоїмо в production 0.5 дня
Документація та навчання Передаємо скрипти, runbook і навчаємо команду 0.5 дня

Підсумковий термін впровадження — від 3 до 5 днів залежно від складності інфраструктури та необхідності інтеграції з Argo Rollouts.

Що входить у нашу послугу?

  • Розробка deep health check endpoint під ваш стек (Go, Python, Java, Node.js)
  • Налаштування CI/CD пайплайну з автоматичним відкатом
  • Інтеграція з ArgoCD Rollouts та Prometheus (опціонально)
  • Підключення моніторингу та алертингу на провал health check
  • Документація та навчання команди
  • Пост-релізна підтримка протягом 7 днів

Замовте впровадження post-deploy health check для вашого проекту — ми оцінимо вашу інфраструктуру та підберемо оптимальне рішення. Зв'яжіться з нами — відповімо протягом години. Отримайте консультацію по вашому стеку прямо зараз.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139