December 13, 2019

17 шагов DevOps

Нет времени на видео? Краткое содержание ролика в статье: время прочтения 7 минут.

Что такое DevOps?

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

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

В DevOps-инженеры часто идут системные администраторы. У них достаточно похожий бэкграуд в плане знаний.

В чем разница между системным администратором и DevOps-инженером?

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

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

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

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

Индустрия DevOps

За последний год порядка 2 млрд человек совершили покупки на 1,5 трлн $. И все это онлайн-проекты. К примеру онлайн-сервис Amazon, внедрив DevOps-практики, смог начать изменять свой продукт 7000 раз в сутки.

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

Пример на базе нашего агентства Fevlake. Мы работаем с 2012 года, и последние 2 года мы наблюдаем огромный ажиотаж вокруг DevOps-практик. Все компании хотят их внедрять, чтобы постоянно изменять свой продукт в лучшую сторону. Среди наших клиентов финтех-стартапы, криптобиржи, маркетплейсы, развлекательные сервисы, телеком, государственные компании.

17 шагов до DevOps-инженера

Чтобы войти в профессию, никаких специальных требований к DevOps-инженеру не предъявляется. Но я бы выделил 4 базовых пункта, без которых будет тяжело развиваться:

  • знание окружения, где вы планируете работать (Windows, Linux и др. на уровне Middle - Senior);
  • сети (на базовом уровне);
  • знания Junior developer (общее понимание);
  • Junior DBA.

Итак, переходим к 17 шагам. Общая идея такая - мы с вами будем настраивать весь процесс деплоимента от написания кода до развертывания его на продакшене.

1. API

  • Изучить, что такое API. 
  • Какие виды API бывают, как с ними работать?

И реализовать их, например, сделать простой проект - интернет-магазин. То есть вам необходимо спроектировать API этого магазина и реализовать его на любом известном вам языке программирования. Если вы не знаете ни одного языка, можно изучить Golang - пройти тур на официальном сайте http://tour.golang.com/

2. Базы данных

  • Добавить базу данных MySQL или Postgress.
  • Поработать с запросами.

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

3. Git

Заливаем ваш код на любой хостинг Git-репозиториев.

Начнем работать с кодом, как должны работать с ним ваши разработчики.
Вы регистрируетесь на GitHub , Bitbucket , Gitlab или любом хостинге Git-репозиториев и заливаете туда свой код. Именно с этого момента начинается ваша автоматизация по работе с кодом.

4. Автоматизация / Jenkins / Teamcity / Gitlab CI

  • Jenkins / TeamCity / Gitlab CI
  • Сборка кода
  • Заготовка будущего Pipeline

Автоматизируем сборку вашего кода. Если вы выбрали в качестве языка программирования что-то компилируемое, то мы будем с помощью таких инструментов, как Jenkins, Teamcity, Gitlab CI, автоматизировать сборку кода. К концу этого шага вы должны получить небольшую заготовку вашего будущего pipeline. У вас уже будет код в репозитории, и мы будем автоматически собирать его с помощью CI/CD инструментов.

5. Автоматизация сборки кода

Теперь мы автоматизируем этот процесс. Как только код в Git-репозитории изменился, вам необходимо будет запускать сборку на выбранном инструменте.
Делать это можно различными способами:

  • Заставить CI/CD систему саму опрашивать Git-репозитории на наличие изменений.
  • Использовать web-хуки от облачных провайдеров.

6. QA

Вам будет необходимо добавить новый шаг к вашему pipeline. Сборка у нас уже есть, теперь мы будем автоматически проверять ваш код.

Вы можете посмотреть различные линтеры для вашего языка программирования. Также можно проверять синтаксис и проводить Unit-тесты.

7. Infrastructure as a code

Переключимся на эксплуатацию. Вы должны вооружиться такими инструментами как:

  • Ansible,
  • Puppet,
  • Chef

и описать свою инфраструктуру в виде кода. Сейчас в топе по различным проектам Ansible. Если интересно посмотреть в сторону кода, рекомендуем Chef.

Итогом этого шага должен стать еще один Git-репозиторий, в котором будет написана ваша инфраструктура. Благодаря этому репозиторию, вы сможете создавать свои тестовые и продакшн окружения в 1 клик.

8. Разворачиваем тестовые/продакшн среды.

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

  • Vagrant,
  • Terraform.

Vagrant больше подходит для создания dev-сред разработчиков, хотя с внедрением Docker он отошел на второй план.

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

Этот пункт нам понадобится для того, чтобы мы в 1 клик мыши могли поднять нашу инфраструктуру, поднять виртуальную машину и настроить ее с помощью Configuration System Management утилит (с помощью Ansible/ Chef / Puppet и др.) и дальше развернуть на это окружение наше приложение.

9. Автоматизируем процесс создания виртуалок и подключаем его к выбранному CI/CD инструменту.

Если вы используете Jenkins, то подключайте соответствующий плагин и после прогонов тестов на вашем приложении вы должны прогнать новую виртуалку, настроить ее с помощью Ansible и развернуть туда ваше приложение.

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

10. Best practices по деплою выбранного вами языка программирования

Наверное, это самый сложный поинт в 17 шагах, если вы только начинаете.
В этом блоке, вам будет нужно найти, именно найти, best practices по необходимому языку программирования. Сложность в том, что лучшие решения по разным языкам программирования сильно отличаются и вам нужно понимать, как запускаются различные проекты.

Обычно best practices находятся на официальных сайтах различных языков программирования.

11.Реализация  best practices, которые вы нашли в предыдущем шаге.

Это может быть абсолютно любой деплоймент с применением различного стека технологий.

Это может быть деплоймент с помощью deb или rpm пакетов, деплоймент с использованием симлинков, таких инструментов, как Kapistrano / Ansistrano, Docker и др.

12. Вернемся к QA.

К 12 шагу у нас должен храниться код в репозитории, также должен быть создан отдельный репозиторий с описанием инфраструктуры. Должен быть настроен CI/CD инструмент, который автоматически, при изменении кода в репозитории, будет его собирать, тестировать, разворачивать новое окружение и выливать приложение на вновь созданное окружение.

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

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

  • Loader IO
  • Yandex Tank
  • Apache Benchmark

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

Зачем это нужно?
Если у разработчиков релизы выходят не 1 раз в 2 недели, а, например, 5 раз в день, им надо оперативно понимать, работает приложение или нет, иначе они запутаются и не смогут оперативно найти проблему. 12 шагом мы позволяем узнавать, работает приложение или нет, за 5 минут после запуска.

13. Feedback

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

  • time series database
  • попробовать Prometheus
  • попробовать Graphite
  • InfluxDB

Сравнить их и посмотреть, что будет лучше для вашего проекта. Они все работают немного по-разному и по-разному хранят данные. Например, с Graphite вам придется использовать StatsD, потому что Graphite в диапазоне меньше 1 секунды. В InfluxDB вы столкнетесь с тем, что вам придется настраивать различные сборщики.

Главная задача в 13 пункте - подключить ваше приложение к мониторингу.

14. Добавляем и улучшаем мониторинг.

Попробуйте такие сервисы, как:

  • pagerduty
  • slack
  • opsgenie

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

15. Переключаемся на Docker - на новую абстракцию.

К 15-му шагу у вас должен получиться жирный Pipeline:

  • ваш код хранится в Git-репозитории;
  • вы его автоматически собираете, тестируете;
  • разворачивается новое окружение;
  • прогоняете smoke-тесты;
  • прогоняете нагрузочное тестирование;
  • выкладываете его в продакшн.

На 15-м шаге можно все это забыть и переключиться на Docker - новую абстракцию. На этом шаге придется изучить Docker file. Что такое Docker образы, как их собрать. Основная задача на этом шаге - написать Docker file для вашего приложения, чтобы собирался образ и выкатывался в registry.

16. Docker compose и системы оркестрации

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

После чего стоит посмотреть в сторону систем оркестрации. Что они делают? Можно посмотреть swarm или Kubernetes. Kubernetes сейчас популярен, но достаточно сложен в изучении.

17. Переделываем весь наш pipeline и переводим его на Docker.

  • С помощью Jenkins, Teamcity или Gitlab CI (любой инструмент, который вы выбрали в начале) собираем ваше приложение в Docker контейнер.
  • Закидываем получившийся образ в Docker registry.
  • Запускаем этот образ на системе оркестрации Kubernetes.
  • Прогоняем на нем smoke-тесты, нагрузочное тестирование.
  • Деплоим в продакшн.

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

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

Необходимый минимум для работы DevOps-инженером (по данным hh.ru)

  • Docker
  • Git
  • Python
  • Bash
  • Linux

Также растет спрос на Microsoft Azure и Kubernetes.

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