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

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

В идеале, DevOps-инженер присоединяется к проекту в самом начале, чтобы взять процессы под контроль и наладить их, например, помочь с CI/CD пайплайнами. Но самый ценный опыт я получила, когда работала над проектами на заключительном этапе. Было довольно сложно, потому что все разработчики к тому моменту уже покинули проект, и мне приходилось переносить приложение на новую инфраструктуру без серьезных простоев.

В такой ситуации особенно важно знать, как построить взаимодействие, составить план действий и провести аудит проекта.

Как ставить достижимые цели

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

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

Я предлагаю использовать для этого подход SMART.

Вот некоторые примеры распространенных ошибок, с которыми можно столкнуться при постановке целей:

Цель «Провести аудит проекта» — неизмеримая, потому что невозможно понять конечный результат. Лучше переформулировать ее во что-то более конкретное, например: решить пять самых критических проблем в инфраструктуре службы X. Это описание поможет менеджерам и коллегам по команде понять планы и ожидаемый результат.

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

Последняя цель «Настроить мониторинг для службы X» тоже на первый взгляд кажется вполне удачной. Но не совсем понятен объем работы: можно развернуть весь стек Prometheus или же настроить параметры в конфигурации приложения.

Больше информации о подходе SMART в области разработки ищите в этой статье.

Как провести аудит приложения

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

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

Что проверять:

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

  • Список компонентов и их описание.

  • Список внешних зависимостей: облачные сервисы, внутренние ресурсы и т.д.

  • Управление конфигурацией.

  • Инструкции по локальной разработке.

  • Документацию OPS: мониторинг, логирование, дебаг, деплой.

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

Если чего-то из списка не хватает, то нужно попробовать заполнить пробелы. Это можно сделать следующим образом:

  • Попросить разработчиков написать документацию и помочь команде с этим. Да, писать документацию скучно, но задача DevOps-инженера — начать работу, руководить процессом и объяснить, почему это важно.

  • Пишите документацию так, чтобы она была емкой и достаточно детальной. Ведь чаще всего ей будут пользоваться новые коллеги.

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

DevOps-аудит. На этом этапе главная цель — определить текущие проблемные места (bottlenecks) в текущем процессе разработки.

Что проверять:

  • CI/CD пайплайны.

  • Релизные процессы.

  • Порядок деплоя.

  • Процедуру эскалации в случае возникновения проблем. Все участники должны четко понимать, как действовать в критических ситуациях, какой путь проходит алерт/тикет от момента появления до непосредственного решения и каков ожидаемый результат (поручена ли задача команде разработчиков, отдельной команде поддержки и т.д.).

Необязательно устранять все проблемы разом. Лучше попытаться понять, что на самом деле беспокоит разработчиков: например, есть проблемы со стабильностью CI/CD пайплайнов. Если есть время, то можно сразу взять конкретную задачу в работу или же пометить ее как технический долг.

Как проверить:

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

  • Проверить все CI/CD пайплайны на наличие важных шагов и проверок, а также анти-паттернов. Вероятно, вы сможете внедрить лучшие практики для повышения стабильности и качества кода.

  • Проверить конфигурации сборки и деплоя. Например, отсутствие версионирования или использование тега latest для образов Docker.

Хорошей отправной точкой для передовых практик CI/CD и примером таких практик, связанных с конкретными технологиями, являются helm-чарты.

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

Что проверять:

  • Технологии и инструменты, которые используются для предоставления инфраструктуры.

  • Тип среды: облачная, собственные дата-центры или гибридная.

  • Конфигурация среды.

Как проверять:

  • Проверить среду на соответствие известным требованиям.

  • Проверить файлы, связанные с Ansible-, Terraform-, X-tool на наличие плохих и хороших практик, о которых вы знаете.

  • Проверить процесс управления конфигурацией для этих файлов. Проблемы могут появиться, если для них не производится code review или отсутствует версионирование.

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

Подробнее об аудите инфраструктуры: лучшие практики Terraform и чеклист для проверки готовности приложения к production окружению

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

Что проверять:

  • Dockerfiles, манифесты Kubernetes, Helm-чарты.

  • Конфигурацию среды. Например, есть ли в проекте приватные Kubernetes-кластеры и правила фаервола.

  • Права и роли пользователей.

  • Секреты.

Как проводить аудит безопасности:

  • Ручные или автоматические проверки в репозиториях кода.

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

  • Понять, как секреты передаются в приложение и есть ли какие-то риски, связанные с этим процессом.

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

Что проверять:

  • Логи. 

  • Метрики и алерты для приложения.

  • Метрики и алерты для инфраструктуры, CI/CD пайплайнов, проблем безопасности.

Как провести аудит наблюдаемости:

  • Убедиться, что логи правильно отформатированы и настроены, попробовать запустить поиск в агрегаторе логов (например, Elasticsearch, Graylog).

  • Проверить дэшборды Grafana и метрики приложения и убедиться, что они содержат всю важную информацию.

  • Убедиться, что алерты являются индикатором каких-то проблем и отражают неработоспособность какой-то части приложения. 

Если в приложении много микросервисов и сложных цепочек запросов, можно предложить внедрить tracing запросов.

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

Набор DevOps-инструментов: первая помощь

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

Документация:

  • Лучше иметь решение со встроенным версионированием: например, Markdown-/Github-/Gitlab-страницы или вики-страницы Confluence.

  • Notion. Инструмент с удобным интерфейсом. Будет полезен, если проект не очень большой.

  • Backstage от Spotify. Инструмент с приятным интерфейсом, большим количеством функций и плагинов.

Деплой в Kubernetes:

  • Helmfile — для декларативного развертывания (особенно для приложений, связанных с инфраструктурой).

  • Helm-docs — автоматически генерируемый README для helm-чартов.

  • Helm-diff — плагин helm для отображения различий перед деплоем чарта.

  • Chart-testing — линтер для helm-чартов по заданным правилам.

  • Kubeval — проверяет манифесты на соответствие различным версиям Kubernetes.

  • Pluto — обнаруживает устаревший API в кластере Kubernetes.

Еще несколько интересных инструментов можно найти в списке awesome-helm.

Инфраструктура:

  • Molecule — фреймворк для тестирования ролей Ansible. Если инфраструктура построена с использованием Ansible, это решение идеально подходит для проверки ролей перед их применением.

  • Terraform pre-commit hook — поддерживает инструменты Terraform (например, tflint, tfsec), интегрируется локально или в CI. Поможет сохранить единообразие файлов Terraform в нескольких репозиториях и ускорить процесс проверки кода. 

  • TFSwitch — удобный инструмент управления версиями Terraform.

Демо-сценарий с Molecule и Github Action.

Контейнеры:

  • Hadolint — тестирование Dockerfiles на соответствие лучшим практикам.

  • Dive — просмотр содержимого образов Docker.

  • Kaniko — создание образов Docker без Docker.

Безопасность: 

  • Trivy — сканер образов Docker, репозиториев Git и файловых систем.

  • Polaris — анализ рабочей нагрузки с использованием best-practices в Kubernetes.

  • Kube-bench — инструмент CLI с теми же функциями, что и Polaris, но немного другими проверками.

Локальная разработка: 

  • Minikube — прост в использовании, имеет кучу полезных плагинов.

  • Kind — Kubernetes в Docker, поддерживает работу с несколькими нодами.

  • Skaffold — проект, который позволяет разработчикам легко создавать и развертывать свои приложения в Kubernetes.

  • Telepresence — позволяет разработчикам перенаправлять трафик из кластера на локальный компьютер и многое другое.

Вместо заключения

Теперь у вас есть все необходимое, чтобы погрузиться в проект любой сложности, провести аудит и подготовить план необходимых изменений. Я постаралась привести список источников и инструментов, которые сделают этот путь немного короче и легче. Буду рада ответить на вопросы!

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


  1. wenger86
    29.11.2021 17:16
    +4

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


    1. mariarti0644 Автор
      30.11.2021 13:07
      +1

      спасибо!


  1. bestann
    29.11.2021 21:09
    +1

    https://rancherdesktop.io/ вместо minikube использовали? Только он для mac и Windows.

    Внедряли у себя тесты CIS Benchmark? Есть для Linux (разных версий, тут я как раз пишу роль для проверки), Nginx, Docker, для кубера вроде есть kube-beacon (я так понимаю, тот же функционал, что и kube-bench).

    Для деплоя в Kubernetes Argo CD еще не внедряли?

    Для ведения собственной документации (дома локально + можно синхронизировать стандартно в Гугл, т.к. их синхронизация платная) использую Obsidian https://obsidian.md/download — там всё в Markdown.


    1. mariarti0644 Автор
      30.11.2021 13:17
      +4

      Добрый день!
      Ранчер десктоп еще не приходилось использовать. В minikube в первую очередь привлекает стабильность работы, скорость обновлений и возможность включать/выключать встроенные плагины. В любом случае, спасибо за рекомендацию. В свободное время изучу инструмент :)

      CIS Benchmark доводилось использовать только как встроенную функцию в Rancher. Инструментов для проверки безопасности появилось достаточно много за последние пару лет - и есть из чего выбрать. В большинстве проектов хватало первичного аудита текущего состояния. Дальше по результатам формировался беклог/секьюрити задачи. Ну а постоянные проверки запускали сторонней командей на регулярной основе. Там уже они сами выбирают для себя инструменты и подходы.

      С ArgoCD мне доводилось работать несколько раз, но в боевых проектах применять не удавалось. Он либо был слишком накрученным и я делала выбор в пользу того же FluxCD, либо ему не доставало гибкости в настройке. Опять же для интеграции инструментов из категории GitOps в крупных компаниях, необходимо предоставить возможность быстрых роллбеков, контроль процесса деплоя, быструю обратную связь: нотификации, дашборды, кастомные интерфейсы, ну и контроль доступа/безопасности. В этом плане приходится выстраивать целую экосистему вокруг одного инструмента, а это не всегда целесообразно ;)

      За рекомендацию Obsidian - отдельное спасибо. Пока для своих целей использую Notion, но это не всегда оказывается удобным.


  1. mrgreyves
    30.11.2021 12:48

    Здравствуйте!

    Отличная статья, понравилось ^_^

    Кста, то канико мы отказались в пользу ванильного докера, так как у нас выделенные раннеры, а втаскивать новый инструмент не стали. (Сравнили производительность на сборках, по итогу разница была не более чем в 5-10 секунд)

    Polaris тоже понравился в свое время, казалось что пишем вроде бы норм вещи, но Polaris подсветил вещи на которых глаза уже замылены =)


    1. mariarti0644 Автор
      30.11.2021 13:35
      +3

      Добрый день! Спасибо за фидбек :)

      По поводу канико vs docker все довольно спорно. В ситуации, где раннеры в кубернетесе, хочется избежать предоставления привилегированного доступа + докер собираются убирать в одной из следующих мажорных версий Kubernetes, поэтому нам не хотелось оттягивать нужное изменение. В последних версиях у канико также появились проблемы со стабильностью - периодически возникают весьма странные баги. Но с другой стороны инструмент хороший, позволяет одной командой пушить образы в несколько реджистри и особо проблем не доставляет. Главное, указывать конкретный докер тег в своих пайплайнах :)

      У Polaris просто супер UI, который нестыдно пошарить с разработчиками/лидами/менеджерами, что бывает очень даже полезно.


  1. tv1n
    30.11.2021 14:02
    +1

    Очень круто написано, у меня пока очень мало опыта в DevOps, но я понял почти всё


  1. QtRoS
    01.12.2021 07:50

    Я не понял, как тема "построить с нуля" свелась к "как провести аудит того, что есть". Как быть если вообще ничего нет: ни пайплайнов, ни CI/CD, ни K8S? Возможен альтернативный сценарий, когда что-то есть, но развитие и эволюция не приносит результата, нужна революция в виде построения с нуля. Было бы интересно послушать про такой опыт.


    1. mariarti0644 Автор
      02.12.2021 08:57
      +3

      Добрый день! Спасибо за ваш фидбек и вопрос.

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

      Если вы начинаете вести проект с нуля, то можно попробовать пойти следующим образом - задать несколько вопросов и в обсуждениях найти на них ответы:
      1. Что у меня есть сейчас? (только код / сборка / тестовая среда ..)
      2. Что я хочу получить? (чтобы работало / гибкость / масштабирование ..)
      3. Какие инструменты я могу / хочу использовать?
      4. Чем я ограничен? деньги на этот проект, глобальные подходы в компании, существующие решения.


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

      1. Сейчас у нас есть кодовая база, тесты
      2. Мы хотим получить артефакт сборки, задеплоить его в конечные окружения, уметь быстро масштабироваться под новых клиентов
      3. Если я в облаке, то я могу быстро попробовать затащить приложение в Docker (образ = артефакт), задеплоить сырые манифесты или helm-ом в Kubernetes и проверить автомасштабирование под нагрузкой
      4. Нужно в AWS/GCP/Azure калькуляторе посчитать затраты. Если в компании уже есть свой Kubernetes кластер, то можно его переиспользовать или поднять аналогичный.
      Если денег не дают, то берем и поднимаем нужно число виртуалок, процесс деплоя описываем Ansibl-ом и заворачиваем в пайплайн в нашем CI/CD инструменте.

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

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

      Если у вас есть еще вопросы, то задавайте! Постараюсь ответить :)


      1. QtRoS
        02.12.2021 17:03

        Спасибо, ответ обстоятельный, но немного не о том :) Перечисленные шаги 1-4 вполне может сделать менеджер проекта или тимлид. Они описывают стратегические решения, процессы, управленческие вопросы, бюджеты. А мне хочется техники. Ведь весь DevOps сейчас не сводится к выкладке через Docker/K8S/Облака? <мем с Падме и Энакином.png> Что если проект не ложится в контейнер? Как организовать сборки проекта с учетом версионирования, релизной политики? Какие инструменты следует использовать, какие у них слабые и сильные стороны? Как хранить "паспорт контура" (набор переменных от среды к среде параметров) и как накатывать его автоматом? Как развертывать новые тестовые контура по требованию?

        Вопросов десятки :) Я когда-то запарился и написал статью, в которой реально все рассказано с нуля, разжевано для самых маленьких. Было бы очень круто услышать альтернативное видение.


        1. mariarti0644 Автор
          07.12.2021 15:37

          Возможно, разбор техники будет в какой-нибудь следующей статье :) Основной идее этой было дать какую-то отправную точку тем, для кого подобные задачи ставятся впервые и нужно с чего-то начать. Про каждый инструмент написаны десятки статей тут и на медиум, с подробным сравнением и описанием сценариев, поэтому не думаю, что смогу привнести что-то новое.

          С вашей статьей я ознакомилась - это здорово, что вы собрали и упорядочили свой опыт, чтобы создать end-to-end руководство для начинающих.
          Думаю, что читатели найдутся на все в текущих реалиях. :)


  1. chemtech
    03.12.2021 15:50

    Спасибо за пост. Рассматривали ли вы tfenv как замену TFSwitch, и helmwave как замену Helmfile ?


    1. mariarti0644 Автор
      07.12.2021 15:24

      Добрый день! C tfenv не сложилось - написан на руби и меньше фич, по поводу helmwave - я видела этот продукт и он показался мне довольно сырым, не смотря на интересные возможности) Возможно, стоит еще раз попробовать с ним поэкспериментировать - спасибо за наводку.