Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Health check'и: liveness и readiness в Kubernetes

Health check'и Kubernetes: liveness, readiness и startup probe на практике

Как настраивать liveness, readiness и startup probe в Kubernetes: типы проверок, параметры, последствия сбоев и практические паттерны health check'ов.

Прямой ответ

Health check'и в Kubernetes — механизм проверки состояния приложений через liveness, readiness и startup probe (health checks — «проверки живости/готовности/запуска» — health checks — incident — «Kubernetes знает, здорово ли приложение» — health checks), зачем: Kubernetes автоматически перезапускает/исключает нездоровые поды (health checks — «под завис — перезапуск» — health checks — incident — «без health check'ов — мёртвый под работает» — health checks — k8s — «автоматическое восстановление» — health checks); типы probe (health checks): (1) Liveness probe (health checks — «жив ли под» — health checks — incident — «если не жив — перезапуск» — health checks — k8s — «liveness = жив/мёртв» — health checks — «сбой liveness → перезапуск пода» — health checks); (2) Readiness probe (health checks — «готов ли под принимать трафик» — health checks — incident — «если не готов — исключить из сервисов» — health checks — k8s — «readiness = готов/не готов» — health checks — «сбой readiness → исключить из балансировки» — health checks); (3) Startup probe (health checks — «запустился ли под» — health checks — incident — «если не запустился — перезапуск» — health checks — k8s — «startup = запустился/не запустился» — health checks — «сбой startup → перезапуск» — health checks); типы проверок (health checks — как проверять — health checks): (1) HTTP GET (health checks — «HTTP запрос к эндпоинту» — health checks — incident — httpGet: path: /health port: 8080 (health checks — «GET /health» — health checks — incident — «200-399 = здоров» — health checks); (2) TCP Socket (health checks — «TCP соединение к порту» — health checks — incident — tcpSocket: port: 3306 (health checks — «TCP к 3306» — health checks — incident — «соединение = здоров» — health checks); (3) Exec (health checks — «команда в контейнере» — health checks — incident — exec: command: [cat, /tmp/healthy] (health checks — «команда» — health checks — incident — «exit 0 = здоров» — health checks); параметры probe (health checks — настройка — health checks): initialDelaySeconds (health checks — «задержка перед первой проверкой» — health checks — incident — «дать время запуститься» — health checks), periodSeconds (health checks — «интервал проверок» — health checks — incident — «как часто проверять» — health checks), timeoutSeconds (health checks — «таймаут проверки» — health checks — incident — «сколько ждать ответа» — health checks), successThreshold (health checks — «успешных проверок для здоровья» — health checks — incident — «сколько раз подряд успеш» — health checks), failureThreshold (health checks — «неудачных проверок для сбоя» — health checks — incident — «сколько раз подряд провал» — health checks); когда health check'и: под завис (health checks — «приложение зависло» — health checks — incident — «liveness перезапустит» — health checks), под не готов (health checks — «приложение не готово» — health checks — incident — «readiness исключит» — health checks), долгий старт (health checks — «приложение долго запускается» — health checks — incident — «startup probe» — health checks); антипаттерны: liveness проверяет зависимости (health checks — «liveness проверяет БД» — health checks — incident — «БД недоступна — все поды перезапустятся» — health checks — «liveness — только себя» — health checks), readiness без graceful degradation (health checks — «readiness падает — трафик некуда» — health checks — incident — «все поды исключены» — health checks — «минимум подов» — health checks), слишком агрессивные параметры (health checks — «failureThreshold=1» — health checks — incident — «одна неудача — перезапуск» — health checks — «ложные срабатывания» — health checks — «failureThreshold≥3» — health checks).

Практика: настройка health check'ов

Liveness probe (HTTP) (health checks — livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 3 (health checks — «GET /health, задержка 10 с, каждые 5 с, 3 неудачи = мёртв» — health checks — incident — «сбой → перезапуск» — health checks); Readiness probe (HTTP) (health checks — readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 3 (health checks — «GET /ready, задержка 5 с, каждые 5 с, 3 неудачи = не готов» — health checks — incident — «сбой → исключить» — health checks); Startup probe (HTTP) (health checks — startupProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 0 periodSeconds: 10 failureThreshold: 30 (health checks — «GET /health, каждые 10 с, 30 неудач (5 мин) = не запустился» — health checks — incident — «сбой → перезапуск» — health checks); TCP Socket (health checks — livenessProbe: tcpSocket: port: 3306 periodSeconds: 10 (health checks — «TCP к 3306, каждые 10 с» — health checks — incident — «для БД» — health checks); Exec (health checks — livenessProbe: exec: command: [cat, /tmp/healthy] periodSeconds: 10 (health checks — «команда в контейнере, каждые 10 с» — health checks — incident — «для кастомных проверок» — health checks); Мониторинг (метрики — метрики health check'ов (метрики — «kubelet метрики probe'ов» — метрики — incident — «сколько сбоев» — метрики — k8s).

Практический сценарий: health check'и для веб-сервиса

Контекст: веб-сервис в Kubernetes (k8s — поды (k8s — incident — health checks), боль: под завис — продолжает работать (health checks — «зависший под» — health checks — incident — «не отвечает, но жив» — health checks — k8s — «без health check'ов — проблема» — health checks); решение — health check'и: (1) liveness probe (health checks — livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 3 (health checks — «GET /health» — health checks — incident — «завис → перезапуск» — health checks); (2) readiness probe (health checks — readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 3 (health checks — «GET /ready» — health checks — incident — «не готов → исключить» — health checks); (3) startup probe (health checks — startupProbe: httpGet: path: /health port: 8080 periodSeconds: 10 failureThreshold: 30 (health checks — «долгий старт» — health checks — incident — «5 мин на запуск» — health checks); (4) эндпоинты (health checks — /health (health checks — «жив ли процесс» — health checks — incident — «200 = жив» — health checks), /ready (health checks — «готов ли принимать трафик» — health checks — incident — «200 = готов» — health checks); (5) мониторинг (метрики — метрики probe'ов (метрики — «kubelet метрики» — метрики — incident — «сколько сбоев» — метрики — k8s); результат: health check'и настроены (health checks — «liveness/readiness/startup» — health checks — incident — «зависший под → перезапуск» — health checks — k8s — «не готовый под → исключён» — health checks — автоматическое восстановление (k8s — «без ручного вмешательства» — k8s — incident); вывод: health check'и решили задачу (зависший под перезапускается автоматически — health checks — ADR — «liveness проверяет зависимости» — антипаттерн — health checks — liveness — только себя — health checks — техдолг).

FAQ

Какие типы probe есть в Kubernetes и чем они отличаются? Liveness probe (health checks — «жив ли под» — health checks — incident — «сбой → перезапуск пода» — health checks — k8s — «liveness = жив/мёртв» — health checks); Readiness probe (health checks — «готов ли принимать трафик» — health checks — incident — «сбой → исключить из сервисов» — health checks — k8s — «readiness = готов/не готов» — health checks); Startup probe (health checks — «запустился ли под» — health checks — incident — «сбой → перезапуск» — health checks — k8s — «startup = запустился/не запустился» — health checks); отличие: liveness — перезапуск (health checks — «мёртв → перезапуск» — health checks), readiness — исключение (health checks — «не готов → исключить» — health checks), startup — запуск (health checks — «не запустился → перезапуск» — health checks); «только liveness» — мало (readiness/startup — тоже важны — health checks — ADR — техдолг).

Какие типы проверок поддерживают probe и когда какой использовать? HTTP GET (health checks — «HTTP запрос» — health checks — incident — httpGet: path: /health port: 8080 (health checks — «GET /health» — health checks — «200-399 = здоров» — health checks — когда: веб-сервисы (health checks — «для HTTP приложений» — health checks); TCP Socket (health checks — «TCP соединение» — health checks — incident — tcpSocket: port: 3306 (health checks — «TCP к 3306» — health checks — «соединение = здоров» — health checks — когда: БД/сервисы без HTTP (health checks — «для TCP сервисов» — health checks); Exec (health checks — «команда» — health checks — incident — exec: command: [cat, /tmp/healthy] (health checks — «команда в контейнере» — health checks — «exit 0 = здоров» — health checks — когда: кастомные проверки (health checks — «для сложных проверок» — health checks); «только HTTP» — мало (TCP/Exec — тоже — health checks — ADR — техдолг).

Какие параметры probe настраивать и что означает failureThreshold? initialDelaySeconds (health checks — «задержка перед первой проверкой» — health checks — incident — «дать время запуститься» — health checks — обычно 10-30 с — health checks); periodSeconds (health checks — «интервал проверок» — health checks — incident — «как часто проверять» — health checks — обычно 5-10 с — health checks); timeoutSeconds (health checks — «таймаут проверки» — health checks — incident — «сколько ждать ответа» — health checks — обычно 1-5 с — health checks); failureThreshold (health checks — «неудачных проверок для сбоя» — health checks — incident — «сколько раз подряд провал» — health checks — обычно 3 (health checks — «3 неудачи = сбой» — health checks — «не 1 — ложные срабатывания» — health checks); «failureThreshold=1» — антипаттерн (ложные срабатывания — incident — failureThreshold≥3 — health checks — ADR — техдолг).

Можно ли проверять зависимости в liveness probe и почему это антипаттерн? Нельзя (health checks — «liveness проверяет БД» — health checks — incident — «БД недоступна — все поды перезапустятся» — health checks — «liveness — только себя» — health checks); почему антипаттерн: зависимость недоступна — все поды перезапускаются (health checks — «БД недоступна» — health checks — incident — «все поды перезапустятся» — health checks — «каскодный сбой» — health checks); правильно: liveness — только себя (health checks — «процесс жив» — health checks — incident — «не зависимости» — health checks), readiness — можно зависимости (health checks — «readiness может проверять БД» — health checks — incident — «не готов — исключить» — health checks); «liveness проверяет БД» — антипаттерн (каскодный сбой — incident — liveness — только себя — health checks — ADR — техдолг).

Источники: Kubernetes docs (configure liveness, readiness, startup probes), pod lifecycle, Probe API — ссылки в шапке.