Представьте, что есть проект, где 200 разработчиков, 20+ независимых продуктовых команд и у каждой свой собственный DevOps. Они всё автоматизируют — все довольны и занимаются исключительно своей работой. Разработчики даже успевают красить зелёные кнопочки в красный цвет. У DevOps современные инструменты и они помогают автоматизировать релизы. У каждого product owner независимая команда, он никем не блокируется, планирует свой бэклог, быстро двигается и развивается. А “эффективный менеджер” больше не сомневается стоит ли разрешать разработчикам самим катить в продакшен. Представили? Тогда прикинем, что может случиться с ними через год.

Обо всем этом и об интересном подходе к разработке в Ситилинке расскажет Константин Осипов — руководитель DevOps, QA и 140+ backend/fronted-разработчиков. Он познакомит нас с проблемами, которые стояли перед командой разработки и с тем, как они их решили. Поделиться своими мыслями, как не надо делать и объяснит как перестать быть эникейщиком. А главное, как со своими задачами в разработке справляются в Ситилинке.

Типичный Git-репозиторий

Чтобы погрузиться в тему, посмотрим на типичный Git-репозиторий, что в нём есть:

  • CI/CD pipeline, который включает в себя: линтеры кода, тесты, валидаторы, сборку, deploy в prod/stage/sandbox-окружениях, уведомления о релизах в чат, метки в мониторинг о релизе, чтобы посмотреть корреляцию;

  • Linters возможно специфичные линтеры или сканеры безопасности;

  • Helm chart, где есть values-файлы для prod/stage/sandbox-окружений и тесты на сам helm chart;

  • Dockerfile

  • Docker-compose.yml для локальной разработки. В Ситилинке для создания локального окружения разработки не используют Kubernetes, а используют docker-compose;

  • Config files - файлы конфигов envoy и прочее;

  • Source code. В исходном коде тоже оказывается не всё так просто это: обработка флагов и переменных окружений, логирование, трейсинг, метрики, liveness/readiness probes, обработка сигналов, мягкое завершение программы Graceful shutdown, HTTP/gRPC-сервер, unit-тесты, инструменты профайлинга, layout приложения.

Вспомним историю про разработчиков, которым больше не нужно делать грязную работу и они могут красить кнопочки даже в AB тесте. Про DevOps которых больше не путают с сисадминами и про всех остальных. Разберём 4 простые истории, что стало с такой командой через командой.

История 1: Product Owner и долгие сроки

Приходит product owner в команду и спрашивает почему микросервис по покраске делался неделю вместо 3 часов? Разработчик, посовещавшись с DevOps’ом, объясняет, что сначала он 1 час ждал DevOps’а, пока тот создавал Git-репозиторий и настраивал права. Потом разработчик за 3 часа сделал layout приложений, подключал логгер, реализовывал HTTP-сервер. Ещё за 3 часа накидал реализацию. Правда, потом DevOps ему помогал настраивать dev-окружение, потому что сам разработчик не хочет этим заниматься. Потом вспомнил, что надо тесты написать — ещё 3 часа. Добавлял метрики и логи — ещё 3 часа. Потом разработчик опять встретился с DevOps’ом, обсудили, что нужно, чтобы всё это дело в продакшен затащить. Тут вспомнили, что надо бы сигналы обрабатывать, мягкое завершение в приложении сделать, да и трейсинг хотелось бы. Сделал это ещё за 3 часа. Дальше DevOps написал pipeline для сборки и деплоя. Потом с QA потестировали, поправили какую-то проблемку, потратили часик. Напилили дашборд в Grafana, чтобы всё удобно передать поддержке. В теории потратили на эту работу 4 дня, а не 3 часа.

Но на практике, учитывая затраты на ожидание и переключение контекста, потратили ещё больше — неделю.

Казалось бы, независимая команда, а потратили столько денег, несмотря на то что в каждую команду поставили по DevOps’у помогающему всё автоматизировать. Но он всё равно там один, а разработчиков несколько. Поэтому они друг друга всё время ждут, и на это ожидание тратится дополнительное время.

Выводы 

Затраты разработки и DevOps на написание boilerplate-кода просто невообразимые. При этом наверняка у этих команд и продуктов много общего, замечается много копипаста. Разделение труда, на самом деле приводит к задержкам. Хотелось бы, чтобы один человек мог сделать всё и сам дотащил задачу от старта до продакшена.

История 2: ИБ и 20 DevOps

Приходит безопасник к DevOps’у и сообщает, что нашли уязвимость в плагине деплоя в k8s, нужно как можно скорее везде исправить. Безопасник ожидает, что во всех 20 командах типовой pipeline и они как-то договариваются между собой. 20 DevOpses собирают большой ZOOM и понимают, что все 20 команд независимы и делают всё по-разному. Во-первых, в реальности pipeline выглядит иначе. Во-вторых, оказывается, что разработчики сделали 200 микросервисов и на самом деле pipelines не 20, а 200, и их доработка займёт 800 часов.

Выводы

Каждая команда по-своему пишет сервисы, несмотря на договорённости. Если они независимые, можно хоть договариваться, хоть нет — всё равно всё разъедется.

Глобальные задачи — это всегда боль, особенно если там микросервисная архитектура и их очень много. Они приводят ко множеству коммуникаций, огромным затратам на реализацию и совершенно непредсказуемым результатам.

История 3: «Перевод стрелок»

Приходит как-то support и говорит, что пользователи жалуются, что не могут создать заказ. Разработчик отвечает, что у него локально всё работает, это проблема DevOps. DevOps говорит, что всё внимательно посмотрел, ошибок не видит — контейнеры крутятся, лавеха мутится. Там какая-то сложная бизнес-логика, он ее не писал, это к разработчику. Разработчик утверждает, что посмотрел локально, всё работает, по логам тоже ничего нет и отправляет к DevOps. Потому что не знает инфраструктуру и не понимает, как его код работает в продакшене. И так по кругу до бесконечности.

Выводы 

Нет единого ответственного за работу сервиса в целом. DevOps не понимает бизнес-логики, чтобы найти ошибку, а разработчик не понимает как работает его сервис в продакшен. Каждый отвечает за свой кусок, а серая область остаётся, никто не отвечает за весь сервис.

История 4: Баг в PHP extension

Приходит поддержка к DevOps и говорит, что в мониторинге видно, что некоторые поды с PHP зависают со 100% утилизацией CPU. Рестарт ненадолго помогает. Посмотрите через strace в чём дело. DevOps отвечают, что не знают strace, это что-то про Linux, а они только умеют писать пайплайны, helm charts, деплоить в k8s и работать с высокоуровневыми абстракциями.

Выводы 

DevOps теряет навыки из-за постоянной работы с абстракциями и ежедневного потока однотипных задач написания pipeline. Он изо дня в день занимается одним и тем же — копипастом. Поначалу, пока это были новые технологии, ему было интересно, весело, задорно. Но потом, когда каждый день была одна и та же работа, она превратилась в ад и скуку. В силу изолированности команды отсутствовали разнообразные задачи. Как правило, в одной команде задачи плюс-минус одинаковые. DevOps не видит того, что инфраструктуру строят другие люди. Он просто помогает писать pipeline.

Как перестать быть эникейщиком

Теперь стало понятно, кто такие эникейщики. В интернете есть разные определения, но смысл один:

DevOps-инженер — это специалист, который:

  • синхронизирует этапы разработки программного продукта; 

  • знает в чём работа разработчиков, QA, менеджеров и автоматизирует их задачи;

  • умеет программировать и быстро изучает новые инструменты.

Так как перестать быть эникейщиком? Никак! DevOps-инженер — это и есть эникейщик.

Казалось бы, на этом можно закончить статью, но в определении DevOps есть слова «автоматизирует их задачи». Об этом и поговорим. Конечно, в Ситилинк не втащили всё, о чём было рассказано выше. Там сначала в голове прокрутили все эти истории и решили, что это не тот путь.

Опыт Ситилинк

В Ситилинк взяли в команду трёх Рембо-DevOps. Рембо — потому что они не только умеют писать pipeline, но ещё понимают в Linux, в сетях и Kubernetes. Могут нормально развернуть с помощью Kubespray. Чтобы у них всё было хорошо, решили, что один Рембо будет старшим, чтобы остальных не бросало в разные стороны по технологиям, и они шли единым клином и приходили к каким-то результатам. Из этого получилось 20 продуктовых команд и DevOps-команда.

Причём, чтобы не было проблемы, когда DevOps-команда стоит за линией и даже 3 Рембо не могут справиться с 20 отрядами бравых разработчиков, Рембо тоже решили сделать продуктовой командой. Так получилось выкрутиться из ситуации, не раздувая штат DevOps. DevOps остались вместе с разработчиками за чертой по одну сторону, и тоже стали продуктовой командой.

Продукты DevOps

У DevOps могут быть такие продукты:

В Ситилинк это:

  • Telegram bot, который позволяет автоматически получать и оказывать цифровые услуги;

  • Kubernetes как сервис; 

  • Tarantool как сервис;

  • Postgres как сервис;

  • CDN, чтобы нарезать картинки;

  • S3, чтобы разработчикам было проще работать с одним протоколом и запускать большую часть сервисов в Kubernetes stateless;

  • Helm Chart template (базовый шаблон);

  • Мониторинг как сервис;

  • Запускатели тестов как сервис;

  • Dev server как сервис — когда невозможно что-то большое запустить на своей тачке.

Самый маленький из них — Telegram bot для получения и оказания услуг. Несмотря на простоту, этот сервис принёс бы вам максимум пользы, если бы вы реализовали его у себя. Поэтому о нём и поговорим далее.

Но прежде чем начать определим красную жирную черту между DevOps и разработчиками. Их нужно разграничить, чтобы они не кидались стрелками между собой. Сделать это можно безопасно, потому что продукты у них разные.

DevOps:

Разработчики:

Предоставляют цифровые IT-услуги

Разрабатывают внутренние IT-продукты

Отвечают за качество и стабильность предоставляемых услуг и продуктов

Непрерывно собирают обратную связь

Разрабатывают бизнес-продукты

Отвечают за качество и стабильность своих продуктов

Разрабатывают новые цифровые услуги для себя самих

Важно, чтобы это всё работало, DevOps должны непрерывно собирать обратную связь с разработчиков, какие им цифровые продукты нужны, потому что у DevOps пользователи — это разработчики, а у разработчиков уже клиенты.

Разработчики, чтобы не грузить дальше DevOps, в принципе могут разрабатывать новые цифровые услуги сами для себя.

Демо

Чтобы было понятно, о чём идёт речь, разберём, как выглядит получение одной из цифровых услуг с точки зрения её получателя. Приведём скрины из реального чат-бота. Бэкенд-разработчик захотел себе сделать микросервис на Go. Он пытается авторизоваться через сервис внутренней авторизации.

К слову, о продуктах, сервис внутренней авторизации, SDK, который легко прикрутить к ботам и к любому веб-приложению, опять же разрабатывают DevOps,  это их продукт.

Разработчик авторизуется в этой системе, получает доступ. Отправляет секретный код в чат.

Дальше предлагается выбрать язык разработки. На скрине разработчик выбрал Go, также он решил писать микросервис, а не библиотеку:

Здесь предлагается только один шаблон:gRPC.

Дальше спрашивается номер задачи в Jira, потому что эта система полностью автоматизированная. Здесь никто не будет ничего апрувить, всё создаётся реально и хотелось бы потом знать, по какой задаче было принято решение создать новый микросервис. В данном случае фоном этот бот проверит, что задача существует и находится в нужном статусе.

Следующим шагом вводится название репозитория, например, test-color, а после краткое описание:

десь «тестовый сервис, который красит кнопочки в красный цвет». Теперь понятно, для чего этот микросервис и кто его сделал.

Вводится фамилия, имя майнтейнера и его email:

Дальше нужно подтвердить, что всё ОК. Разработчик подтверждает, и буквально через 5-10 секунд видит уже радостное сообщение, что репозиторий создан:

Что получили в итоге? Создался в bitbucket репозиторий. Есть приложение. Оформлен текст Git-коммита, как принято в компании, всё можно потом найти.

 В readme и в принципе везде, задано имя приложения, добавлено описание:

А ещё добавлены:

  • Обработка сигналов

  • Graceful shutdown

  • Настроен logger

  • Tracing

  • Метрики

  • gRPC-сервер

  • HTTP-сервер

  • Роутинг

  • Сконфигурированы переменные окружения/флаги

  • Сборка

  • Деплой по тегам в stage/prod

  • Unit-тесты

  • Локальное окружение

  • Деплой в sandbox через bot

  • Линтеры

  • Создан дашборд в Grafana на все метрики

  • Полезные утилиты run.sh

Как это работает?

Рассмотрим, как это работает с точки зрения того, кто эту услугу хочет предоставить. Допустим, DevOps или разработчики решили для себя самих начать предоставлять услугу, которую мы только что получили.

Здесь приведён конфиг этого бота. В основной секции ничего сложного нет — как видели, так и пишется:

Указываем, что шаблон для языка и типа — gRPC микросервис:

Указываем папку в bitbucket — проект, куда создавать полученные сгенерированные новые репозитории, потом указываем репозиторий шаблона (в Ситилинк называется grpc-skeleton):

Дальше указаны расширения файлов, в которых переменные будут заменены на значения, чтобы не заменить что-то ненужное в других файлах. Ещё можно сделать игнорирование копирования каких-то директорий: 

Например, в папке _docs лежат доки по самому шаблону. Они актуальны пока это ещё шаблон, а когда он становится сервисом, это уже к нему отношения не имеет. Поэтому копировать их не надо.

Дальше идёт самое интересное — это переменные, на основе которых в коде шаблона происходит замена. Вопросы, что нам задавали в боте, доступны здесь с помощью переменных. Дальше можно их заменить в любом месте проекта. Также из них можно составить какие-то новые переменные или создать новую переменную содержащую произвольное значение. Ещё добавили “небезопасные переменные”, которые по сути заменяют в тексте ключ на значение:

Например, они могут быть полезны, если делать шаблон какого-нибудь Go-микросервиса, у него есть пути импортов. Если сразу там подставить эти переменные, он возникнет проблема с билдом. Это очень неудобно, потому что невозможно протестировать шаблон, а ведь нужно ещё, чтобы тесты в репозитории с шаблоном успешно отрабатывали. Поэтому на более позднем этапе можно просто какую-то текстовую строку заменить на какую-то переменную.

Перемещение директорий (moveDirs) в нашем примере нужно, чтобы переименовать “cmd/grpc-skeleton” в “cmd/test-color”.

Теперь посмотрим как выглядит шаблон репозитория с переменными для замены:

Здесь приведен для примера один values-файл и Dockerfile, в которых используются подстановки переменной “BS_REPO_NAME” (название репозитория).

Также бывают специфичные случаи, когда от пользователя нужно получить ответы на дополнительные вопросы:

Для этого в шаблон можно добавить файл tg-bootstrap.yml, и в нём задать пользовательские вопросы, актуальные только для этого шаблона. Здесь спрашивается имя, фамилия майнтейнера и email. Ответы на эти вопросы будут доступны в переменных.

Также можно использовать инструкцию для чата, которая будет отправлена после оказания услуги. Например, написать, что репозиторий содержит демо-файлы, которые потом нужно не забыть удалить.

Как оказалось, нет ничего сложного, чтобы реализовать подобный бот, но чтобы это реально заработало одной лишь реализации бота недостаточно.

Что нужно, чтобы это взлетело?

Нужны тотальный контроль и ограничения. Почему?

  • Разработчики должны сами поддерживать свои шаблоны услуг. DevOps понятия не имеют, какой идеальный шаблон микросервиса на Go, а какой на PHP. Они могут в принципе не знать языка программирования для которого создан шаблон. 

  • DevOps должны предоставлять шаблонные CI/CD pipeline и Helm charts. Это нужно, чтобы по максимуму упростить работу разработчиков по поддержке услуг, чтобы они брали типовые шаблоны и их использовали, а также снижалось количество копипасты.

  • Жёсткие спецификации, стандарты и регламенты разработки. Чтобы все писали код плюс-минус одинаково, использовали одинаковые подходы во всех продуктовых командах. Хоть они и независимые, эти требования должны все соблюдать одинаково.

  • Никакого зоопарка: технологий, языков программирования, библиотек, плюс единые код-стайлы. В противном случае это не принесёт большой пользы.

Для чего всё это нужно? Есть одна маленькая проблема:

  • Массовые правки

Помните задачку с ИБ? Она решается в Ситилинк за 4 часа. Для этого мы написали простенький инструмент для массовых правок «repo-linter», подающий массовые PR`s с правками. В нём нет ничего особенного, он позволяет потратить один раз 4 часа на исправление и отмасштабировать эту работу автоматически подав 400 PR`s на все репозитории.

В большинстве команд уже есть майнтейнеры, они спокойно посмотрят, чтобы не было конфликтов, замержат, проверят QA, разольют в прод. В единичных случаях будут какие-то конфликты, и то те люди, у которых эти конфликты есть, понимают, что это произошло, потому что у них какой-то свой путь т.к. они отошли от правил описанных выше.

Итог

Что мы получили из этой схемы:

  • 15 минут — это общие накладные расходы на создание одного микросервиса.

В Ситилинк реально разработчик не обращается ни к кому, в том числе к DevOps. Он заходит в бот и пишет что ему нужно. Дальше он в принципе может ставить тег в Git. Это всё раскатится на продакшен, и его «Hello, World» будет работать. Причём это всё покрыто тестами, обложено мониторингом, использованы лучшие практики, подобран хороший layout — всё, что могли выжать из компании изнутри, выжали, дали максимум для того, чтобы разработчик писал хорошо. И на это всё нужно потратить 15 минут.

  • 4 часа, чтобы внести минимальные правки в 300+ сервисов.

  • > 10К часов экономии ресурса разработки (скорее всего, гораздо больше, сложно посчитать) по повторным правкам.

  • Разработчики лучше понимают, как работает их сервис в продакшен, потому что они сами деплоят, сами за это отвечают, DevOps абсолютно никак в это не вмешиваются.

  • DevOps наконец стали автоматизировать процессы.

  • Нет нужды в DBA, т.к. новые БД создаются тоже через бота.

Неочевидный бонус — в Ситилинк стали не нужны люди, к которым нужно приходить на поклон, чтобы они создали тебе базу данных. Просто приходишь в бот, ему не надо кланяться. Некоторые скажут, что DBA нужны для того, чтобы нагрузки держать. Но и эту проблему удалось решить регламентами, которые вносят ряд ограничений снижающих вероятность возникновения таких ситуаций.

В итоге в Ситилинк:

  • счастливые разработчики — они могут творить! 

  • счастливые DevOps — у них разнообразные задачи! 

  • счастливые product owner — у них быстрый Time to Market!

Комментарии (12)


  1. saboteur_kiev
    17.05.2023 11:57

    Так это и есть нормальная работа девопс инженера - создать шаблон/пайплайн подходящий ту мэни, и автоматизировать его.

    Надо новый микросервис - нажимаешь пару кнопок, и у тебя создан гит репо и в нем базовый кубернетес деплойконфиг. На конфлюенсе несколько страничек о базовых возможностях темплейтов и какие-то базовые кастомизации.
    Если нужна большая кастомизация - обсуждаете с девопсом что и зачем делать (это делать ОБЯЗАТЕЛЬНО при любом шаге в сторону от темплейтов, чтобы ваш компонент адекватно встроился в общую структуру проекта).

    У нас шаблон под новый "стандартный" микросервис - минут 10 занимает до возможности деплоя в дев енвайрнмент. Причем шаги упрощены до того, что их может сделать джун.


    1. liderman
      17.05.2023 11:57
      +1

      Об этом и статья. К сожалению, так далеко не во всех компаниях.

      Когда я проводил собеседования DevOps инженеров, то было много людей, которые занимались не созданием платформенного решения или его эксплуатацией, а сидели в командах разработки и просто писали за разработчиков пайплайны, думали о том как задеплоить приложение в k8s. При этом это были не маленькие компании, и у них было несколько команд и несколько DevOps инженеров, но все они разделялись на две касты:

      1) те кто разворачивает k8s и остальное

      2) и те, кто помогает разработчикам доставить их код в production


  1. brestows
    17.05.2023 11:57
    +1

    • Нет нужды в DBA, т.к. новые БД создаются тоже через бота.

    уж больно неправдоподобно звучит, а кто разворачивает сервера и СУБД, на которых бот создает БД? Кто обслуживает и мониторит эти самые СУБД. Даже если они облачные, кто-то же должен это делать... Ну и админов не видно во всей этой сказке....


    1. liderman
      17.05.2023 11:57
      +1

      Для решения этой проблемы инженеры команды DevOps создали DBaS как отдельный продукт, который они сами и поддерживают.

      DBA не нужны, т.к. задачи развёртывания новой БД, мониторинг, создание-восстановление backup, настройка прав доступа решаются в автоматическом режиме DBaS. А за задачу эксплуатации созданной БД отвечает уже разработчик.

      Конечно, чтобы это действительно заработало, приходится вводить ограничения/правила/инструкции. Ограничения, например, могут быть такими

      • нельзя создавать inmemory БД, занимающую > 50 ГБ места

      • код хранимых процедур должен иметь 100% покрытие тестами

      • должен быть сделан прогноз роста БД на год и учён в ограничениях

      • миграции должны быть предварительно протестирвоанны на тестовом контуре

      • и т.д.

      Некоторые ограничения могут быть достаточно жесткими, но именно благодаря ним мы избегаем возникновение проблемных ситуаций.


      1. brestows
        17.05.2023 11:57

        ну сути это не меняет, то что раньше делало DBA теперь должны делать DevOps вы просто переложили обязанности из одного кармана в другой. Ведь когда DBaS упадёт, DevOps будет сидеть и поднимать его, а не заниматься прямой обязаностью


        1. liderman
          17.05.2023 11:57
          +1

          Ну как это не меняет. Раньше для создании БД нужно было просить это сделать человека, для создания backup и всего остального тоже. А теперь это никто не делает. Это автоматизированно.


          1. brestows
            17.05.2023 11:57
            +1

            вы автоматизировали минимум из того что делает DBA, остальное перевесили на DevOps и довольны ) интересный подход конечно, ну и ладно ))


            1. liderman
              17.05.2023 11:57

              Да нееет. Часть работы закрыли автоматизации, сделанные DevOps, и они занимаются только поддержкой и развитием самого решения DBaS. А вот остальную часть работы переложили на разработчиков. Это работает хорошо, т.к. разработчики лучше понимают свой продукт/нагрузки и т.д.

              Но ваш скепсис по этому вопросу совершенно оправдан, т.к. такой подход не взлетит без: качественных шаблонов, готовых рецептов, обучения команды, жестких регламентов и ограничений.

              Просто представьте десяток команд, больше сотни БД и точку отказа в виде одного или нескольких DBA. Зачем они нужны? Они не погружены в контекст и никогда не смогут держать в голове всю информацию.

              Также DBA будут являться "бутылочным горлышком" в этом процессе. Чтобы лучше это понять, попробуйте встать на сторону разработчика, который "горит идеей" и может реализовать всё в "одно лицо", но его постоянно тормозят DBA: сначала им нужно объяснить, что ты хочешь, потом они будут создавать БД, потом настраивать доступы, и т.д. и это всё непременно будет вызывать задержки. У бизнеса из-за этого ниже TTM, а разработчики постоянно кого-то ждут, вместо того чтобы "творить".

              P.S. не воспринимайте эту статью и мои комментарии как "серебряную пулю". Также я не против профессии DBA. Этот подход справедлив для: большого количества независимых продуктовых команд, где много разработчиков, микросервисная архитектура, высокие требования к TTM и команда находится в стадии активного роста


        1. saboteur_kiev
          17.05.2023 11:57

          у сути это не меняет, то что раньше делало DBA теперь должны делать DevOps

          Девопс может, но не обязан разбираться в тонкостях всех ДБ в мире, и тем более в структуре данных конкретного проекта. ДБА дает девопсу уже готовую инструкцию как настроить типовую базу для теста и продакшена, в которой уже и конфиги оптимизированы и ресурсы перечислены. Девопс автоматизирует развертывание по этой инструкции и решает как это интегрировать с существующим решением.

          ДБА остается работать с тонкими настройками и как консультант, если нужно что-то изменить.

          Так Девопс может решить разворачивать базу под каждый енв, или под каждую фичаветку - после консультации с ДБА ДевОпсу немного виднее сколько ресурсов есть в проекте и как ими можно манипулировать. А ДБА может подсказать что чистить, а что не чистить. Как брать эталонный образ и так далее.


          1. liderman
            17.05.2023 11:57

            У нас выбор ограничен 2 БД: tarantool и postgresql. При этом каждая БД для решения своих задач (есть инструкция для разработчика по выбору оптимальной БД).

            DevOps, которые строят DBaS, обязаны разбираться в тонкостях настройки БД, т.к. они не просто автоматизируют развёртывание БД, а создают свой продукт - DBaS. То есть это не просто БД, а готовая платформа со своими SLA, требованиями и ограничениями. Это совершенно другой подход.

            Описанный вами подход также имеет право на жизнь, т.к. во всех компаниях свои условия, свои особенности команды и динамика. Например, у нас в БД не содержится бизнес логики, несколько сотен микросервисов и у каждого своя БД, и из-за этого 90% баз не имеют столь значимых нагрузок, чтобы стандартный сетап не справился с нагрузкой.

            Такой подход позволяет нашим разработчикам просто написать в Telegram бот и в случае, например с tarantool БД мы автоматически получаем:

            • git-репозиторий с настроенной БД, мигратором, "hello world" кодом lua процедур доступа к данным, оптимальной конфигурацией для высоких нагрузок

            • 100% покрытие unit тестами и всеми инструментами включая инструмент расчёта динамики роста БД

            • Настроенный деплой в k8s в режиме master-master репликации с zero-downtime при деплое и отказе одной из реплик

            • Поддержку из коробки сразу 3 окружений: стабильный тег - деплой в stage и prod, rc-тег - деплой в stage, кнопка в CI - деплой в песочницу

            • Уже настроена локальная разработка с запуском в Docker

            • Настроенной из коробки системой прав доступа и секретами в Vault (разработчики не имеют прямого доступа в БД и не могут её сломать)

            • CI-CD которая прогоняет тесты, не даёт снизить покрытие, требует минимум 2 аппрува на ревью

            • Автоматические backup

            • Возможность развернуть БД из backup в песочнице через CI/CD

            • Централизованный сбор логов и метрик и настроенные dashboard c alert в Grafana.

            Вот и зачем нам DBA? Наша цель была убрать человека из этого процесса.

            Ну встаньте на место разработчика. Это же круто, когда никого ни о чём не надо просить и никого не надо ждать. Написал в бот и через несколько минут ты уже дотащил всё до production


  1. ky0
    17.05.2023 11:57

    У нас продуктовые девопс-инженеры периодически помогают инфраструктурным линуксоидам, забирая задачки из их бэклога. Это поддерживает низкоуровневые навыки и не даёт превратиться в ямл-девелоперов пайплайнов.


  1. jenki
    17.05.2023 11:57

    Разработчик, посовещавшись с DevOps’ом, объясняет, что сначала он 1 час ждал DevOps’а, пока тот создавал Git-репозиторий и настраивал права.

    Не знаю на счёт репозитория, но всякие права доступа особенно на описанном крупном проекте это разве не вотчина отдела ИБ? На сколько понимаю, это как раз попадает под их любимые матрицы прав доступа и связанные с ними разграничения.

    Правда, потом DevOps ему помогал настраивать dev-окружение, потому что сам разработчик не хочет этим заниматься.

    Это разве рабочий подход? Более чем уверен, что многим по работе приходится делать, то что им ну вообще не по душе, а иногда невыносимо, хоть волком вой. Одни бесконечные созновы по поводу и без повода чего стоят.

    Хотелось бы, чтобы один человек мог сделать всё и сам дотащил задачу от старта до продакшена.

    До этого выше по тексту было, про то как ваши непоседы писали тесты, добавляли, метрики, логи, делали обработку сигналов и настраивали мягкое завершение работы, трейсинг прикрутили, написали pipeline, обсуждали как всё это добро затащить в продакшн (только если это обсуждать без участия ИБ, можно на несколько часов попасть), в конце написали дашборд для команды поддержки. И как оказалось на это должно уходить не более трёх часов, вместо нескольких дней. По моему опыту, если это не приложение уровня helloworld, то команда неплохо за четыре дня справилась с работой над приложением с нуля.
    Я не знаю какого уровня сложности было приложение, но уверен что 146 % ТЗ было не полное и по ходу пьесы легенда менялась, а ещё была уйма согласований по поводу и без повода, не считая созвонов и митингов. Не знаю, как на счёт времени с переключением контекста по рабочим вопросам, но после некоторых согласований работать не хочется. Иногда совсем.

    Безопасник ожидает, что во всех 20 командах типовой pipeline и они как-то договариваются между собой.

    Вообще реальность устроена иначе, чем мы ожидаем. Ожидать, раз колёса все круглые и прикручиваются гайками к мостам, то замена колёс везде выглядит одинаково и делается поэтому легко и непринуждённо. Вообще, если подумать? Команды разные наверное потому что делают разные задачи. Обычно блины жарятся немного по другому чем картошка. Хотя там и там сковородка, печка и повар.

    Разработчик отвечает, что у него локально всё работает, это проблема DevOps

    Это уже стало притчей во языцах. Ответ простой на такие заявления: разработчик берёт свой локальный компьютер, где всё работает, едет в ДЦ и пристраивает комп с рабочей программой. На сколько понимаю, бизнес платит деньги, чтобы программа работала на специльном для этих целей сервере, а не на чьей-то домашней машине.

    Потому что не знает инфраструктуру и не понимает, как его код работает в продакшене.

    А для какого окружения вообще разрабатывался код?

    Приходит поддержка к DevOps и говорит, что в мониторинге видно, что некоторые поды с PHP зависают со 100% утилизацией CPU.

    Это точно задача, которая решается в стезе методологии DevOps? Ведь все мы бесконечное число раз видели картинку про методолгию DevOps. И эта картинка мало кореллирует с предметной областью инженеров по эксплуатации (SRE).

    DevOps-инженер — это специалист, который:
    синхронизирует этапы разработки программного продукта;
    знает в чём работа разработчиков, QA, менеджеров и автоматизирует их задачи;
    умеет программировать и быстро изучает новые инструменты.

    Синхронизировать этапы разработки это чуть ли не основная обязанность менеджерского состава, коих на некоторых проектах чуть ли не столько же как технических специалистов.
    DevOps - это не про автоматизацию задач. DevOps - про ускорение этапов разработки и скорости внедрений измнений. Задачи не надо автоматизировать, их надо решать.

    В Ситилинк взяли в команду трёх Рембо-DevOps. Рембо — потому что они не только умеют писать pipeline, но ещё понимают в Linux, в сетях и Kubernetes. Могут нормально развернуть с помощью Kubespray.

    Есть коллеги с сертификатами Cisco, пересобирающими ядра Linux just for fun и умеющие устанавливать Kubernetes тремя способами, не считая через IaC в облаке. И совершенно не считают себя Рембо, вместе с разработчиками пилят проекты по блокчейну. Поэтому перечисленные Рембо скиллы не являются чем-то удивительным. Это скорее всего нормальный джентельменский набор специалиста DevOps.

    Бэкенд-разработчик захотел себе сделать микросервис на Go.

    Паттерн микросервисной архитектуры так не работает. Если есть здесь архитекторы, поправьте меня.

    Комментарии к вашему Итогу:

    • сколько времени заняла разработка всей этой системы?

    • иногда достаточно десяток минут, чтобы уложить весь ДЦ. Вспоминаем историю с простоем Одноклассников. Поэтому 4 часа на внесение правок на несколько сотен инстансов не такой значимый показатель.

    • не считаю достижением, что код в продакшн разработчики деплоят самостоятельно.

    • выше по тексту писали, что DevOps в вашем понимании это ещё про ОС, сети и системы оркестрации. Но в итоге снова скатились к автоматизации процессов.

    • DBA это не про создание новых баз. Совсем.

    Вообще общепринято считается DevOps такая же методология как Scrum, Kanban и т. д. У неё есть цели, задачи, с которыми она работает и способы решения задач. И очень похоже, что её отрадясь у вас не водилось. Микросервисы на Go, Kubernetes и отсутствие необходимости в DBA никакого отношения к этой методологии не имеют.