Самовосстановление и наблюдаемость — Примеры
Пример 1 — Старт, который убивают до готовности
Сервису нужно сорок секунд, чтобы прогреть кэш, прежде чем отвечать на своём порту. Во время постепенного развёртывания новые pod’ы перезапускаются снова и снова, и выпуск застревает. Ниже блок проб; объясните цикл и исправьте его.
livenessProbe:
httpGet:
path: /live
port: 8080
periodSeconds: 5
failureThreshold: 3
Решение
startupProbe:
httpGet:
path: /live
port: 8080
failureThreshold: 30
periodSeconds: 5
livenessProbe:
httpGet:
path: /live
port: 8080
periodSeconds: 5
failureThreshold: 3
Startup-проба придерживает liveness-проверку, пока процесс не получит время инициализироваться, поэтому медленный прогрев больше не принимается за мёртвый процесс. Оба значения по умолчанию для проб слишком малы, чтобы быть верными для настоящих сервисов, а короткий период милосердия рядом с процессом, игнорирующим сигнал завершения, — обычная причина ошибок во время выпуска.
Пример 2 — Число перезапусков, на которое никто не смотрит
Сервис работает неделю, и пользователи ничего не заметили, но pod’ы говорят другое. Прочитайте доказательства и скажите, что означает это число и где этому сигналу место.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
api-7d4b2 1/1 Running 37 6d
api-91ab4 1/1 Running 41 6d
Решение
$ kubectl get events --field-selector reason=Unhealthy
... Readiness probe failed: context deadline exceeded
... Back-off restarting failed container
alert: container_restarts{app="api"} > 5 in 1h
Растущее число перезапусков — доказательство, а не шум: pod’ы убивают и создают заново достаточно часто, чтобы хроническая неисправность уже присутствовала, хотя снаружи сервис выглядит здоровым. Платформа восстанавливает pod’ы и тем самым прячет причину, поэтому перезапускам и вытеснениям место в оповещении, а не на панели, которую никто не читает. Относиться к ним как к норме — обычная ошибка.
Подставьте свои имена образов, правила оповещений и детали кластера там, где эти наброски используют заполнители.