DevOps: задачи и инструменты
Development Operations (DevOps) — это методология, сочетающая принципы разработки и эксплуатации IT-решений для повышения скорости и качества поставки ПО. Этот подход, зародившийся в конце 2000-х годов, стал стандартом в крупных технологических компаниях, а его внедрение остается актуальной задачей для многих организаций. В этой статье мы разберем на примере практики SimbirSoft, в чем роль DevOps-инженера и с какими технологиями он работает.
DevOps-инженер — кто это?
DevOps охватывает три этапа жизненного цикла IT-продукта: непосредственно разработку, тестирование и сопровождение. Профессия DevOps-инженера предполагает, что он погружен во все перечисленные области и за счёт этого может выбрать такое техническое решение, которое снизит риски конфликтов в IT-системе.
Он выступает связующим звеном между командами разработки, тестирования и системного администрирования, поэтому должен обладать разносторонними навыками: от системного администрирования и программирования до работы с облачными платформами и инструментами автоматизации.
Задачи DevOps:
-
Доставка кода до стендов. Специалист осуществляет перенос написанного разработчиком кода на сервера.
-
Обеспечение работоспособности инфраструктуры. DevOps-инженер определяет требования к инфраструктуре и формирует её, обеспечивая соответствие этим требованиям (например, заказывает необходимые мощности, если система размещена на облаке).
-
Мониторинг и исследование проблем производительности. Для устранения любых сбоев важно их локализовать, и для этого необходима централизованная система мониторинга с дашбордами. Например, зная динамику заполнения жёсткого диска, мы можем определить, что место скоро закончится и пора принимать меры, чтобы предотвратить проблемы. Для предсказания неполадок в последние годы стали внедряться AI-алгоритмы.
-
Создание и поддержка окружений. Мы в своей практике, как правило, создаём окружения для разработки, тестирования, препрода и продакшна – пользователи системы непосредственно взаимодействуют только с последним из них (подробнее об этом мы рассказывали ранее).
-
Автоматизация рутинных процессов. Сюда относится не только CI/CD, но и настройка автотестов, управление конфигурациями, резервное копирование и другие повторяющиеся процессы.
-
Постоянное слияние изменений в общую версию через систему контроля версий (Git);
-
выполнение автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов;
-
решение интеграционных проблем.
-
минимально необходимые права, чтобы сократить влияние человеческого фактора и риски в области безопасности;
-
минимально необходимая инфраструктура для оптимизации расходов.
Процессы CI/CD включают в себя:
Таким образом, мы программируем процесс деплоя – перемещения кода на сервер. При этом хорошая практика – руководствоваться в своей работе необходимым минимумом:
Также специалист должен заложить гибкую архитектуру, чтобы проект было легко масштабировать в случае его дальнейших изменений. В этом случае добавление новых компонентов потребует относительно небольших трудозатрат.
Преимущества
DevOps – достаточно молодая методология, и о её пользе в отрасли информационных технологий спорят до сих пор. В нашей практике мы видим следующие преимущества DevOps:
-
автоматизация рутинных процессов и минимизация человеческого фактора;
-
сокращение Тime-to-market;
-
снижение частоты отказов новых релизов.
Наши выводы подтверждает статистика. Так, согласно исследованию Gitlab, DevOps вносит положительные изменения во все процессы создания продукта, например:
-
Разработка. Почти 83% разработчиков говорят, что после внедрения DevOps релизы происходят быстрее, чем раньше, а 25% отметили 10-кратное увеличение скорости.
-
Тестирование. 35% участников исследования, использующих DevOps, в значительной степени автоматизировали свои задачи. Один из самых популярных инструментов для тестирования – Selenium.
Ключевые подходы в DevOps
1) Новая парадигма администрирования
Многие компании постепенно уходят от старой парадигмы администрирования серверов – ручного деплоя, который, как правило, применяли в работе с монолитными приложениями. При этом системные администраторы вручную устанавливали приложения на сервера: настраивали «железо», самостоятельно отправляли в продакшн готовые проекты и т.д. Такой подход называют Pet, проводя аналогию с обслуживанием домашних питомцев: если их немного, то владелец обычно сам отвозит их в ветеринарную клинику для всех процедур.
DevOps зачастую следует другой парадигме – Cattle, или большое поголовье животных, подобранных для решения определённых задач. Рассмотрим на примере участия лошадей в состязании, в котором нужна высокая скорость. Используя подход «домашнее животное», мы купим новый корм или подковы, чтобы «улучшить» питомца. Однако, используя другой подход, мы будем рассматривать коня как рабочую единицу, которая не отвечает заявленным характеристикам и требует замены. Если применить этот пример к администрированию, в некоторых ситуациях выгоднее развернуть новый сервер, а не тратить время на модернизацию старого.
Такой подход стал возможен во многом благодаря тому, что инфраструктура теперь описывается в виде кода (Infrastructure as Code) и позволяет минимизировать рутинные операции.
Пример. Вам нужно заменить путь до того или иного файла сразу на 100 серверах. Для того чтобы сделать это вручную, системному администратору пришлось бы создавать bash-скрипт – файл, в котором прописывают алгоритм команд и программу, выполняющую его. Однако сейчас мы просто зайдём в репозиторий для хранения данных, изменим там код и развернём его всего в несколько кликов.
2) Logging & Monitoring
С помощью логирования и мониторинга DevOps решает задачу по выявлению любых сбоев в системе до того, как с ними столкнутся пользователи.
Логирование – это регистрация изменений, происходящих внутри действующей программы. Полученная информация даёт представление о состоянии сервиса во время взаимодействия с пользователем, в частности, о возникающих проблемах. Эти данные помогают разработчикам анализировать работы продукта на практике и оперативно устранять неполадки.
Мониторинг – сбор показателей производительности, в том числе из логов – наглядно предоставляет агрегированную информацию о состоянии сервиса. Необходим как для оценки работоспособности продукта, так и для выявления тенденций в регистрируемых результатах. Например, если зафиксирована повышающаяся нагрузка на приложение, можно спрогнозировать, когда будет необходим дополнительный сервер.
Говоря простыми словами, если бы программа была тюрьмой, тогда мониторинг стал бы сигнализацией, а логирование – системой видеонаблюдения. Первая помогает вовремя отреагировать, а вторая – восстановить ход событий, найти причины и внести необходимые изменения.
В числе популярных инструментов для логирования – ELK Stack, Graylog, Splunk. Мы используем в качестве централизованной системы сбора логов ELK Stack: Elasticsearch для хранения и поиска, Logstash для real-time сбора и обработки логов, Kibana для визуализации собранных данных и упрощения их анализа. Также этот стек позволяет настроить алерты (уведомления), которые будут срабатывать при определённом триггере (событии) в режиме реального времени. Например, если сайт был недоступен в течение 1 минуты, то система направляет алерт специалисту в заранее выбранный мессенджер – от Slack до Telegram.
Для мониторинга используют такие сервисы, как Zabbix, Cacti, New Relic, Nagios, Prometheus. Мы в своей работе чаще используем Prometheus – это экосистема, которая включает в себя и другие вспомогательные инструменты DevOps, в том числе Alertmanager. Приложение может отправлять уведомления на различные платформы, в частности в мессенджеры. Таким образом, при выходе собранных метрик за заданные рамки мы оперативно получаем сообщение.
Для визуализации данных мониторинга, на наш взгляд, отлично подходит Grafana. Дашборды можно настраивать под конкретный проект, и для этого можно использовать графики, таблицы, тепловые карты и др.
Grafana: Перечисленные сервисы помогают минимизировать время простоя в случае сбоев в работе того или иного продукта.
3) Clouds, Terraform
Использование облачных серверов позволяет быстро развернуть инфраструктуру проекта, а также обеспечить отказоустойчивость. Так, мы можем заказать серверы в дата-центрах Москвы, Санкт-Петербурга, Новосибирска и других городов. В случае поломки нам не нужно будет срочно искать её причину, поскольку ответственность за оказание услуги несут специалисты дата-центра: они сами подключат другой сервер или устранят неполадки.
В числе провайдеров можно отметить мировых гигантов – Google Cloud, AWS (Amazon Web Services), Microsoft Azure и др. – и российские компании – Yandex.Cloud, Selectel Cloud Platform и т.д.
Мы используем Terraform для управления облачной инфраструктурой. Это инструмент, который позволяет работать в парадигме Infrastructure as Code. При этом необходимо описать конечный результат, к которому мы хотим привести наш виртуальный сервер, в виде привычного для специалистов языка – кода. Чтобы автоматизировать конфигурирование созданных серверов, можно использовать инструменты управления конфигурациями (Ansible, Chef, Puppet). Далее Terraform обращается к API облачного провайдера и совершает заданные действия. В итоге инфраструктура разворачивается в короткие сроки, всего за 15-20 минут. Когда нам нужно будет внести изменения, достаточно будет исправить только необходимые фрагменты кода, при этом результат увидит вся команда.
Описанный подход упрощает администрирование: даже если проект был запущен давно, вам не нужно запоминать все настройки – их в любой момент можно проверить и поправить в репозитории. Важно помнить, что высокая скорость изменений тоже может быть риском, поэтому Terraform требует от специалистов ответственного подхода.
4) Контейнеризация и оркестрация: Docker и Kubernetes
Эволюция software development и облачных платформ привела к появлению подхода Cloud Native, где вместо единого сервиса продукты проектируются на основе независимых частей – микросервисов. Управлять такими распределёнными системами вручную невозможно – каждый микросервис может требовать свои уникальные зависимости, поэтому их не всегда возможно запустить в одной среде. В решении этой проблемы получила широкое распространение контейнеризация.
Docker – это инструмент с открытым исходным кодом стал стандартом де-факто для контейниризованных приложений. Если представить программное обеспечение как груз, то Docker — это универсальный контейнер, который содержит Source Code (само приложение), все его зависимости и настройки среды разработки. Это гарантирует, что функции приложения будут одинаково работать и на машине разработчика, и на стенде тестирования и развёртывания, и в продакшн-environment. Использование Docker устраняет проблему «а у меня работает» и ускоряет цикл разработки.
Однако управлять сотнями таких «контейнеров» вручную — трудоёмкая задача. Здесь будет полезна система оркестрации контейнеров, и лидером этого рынка является Kubernetes. Kubernetes — это Open Source-система для Linux, отвечающая за автоматизацию развёртывания, масштабирования и управления приложениями. Она действует как «диспетчер» в большом порту: автоматически размещает контейнеры (Docker-образы) на доступных «судах» (серверах), следит за их исправностью и, если один «корабль» тонет (сервер падает), перераспределяет «груз» (процессы) на другие.
Функции включают автоматическое обнаружение сервисов, балансировку нагрузки, добавление секретов приложений и баз данных с сохранением конфиденциальности. Kubernetes позволяет разработчикам описывать желаемое состояние инфраструктуры декларативно, что роднит его с подходом Terraform. Интеграция Kubernetes с CI/CD-конвейерами, например, с Jenkins, позволяет создать полноценный конвейер для непрерывной поставки. Перечисленные инструменты (Docker, Jenkins, Kubernetes) часто образуют ядро современного стека лучших методологий DevOps, позволяя эффективно автоматизировать рутинных задач по сборке, проверке на отсутствие ошибок и доставке программного обеспечения конечным пользователям.
Приглашаем узнать подробности о работе наших DevOps-инженеров и услугах технической поддержки!