9:47. Первое, что вижу, открывая глаза, — это не потолок, а мерцающий экран ноутбука на тумбочке. Уже неделю мы боремся с причудливой ошибкой в конвейере сборки, которая появляется раз в три дня в случайное время. Вчера в 3:15 ночи пришло оповещение, что продакшен-сборка упала. Я поднял виртуальный кластер, запустил отладку, к 5 утра нашел корень проблемы — конфликт версий в кэше зависимостей — и залил хотфикс. Спал три часа. Но кофе и привычка к дробному питанию, которую я выработал за годы удаленки, помогают включаться.
10:30. Slack. 12 непрочитанных сообщений. Не алертов, а вопросов. Разработчики хотят увеличить лимиты для очередей сообщений в AWS SQS, команда аналитики просит настроить доступ к новой временной базе данных для тестов, стажер не может запустить локальный контейнер с сервисом аутентификации. Типичное утро. Отвечаю в чаты, параллельно открываю Jira. Сегодня по плану — автоматизация создания реплик базы данных для нового AI-сервиса. Задача нетривиальная, мы поняли это еще на этапе проектирования. Но сначала — дейли-митинг с командой.
11:00. Дейли. Голос в трубке немного хриплый: «Вчера чинил упавший сервис, поднял, настроил алерты полегче». Коллега коротко докладывает о проблеме: ночью сбой в одном из микросервисов из-за нехватки памяти. Он не просто перезапустил под, а настроил горизонтальное автоскейлинг и добавил правило в Prometheus, чтобы следующая такая ситуация детектировалась раньше. Это и есть суть нашей работы: не просто тушить пожары, а автоматизировать их тушение и ставить датчики дыма. Я рассказываю про свой ночной хотфикс и план на день. «Удачи с репликацией», — говорит тимлид. Я мысленно с ним согласен.
12:00 — 15:00. Глубокое погружение. На экране — три окна: IDE с кодом Terraform (мое сердце все еще принадлежит JetBrains IDEA), терминал с кучей алиасов и документация провайдера облачных баз данных. Пишу «инфраструктуру как код». Моя цель — чтобы одним применением конфигурации создавалась идентичная, изолированная копия базы для тестовой среды. Это нужно, чтобы разработчики AI-моделей могли безопасно экспериментировать с данными, не задевая продакшен.
Внезапно приходит сообщение: «Кирилл, у нас в пайплайне CI/CD этап линтинга падает на новом Python-скрипте. Посмотришь?» Откладываю Terraform. Захожу в Jenkins, смотрю логи. Проблема в нестрогой проверке стиля кода. Быстро правлю конфигурацию пайплайна, добавляю исключение для конкретного файла, инициирую повторный запуск. Проходит. Возвращаюсь к репликации. Это постоянное переключение контекста — между стратегическими задачами и оперативными запросами — и есть основной ритм дня.
15:30. Обед. Вернее, его вторая часть, как я привык: разбиваю приемы пищи на несколько небольших. На ум приходит мысль из книги по SRE: «Если твоя работа выглядит как рутина, ты делаешь ее недостаточно автоматизированной». Мысленно добавляю в бэклог задачу — написать скрипт, который будет автоматически создавать тикет в Jira на основе определенных типов алертов из Alertmanager. Это освободит нам время.
16:00 — 18:30. Фокус. Коллеги ушли на созвоны, и наступает золотое время. Допиливаю модуль Terraform, прогоняю terraform plan. Вижу, что будет создано 14 ресурсов. Все выглядит чисто. Делаю apply. В консоли пробегают строки логов. Успех. Теперь нужно проверить связку: написать маленький Python-скрипт, который подключится к новой реплике и сделает тестовую запись. Программирование — неотъемлемая часть моей работы. Без него я был бы просто сисадмином, который ждет, пока разработчик напишет ему скрипт. Скрипт работает. Задачу в Jira отмечаю как «Решено», делаю исчерпывающий комментарий для коллег. Чувство глубокого удовлетворения.
18:45. Пытаюсь формально закончить день. Закрываю рабочий ноутбук. Вечером у меня футбол — это мой ритуал переключения, особенно по понедельникам. Без такого ритуала легко сгореть, работая до 11 вечера.
21:15. Возвращаюсь с тренировки. Телефон вибрирует. Не Slack… Сигнал SMS от системы мониторинга. «CRITICAL: API-service latency > 2000ms. Region: EU-West-1». Сбой. Усталость мгновенно сменяется холодной собранностью. Это не вопрос, это инцидент. Открываю ноутбук, захожу в VPN.
21:20 — 22:10. Война. Grafana показывает: один из хостов в Kubernetes-кластере захлебнулся памятью. Автоскейлинг не сработал быстро enough. Сначала стандартные действия: проверяю логи (kubectl logs), метрики Pod (kubectl top). Вижу аномальный всплеск запросов к конкретному эндпоинту. Возможно, это атака, возможно, сбой в клиенте. Быстро увеличиваю количество реплик сервиса вручную, чтобы рассеять нагрузку. Затем поднимаю порог памяти для горизонтального автоскейлера на будущее. Сервис приходит в норму. Заношу предварительные заметки для постмортема. Завтра на дейли мы разберем инцидент по косточкам: почему алерт пришел так поздно, почему не сработал автоскейлинг, что можно улучшить в архитектуре. Сбой ликвидирован, но работа над ошибкой только начинается.
23:00. Выключаю свет. В голове еще крутятся строки кода, графики с дашбордов, обрывки диалогов. Но я научился с этим жить. Завтра будет новый день. Новый код. И, возможно, новый сбой. Моя работа — быть тем, кто стоит между ними, обеспечивая, чтобы из первого рано или поздно всегда получалось второе, а из второго — ценный урок для будущего.