В компании есть Kubernetes, GitLab с пайплайнами и стена дашбордов в Grafana. А деплоить всё равно страшно — по пятницам нельзя, релиз согласовывают в личке, о падении прода первым сообщает клиент. Если картинка знакомая, то у меня плохие новости в формате чек-листа. Ниже десять симптомов карго-культа с проверочными вопросами — посчитайте, сколько наберёт ваш прод!
Откуда термин и почему это именно про нас
Во время Второй мировой армия США строила аэродромы на островах Меланезии. Вместе с самолётами прибывал груз (тушёнка, инструменты и т. д.). Часть перепадала местным жителям. Потом война кончилась, самолёты улетели. Островитяне сделали логичный вывод — дело в аэродромах! Они выложили копии взлётных полос, поставили вышки из бамбука, вырезали наушники из половинок кокоса и стали ждать. Форму скопировали один в один. Самолёты не прилетели.
В инженерный обиход слово протащил Фейнман в 1974-м — он выступил в Калтехе с речьюпро карго-культ в науке — про работы, у которых есть все внешние признаки исследования, кроме одного — честной проверки самого себя.
DevOps, по моим наблюдениям, болеет карго-культом тяжелее других инженерных областей и у этого есть механика. Практики DevOps видимы — кластер можно показать на демо, дашборд повесить на телевизор в опенспейсе. А смысл невидим, сколько времени вы восстанавливаетесь после сбоя и во что обходится ошибка, на телек не повесишь. Когда форма фотогенична, а содержание нет, копироваться будет форма.
Добавьте сюда рынок, которому выгодно продавать всякие «трансформации» и инструменты, и инженеров, которым нужен кубер в резюме — получается ну очень питательная среда. Про кубер в резюме говорю без осуждения, сам однажды поднимал кластер именно за этим. Резюме, кстати, сработало.
Дальше чек-лист. Каждый пункт устроен одинаково: как выглядит, чем болит, какой вопрос задать. На вопросы нельзя ответить «ну, у нас процессы налажены», только фактом!
1. Kubernetes, в котором нечему масштабироваться
Как выглядит. Кластер из трёх нод. Внутри монолит в одном экземпляре, Redis и почтовый воркер. Кластер застрял на версии 1.27, апгрейдить страшно, откладывают третий квартал подряд. Обслуживают полтора инженера: один на полную, второй подхватывает «когда Дима в отпуске».
Чем болит. Платите дважды — за инфраструктуру и за экспертизу. Взамен — ничего из того, ради чего K8s существует. Самовосстановление и плотная утилизация раскрываются, когда сервисов десятки и они живут в нескольких экземплярах. Зато сертификаты, апгрейды кластера и внезапно осиротевшие поды приезжают сразу, в базовой комплектации!
Вопрос. Что сломается, если завтра переехать на docker-compose и systemd? Если ответ «ничего, станет проще» — у вас не оркестратор, а аквариум. Красивый, дорогой, требует ухода (возражение «держим на вырост» разберём ниже, оно честнее, чем кажется).
2. Микросервисы, которые деплоятся только вместе
Как выглядит. Тридцать репозиториев. Релизный трейн по четвергам. Таблица совместимости версий в Confluence и релиз-менеджер с лицом человека, который знает, чем всё закончится.
Чем болит. Вы оплатили полный ценник распределённой системы (сетевые таймауты, трассировка, согласованность данных), а главную выгоду — независимые деплои — оставили в магазине. Распределённый монолит дороже обычного, обычный хотя бы падал целиком и предсказуемо.
Вопрос. Когда команда последний раз выкатывала свой сервис одна, без общего окна и созвона на восемь человек?
3. «У нас DevOps — мы наняли девопса!»
Как выглядит. Открыли вакансию «DevOps-инженер», наняли человека, выдохнули — трансформация завершена! Стена между разработкой и эксплуатацией стоит где стояла, просто теперь у стены появился штатный ответственный.
Чем болит. Один человек становится бутылочным горлышком всех изменений. Разработчики по-прежнему перебрасывают релизы через стену, только теперь есть кому писать в личку «глянь плиз». Бас-фактор схлопывается в единицу, и когда человек уходит, «культура» уходит вместе с ним в другую компанию, на зарплату побольше.
Вопрос. Если ваш девопс уедет на три недели без ноутбука — что остановится? Составьте список и перечитайте: вот это вы и называете словом DevOps 🙂
4. Зелёный пайплайн, которому никто не верит
Как выглядит. CI формально есть. Но релизную сборку «на всякий случай» делают руками, флапающие тесты перезапускают до зелёного, а в конфиге годами живёт что-то такое:
integration-tests: script: ./run-integration.sh retry: 2 allow_failure: true # мигает с марта, разберёмся
Чем болит. Пайплайн, которому не доверяют это декорация с побочным эффектом, настоящие поломки тонут в привычном красном. Каждый релиз снова требует ручной экспертизы. Скорость потеряли, уверенность не купили :/
Вопрос. Готовы выкатить в прод ровно тот артефакт, который собрал пайплайн не пересобирая «начисто» и не открывая руками?
5. Terraform в репозитории, правки в консоли
Как выглядит. В репозитории аккуратный Terraform с модулями. В реальности лимиты во время последнего инцидента подняли прямо в консоли облака (два часа ночи, всем было насрать не до IaC), и теперь terraform plan показывает 47 изменений, применять которые никто не решается.
Чем болит. Это хуже, чем отсутствие IaC. Без него вы хотя бы знали, что живёте руками. Теперь у вас ложная уверенность в воспроизводимости плюс apply, работающий как рулетка: никто не знает, что именно он снесёт.
Вопрос. Когда terraform plan в последний раз был пустым? «Почти пустой» не считается.
6. Сто процентов покрытия при падающем проде
Как выглядит. Порог в CI — coverage не ниже 85% (в квартальной презентации это уже «почти стопроцентное покрытие»). Порог держится, отчёты красивые. Прод при этом падает от миграции, забытого конфига и кончившегося диска, ну т. е. вещей, которые юнит-тестами не ловятся в принципе.
Чем болит. Классический Гудхарт (закон/принцип Гудхарта — утверждение, гласящее «когда мера становится целью, она перестает быть хорошей мерой»): метрика, ставшая целью, перестаёт измерять. Появляются тесты ради процента на геттеры, на конструкторы, с моками всего живого. Сопровождать их дорого, ловят они пустоту.
Вопрос. Возьмите последние десять инцидентов. Сколько из них поймал бы хоть один из ваших тестов? Я проделывал это упражнение в двух командах: счёт был 0:10 и 1:10.
7. Канал #alerts на мьюте
Как выглядит. Двести с лишним сообщений в сутки. Замьючен у всех, включая дежурного (хе-хе). О проблеме узнают когда пишет клиент — у него-то канал не замьючен, у него платёж не проходит (ха-ха).
Чем болит. Чем больше оповещений, тем позже вы узнаёте о реальной проблеме. Старое доброе правило: алерт или событие, требующее действия человека. Остальное — метрики, им место на графиках.
Вопрос. Сколько алертов за последнюю неделю закончились чьим-то действием? Если меньше одного из десяти, то канал давно дрессирует команду на «красное можно не смотреть».
8. Вечное ретро
Как выглядит. Раз в две недели стикеры, «что было хорошо», экшон-айтемы… Которые кочуют из ретро в ретро, как чемодан без ручки. Постмортемы формально blameless, но виноватого в курилке всё равно назначили.
Чем болит. Команда быстро выучивает настоящий урок — говорить бесполезно. Проблемы перестают всплывать на ретро и начинают всплывать в заявлениях об увольнении. Ритуал рефлексии без изменений — это тренажёр выученной беспомощности за счёт работодателя.
Вопрос. Назовите три вещи, которые за последний квартал изменились в работе по итогам ретро. Не «обсудили», а именно изменились.
9. Запрет пятничных деплоев как стратегия надёжности
Как выглядит. «Деплоим со вторника по четверг, до 16:00». Перед праздниками фриз на две недели (в декабре может и на три). Релизное окно бронируют, как переговорку.
Чем болит. Запрет — это признание, оформленное процессом: откат у нас ненадёжен, мониторинг молчит, деплой необратим. У DORA это воспроизводится из отчёта в отчёт: команды, которые деплоят часто и мелко, ломаются реже и чинятся быстрее тех, кто копит большие релизы. Запрет консервирует страх, а причина никуда не девается. Оговорюсь — временный мораторий как костыль на переходный период это нормально. Карго начинается, когда костыль объявили походкой.
Вопрос. Что должно стать правдой, чтобы пятничный деплой превратился в скучное событие? Список ответов это и есть ваш бэклог по надёжности.
10. Дежурный-будильник
Как выглядит. Дежурства есть как в книжке Google SRE. Только у дежурного нет прав на прод, ранбуков не существует, и вся его функция это разбудить Лёшу. Лёша не дежурный. Лёша просто всегда.
Чем болит. Время восстановления сервиса равно глубине сна одного человека. Дежурство превращается в ответственность без полномочий — с неё выгорают быстрее всего. А Лёша тем временем становится единственной точкой отказа компании, и никакой кластер тут не поможет.
Вопрос. Какую долю инцидентов дежурный закрывает сам, не эскалируя? И когда он в последний раз чинил что-то по ранбуку?
Сводная таблица для проверки своей команды
|
Симптом |
Контрольный вопрос |
|---|---|
|
K8s, в котором нечему масштабироваться |
Что сломается при переезде на docker-compose? |
|
Микросервисы с общим релизом |
Когда сервис уезжал в прод в одиночку? |
|
«Наняли девопса» |
Что встанет, если он уедет на три недели? |
|
Пайплайн-декорация |
Выкатите его артефакт, не пересобирая руками? |
|
IaC с дрейфом |
Когда plan был пустым? |
|
Покрытие ради процента |
Сколько из 10 инцидентов поймали бы тесты? |
|
Алерты в мьюте |
Сколько алертов за неделю кончились действием? |
|
Ретро без изменений |
Что изменилось за квартал, не «обсудили»? |
|
Запрет пятниц |
Что должно стать правдой, чтобы деплой в пятницу стал скучным? |
|
Дежурный-будильник |
Какую долю инцидентов он закрывает сам? |
Корень у всех десяти один
Все симптомы выше — одна и та же ошибка в разном гриме: практика скопирована без вопроса «зачем», из которого она родилась.
У каждой практики был момент рождения, и это всегда была чья-то боль. CI — интеграция раз в месяц превращалась в многонедельный ад. Микросервисы — сотне команд стало тесно в одном релизном цикле. Blameless-постмортемы — при поиске виноватых люди прячут информацию, и следующий инцидент чинится дольше. Цепочка всегда одна
Карго-культ — это когда цепочку берут с хвоста. Инструмент есть, практика изображается, принцип не сформулирован, а боли, возможно, никогда и не было.
Противоядие занудное, зато рабочее — восстанавливать цепочку задом наперёд для каждой заметной практики своего прода. Вот кластер — какую практику он реализует? Какой принцип за ней? Какая наша — не гуглова, а наша, родная, боль его оправдывает? Если цепочка восстановилась, отлично: теперь вы знаете, что именно защищаете. Если нет — тоже хорошо: появился готовый список кандидатов на снос. Или на признание «держим на вырост и для найма» — это тоже легитимный ответ, просто его надо произнести вслух, а не маскировать под инженерную необходимость.
Честная оговорка
Карго-культ — не синоним глупости, и текст выше не стоит читать как «вокруг идиоты». Копировать форму до понимания сути нормальная стратегия обучения: так осваивают профессию джуны, так же действует команда, у которой дедлайн ближе, чем время на разбирательство. Скопировать пайплайн соседей, когда на «понять» нет ресурса зачастую рационально.
Проблема не в копировании. Проблема — не вернуться потом с вопросом «зачем». А это уже не про людей, а про то, как в компании принимают решения: практики внедряются без хозяина, без записанного ожидаемого эффекта и без даты, когда эффект проверят. Почините три этих пункта и карго рассосётся сам, без осуждения коллег и мотивационных постеров.
Чек-лист выше — тоже модель со всеми её ограничениями. Найденный симптом значит ровно одно — у практики не восстановлена цепочка. Идём восстанавливать!
Сколько пунктов набралось у вас? И какой карго-культ вы наблюдаете прямо сейчас? Что мешает спросить «зачем» при всех? Коллекционирую образцы — несите в комментарии ))
ссылка на оригинал статьи https://habr.com/ru/articles/1065950/