Инструкция дежурного¶
Инструкция написана для человека, которого разбудили. Никакого вступления: что проверить, чем это лечится, чего не делать.
Первые три команды в любом случае:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl -n metroskop get pods
kubectl -n metroskop get rollout metroskop
Дашборды: цели по качеству, сеть и обращения.
Бюджет ошибок прожигается¶
Оповещение: MetroskopErrorBudgetBurningFast
Сервис отвечает ошибками сервера в десятки раз чаще допустимого. Посетители это уже видят.
- Посмотреть, все ли поды затронуты:
Если ошибки только на одном поде — почти наверняка идёт канареечный релиз, и виновата новая версия. Проверить:
Контроллер должен отклонить её сам. Если он ещё в паузе, а ошибки очевидны:
- Найти сами ошибки в логах — по метке уровня, а не поиском по тексту:
-
Взять
traceIdиз любой записи и открыть трейс в Tempo: он покажет, на каком шаге запрос разваливается — в базе, в расчёте, в сериализации. -
Частая причина — недоступная база. Проверить:
Чего не делать. Не перезапускать поды до того, как в логах найдена причина. Перезапуск уберёт симптом и вместе с ним — единственные улики.
Поезда двигаются рывками¶
Оповещение: MetroskopTickLagHigh
Такт рассылки опаздывает: кадры уходят не раз в секунду, а как получится.
- Посмотреть на график «Куча и сборка мусора». Если доля времени в сборке мусора выше 15 %, причина в паузах сборщика.
- Проверить, не включён ли сценарий отказа:
Поле chaos.memoryLeak со значением true объясняет всё. Сценарий выключится
сам, но можно и сразу:
- Если сценарии выключены, а куча полна — это настоящая утечка. Снять картину кучи до перезапуска, иначе разбираться будет нечем:
- Если узлу не хватает памяти целиком (
MetroskopNodeMemoryLow), проверить подкачку:free -m. Занятая подкачка при нехватке памяти означает, что поды вытесняются на диск, и медленно становится всему.
Карта замерла¶
Оповещение: MetroskopStreamStalled
Сервис отвечает на запросы, но кадры не рассылаются. Для посетителя схема выглядит застывшей.
- Проверить, живы ли подписки:
- Посмотреть последние записи планировщика:
- Если планировщик не выполняет такт, а поток исполнения занят — это блокировка в расчёте. Снять срез потоков:
- Перезапуск помогает, но без среза потоков причина будет утеряна:
Под не запускается¶
Признак: CrashLoopBackOff или Error в списке подов.
Порядок ровно такой, и он выстрадан — см. разбор инцидента:
- Прочитать журнал упавшего контейнера до любых гипотез:
- Посмотреть причину завершения.
OOMKilled— превышен лимит памяти,Errorс кодом — приложение не смогло стартовать:
- Если ошибка про отсутствующий класс, файл или каталог — смотреть содержимое образа, а не пересобирать его наугад:
- Если приложение не может подключиться к базе — проверить секрет и доступность службы:
kubectl -n metroskop get secret postgres-credentials -o jsonpath='{.data}' | head -c 80
kubectl -n metroskop exec deploy/web -- nc -z postgres 5432 && echo доступна
Чего не делать. Не пересобирать образ, пока не прочитан журнал. Ошибка почти всегда сказана прямым текстом.
Обращения уходят в просрочку¶
Оповещение: MetroskopIncidentsOverdue
Очередь обращений разбирается медленнее, чем растёт. На дашборде это видно как расхождение двух линий: поступление и закрытие.
- Проверить, справляется ли база:
- Проверить пул соединений: если он исчерпан, обработка встала не из-за базы,
а из-за незакрытых соединений. Метрика —
hikaricp_connections_pending. - На стенде поток обращений синтетический, и всплеск может быть просто всплеском. В настоящем сервисе на этом месте был бы разговор о людях, разбирающих очередь, а не о технике.
Сертификат не обновился¶
Оповещение: MetroskopCertificateExpiringSoon
kubectl get certificate -A
kubectl -n metroskop describe certificate metroskop-tls | tail -30
kubectl -n cert-manager logs deploy/cert-manager --tail=100
Типовые причины: закрытый снаружи 80-й порт (проверка HTTP-01 требует именно его), исчерпанный предел запросов Let's Encrypt, изменившаяся запись DNS. Проверить доступность проверки:
Пока старый сертификат жив, срочности нет: у автоматики есть тридцать дней запаса. Но исправлять надо до того, как они кончатся.
Узлу не хватает памяти¶
Оповещение: MetroskopNodeMemoryLow, MetroskopSwapHeavilyUsed
Порядок действий по возрастанию неприятности:
- Выключить сценарии отказов, если включены.
- Сократить хранение метрик в Prometheus (в переменных Terraform) — обычно это самый крупный потребитель.
- Снять генератор нагрузки: он нужен для показа, а не для работы сервиса.
- Не увеличивать число реплик приложения. На узле с 4 ГБ это ухудшит положение, а не улучшит.
Полное восстановление стенда¶
Если узел потерян целиком, порядок такой:
# 1. Узел: подкачка, параметры ядра, файрвол, k3s
ansible-playbook -i ansible/inventory.ini ansible/site.yml
# 2. Платформа: cert-manager, наблюдаемость, Argo Rollouts
cd terraform && terraform init && terraform apply
# 3. Приложение, база, публикация, правила, дашборды
cd .. && scripts/deploy.sh
Обращения жителей при этом теряются: они синтетические и наберутся заново за минуту. Всё остальное состояние описано кодом.