Roadmap для тех, кто собирается в DevOps
Многие, кто изучает DevOps, ориентируются на Roadmap.sh. Это классный ресурс, который помогает понять, какие компетенции нужно приобрести в профессии. Но в нём очень много информации, начинающие специалисты рискуют утонуть в деталях. Мы разработали свой Roadmap на основе опыта спикеров Слёрма. Он сделан с учётом российских реалий, разбит на уровни, фокусирует внимание на том, что в первую очередь понадобится для старта и роста в профессии и содержит ссылки на наши платные и бесплатные курсы. Статья будет полезна разработчикам и системным администраторам, которые хотят перейти в DevOps.
В августе 2023 года мы сделали вебинар Roadmap для DevOps, который провёл SRE-инженер Dodo Максим Гусев. Сейчас предлагаем ознакомиться с этим Roadmap в виде статьи, дополненной подробностями. Пойдём от простого к сложному. Если вы уже владеете основными навыками, то сразу переходите к Basic Skills.
Основные навыки
Это навыки, без которых в DevOps вообще никак. Если заглянуть в вакансии, то можно заметить, что практически везде будет указано: «Требуется уверенное знание Linux и Git».
Уверенно пользоваться Linux
Большинство серверов и сетевых устройств работают на Linux (хотя встречаются и другие Unix-подобные ОС). Поэтому путь в DevOps стоит начать именно с подробного изучения Linux. Часто в DevOps идут Linux-администраторы, которым захотелось сменить задачи.
Для DevOps-инженера важно разбираться в устройстве Linux, загрузке и инициализации системы, структуре каталогов и уметь работать в терминале:
Создавать и редактировать файлы.
Запускать программы и настраивать сервисы (например, в Systemd).
Управлять пользователями, группами и правами доступа.
Устанавливать ПО из репозиториев, производить сборку и компиляцию.
Делать обновления и бэкапы.
Настраивать сетевые соединения и фаерволы.
Мониторить процессы.
Автоматизировать рутину, писать скрипты на Bash.
С технической точки зрения Linux — это ядро операционной системы, но обычно, когда говорят о Linux, имеют в виду GNU/Linux — комбинацию ядра Linux и GNU-компонентов (ПО и библиотек). Для удобства использования и настройки Linux-систем существуют различные «сборки» или дистрибутивы. Разумеется, не нужно сразу осваивать все дистрибутивы, лучше сосредоточиться на самых популярных или тех, которые используются в вашей компании. Например, RHEL и его семейство (CentOS, Fedora), Debian, Ubuntu и специфичные для России: Astra Linux, ALT Linux и т. д.
В Слёрме есть несколько курсов по Linux:
Linux База — бесплатный курс, который поможет сформировать навыки Linux-администратора.
Linux Мега — практический курс с best practices, написанием скриптов и заглядыванием под капот Linux.
«Нужно чётко понять, насколько человек разбирается в сетях, в линуксовом ядре, в том, как работает память и процессы. Ещё важно, какие команды он знает и как их применяет. Я должен быть уверен, что человек в Linux не вводит каждую команду в обнимку с гуглом», — Максим Гусев, SRE-инженер в Dodo.
Работать с Git
Git — это система контроля версий. DevOps-инженер должен знать этот инструмент немного глубже, чем разработчик. Проверьте себя: знаете ли вы эти команды, понимаете ли, для чего они нужны и как ими пользоваться?
git diff
git add
git commit
git log
git reset
git branch
git merge
git rebase
git cherry-pick
git stash
git push
git fetch
git pull
git remote
Если не удалось без гугла вспомнить хотя бы треть этих команд, то рекомендуем пройти бесплатный курс Git для начинающих. В нём рассматривается бо́льшая часть из этого списка.
DevOps-инженер должен не только разбираться в коммитах, тегах и ветках, но и понимать workflow — набор процессов, процедур и подходов, которые команда разработки использует в своих проектах и, в частности, как работает в Git.
Начать изучение Git можно с философии командной разработки и принципов контроля версий кода. В дальнейшем нужно научиться работать с популярными платформами GitHub и GitLab и уметь:
Создавать репозитории, организовывать к ним доступ для разных типов пользователей.
Решать сложные кейсы по слиянию веток и разрешению конфликтов слияния.
Иметь представление, что такое CI/CD (а ещё лучше — разбираться) и как в этом задействован Git.
»Я хочу убедиться, что человек реально понимает, чем отличается GitHub Flow от GitLab Flow и как тот или иной flow может повлиять на процессы разработки», — Максим Гусев, SRE-инженер в Dodo.
Есть и другие Flow: Forking workflow, Centralized workflow. Подробное описание и сравнение различных Flow можно найти в материалах от Atalassian (на русском) и от GitKraken (на английском).
Basic Skills
Владеть инструментами автоматизации
Для DevOps-инженера каждый раз выполнять повторяющиеся действия вручную — плохая практика. Он должен уметь две очень важные вещи:
Автоматизировать рутину. То есть всё, что можно относительно просто и надёжно автоматизировать у себя, у разработчиков, у тестировщиков, у саппорта и других команд, нужно постараться автоматизировать.
Добиваться оптимизации. Оптимизация — это уже результаты проделанной работы по автоматизации, когда процессы разработки становятся быстрее и проще и никому при этом не вредят.
DevOps-инженерам и системным администраторам когда-то потребовалось избавиться от однотипной работы с сотнями серверов. Так появились инструменты автоматизации развёртывания: Ansible, Puppet, Chef. С их помощью один DevOps-инженер может в короткий срок поднять целую армию серверов с заранее сконфигурированными настройками.
В большинстве вакансий DevOps-инженеров сейчас требуется знание Ansible. Поскольку это самый популярный инструмент, мы рекомендуем изучать его. Что точно нужно знать и уметь в Ansible:
Знать основные примитивы (плейбуки, модули, плагины).
Знать, что такое идемпотентность.
Уметь читать и писать плейбуки.
Уметь работать с модулями, ролями и плагинами.
«Я люблю спрашивать разницу между модулем и плагином. Потому что оказывается, что многие вообще не знают, что есть что и за что это всё отвечает», — Максим Гусев, SRE-инженер в Dodo.
Многочисленные конфиги и скрипты — это тоже код, который нужно бережно хранить. За это также отвечает DevOps-инженер. Поэтому Ansible тесно связан со знанием концепции Infrastructure as Code (IaC).
Уметь собирать образы контейнеров в Docker
Контейнеризация — это подход, при котором приложение и все его зависимости (библиотеки, конфигурационные файлы и т. д.) упаковываются в специальный образ. Из него затем можно запустить изолированный контейнер. Контейнеризация позволяет безопасно переносить сервисы с машины на машину и не беспокоиться, что из-за зависимостей что-то полетит.
Технология контейнеризации перекочевала в разработку из Linux. В 2013 году появился инструмент Docker, с которым связывают бурное развитие контейнеризации. Из репозитория с исходным кодом и доступных образов можно за пару минут без танцев с бубном упаковать своё приложение в образ. Поднять инфраструктуру на контейнерах можно за несколько часов.
Однако DevOps-инженеру недостаточно только копипастить образы и делать docker run/docker compose up. Вот что понадобится в реальной работе:
Знать абстракции и команды Docker и Docker Compose (один из плагинов Docker).
Уметь собирать свои образы контейнеров.
Знать, что под капотом у Docker.
Запускать контейнеры в Kubernetes.
Писать Dockerfile, знать ключевые инструкции и их применение.
Работать с образами и реестрами образов.
Знать о существующих альтернативах и иметь общее представление об их отличиях от Docker«а.
Проверить, насколько вы готовы к реальным кейсам сборки образов, можно на открытых кейсах — DevOps Cases.
Разумеется, полезно изучить best practices по Docker. Они доступны в официальной документации по этой ссылке.
Уметь строить CI/CD
Непрерывная интеграция (Continuous Integration, CI) и непрерывная доставка (Continuous Delivery, CD) — это концепция и набор принципов, которые помогают разработчикам быстрее выкатывать новые фичи и при этом сохранять надёжность своего программного обеспечения.
На этапе интеграции новый код при заливке в репозиторий автоматически проходит сборку и тестирование. На этапе доставки собранное приложение разворачивается на стейджинг (серверы для внутреннего тестирования) или продакшн (боевые серверы, обслуживающие реальных пользователей). Вот как о непрерывных методах интеграции, доставки и развёртывания рассказывает Atlassian.
CI/CD можно реализовать как с контейнерами, так и без них. DevOps-инженеру нужно хорошо знать хотя бы один CI/CD-инструмент. Например, Jenkins или GitLab CI/CD. На самом деле их намного больше, но на собеседованиях обычно проверяют знание основных принципов и того инструмента, который кандидат указал в резюме. То есть нужно набить руку в использовании хотя бы одного инструмента, а потом при необходимости изучить остальные — больших проблем не будет. Например, можно начать с видеокурса по работе с Gitlab CI/CD, а потом изучить CI/CD с Jenkins.
Знать, что такое микросервисы, оркестрация контейнеров и иметь базовые навыки работы в Kubernetes
Микросервисная архитектура — это архитектура, в которой приложение разбито на несколько отдельных сервисов. Они взаимодействуют между собой путём прямых запросов или передачи сообщений через специальные системы-посредники (например, Apache Kafka). У каждого сервиса своя бизнес-задача: например, управлять каталогом, хранить и обновлять содержимое корзины или проводить оплату заказа.
Сервисы можно упаковывать в отдельные контейнеры и развёртывать независимо друг от друга в нужном количестве экземпляров. Это оказалось достаточно хорошим решением, потому что позволило выкатывать обновления чаще.
Когда счёт контейнеров идёт на десятки и сотни, необходимо автоматизировать управление ими. Для этого существуют оркестраторы. Оркестратор берёт на себя планирование, развёртывание, масштабирование приложения, балансировку нагрузки, управление доступностью.
Де-факто стандартом в отрасли сейчас является Kubernetes. Это сложный в освоении инструмент, и существует несколько уровней работы с ним:
1) Базовый. Этот уровень подразумевает, что вы:
Знаете компоненты и абстракции Kubernetes.
Понимаете, как устроен и работает кластер.
Можете поднять кластер с помощью одного из готовых инструментов (например, Kubespray).
Знаете, как реализованы сетевые абстракции в K8s.
Умеете создавать Helm-чарты и темплейтировать приложение.
Знаете, как подключать систему хранения данных.
Можете автоматизировать работу с сертификатами.
Понимаете, как строить пайплайны доставки приложения в кластер Kubernetes.
2) Продвинутый. Он подразумевает, что вы можете проектировать архитектуру и смело залезаете под капот Kubernetes для тонкого тюнинга. На этом уровне нужно уметь:
Настраивать аутентификацию пользователей в кластере.
Работать с сетевыми плагинами для Kubernetes.
Настраивать безопасность кластера.
Понимать, как работают компоненты Kubernetes под капотом.
Создавать собственные операторы.
Понимать, как работает автоскейлинг приложений в кластере.
Делать резервное копирование кластера.
Реализовывать Blue-Green, Canary deployment.
Использовать Open Policy Agent.
Выстраивать service mesh.
На крупных проектах с Kubernetes может существовать глубокая специализация. Поэтому существуют наборы компетенций для разных ролей, например для:
администратора кластера;
разработчика;
архитектора;
специалиста по мониторингу;
специалиста по безопасности.
Сориентироваться в курсах и материалах по Kubernetes поможет Навигатор курсов по Kubernetes. Но начинать нужно с базовых курсов: Kubernetes: База или Kubernetes для разработчиков. На нашем youtube-канале есть бесплатные вебинары Вечерней школы Kubernetes: для инженеров и для разработчиков. Тем, кто уже имеет опыт работы с Kubernetes, рекомендуем обратить внимание на Kubernetes: Мега.
Знать языки программирования
Уже на старте DevOps-инженеру нужно уверенно писать на одном из скриптовых языков и уметь читать скрипты, написанные на Bash и Python.
Кроме скриптовых языков желательно познакомиться с самыми популярными языками разработки и их экосистемами. Потому что часто в одной и той же компании разные команды используют разные языки программирования. DevOps-инженеру нужно быть готовым к тому, что ему принесут код на любом языке с просьбой, например, помочь собрать контейнер. Придётся вникнуть, протестировать, при возникновении проблем понять, как их решить, или даже исправить самому. Помните, что вокруг каждого языка программирования ещё есть своя экосистема, которую нужно изучать: инструменты, библиотеки, фреймворки и т. д.
Выбирать язык программирования для изучения нужно исходя из стека компании, куда вы хотите попасть, или из личных предпочтений. Например:
На собеседовании у вас спросят про тот язык, который вы указали в резюме. Но в будущем, разумеется, придётся подстраиваться под стек компании. В Слёрме можно изучить Python для инженеров и Golang для инженеров.
«Python и Go хороши для начала, Java — сложнее, придётся сильно углубиться. Нужно знать, какие типы там есть, как с ними работать, какой синтаксис у языка, как правильно применить линтеры, чтобы они не мешали разработчикам. Хороший вариант — знать best practices по языкам и по паттернам безопасности и кода», — Максим Гусев, SRE-инженер в Dodo.
Уметь строить систему мониторинга
Развитие любого приложения невозможно без мониторинга. Он нужен как для обеспечения надёжности и доступности сервисов, так и для бизнес-аналитики. В задачи DevOps-инженера входит:
Выбор ключевых метрик. Нужно понимать основные подходы: Blackbox & Whitebox, уметь настраивать 4 golden signals, понимать предназначение RED и USE.
Организация и автоматизация их сбора. Работать с экспортёрами, настраивать Prometheus и его аналоги.
Хранение метрик. Знать типы данных и способы их хранения, PromQL.
Визуализация метрик. Устанавливать и настраивать Grafana. Уметь собирать дашборды и формировать графики.
Настройка алертинга. Проектировать правила и настраивать системы алертинга.
Внедрение улучшений на разных этапах развития проекта. Развивать observability системы, работать с инцидентами, анализировать метрики.
Связка двух инструментов Prometheus & Grafana — популярный способ организовать мониторинг. Чтобы освоить сбор метрик, обратите внимание на видеокурс по Prometheus, для сбора и визуализации — «Мониторинг в Grafana». Отдельный курс есть по Мониторингу и логированию в Kubernetes.
Знать методологии DevOps
Помимо знания инструментов и технологий, которые упомянуты выше, на DevOps-инженера могут возложить и операционные задачи. Например:
Увеличивать скорость разработки. DevOps-инженер благодаря автоматизации и интеграции процессов позволяет сократить время, необходимое для запуска новых функций или исправления ошибок, и сделать процесс разработки более гибким и быстрым.
Улучшать сотрудничество и коммуникации. DevOps-инженер снимает барьеры между разработчиками и операционными командами.
Улучшать качества продукта. DevOps-инженер обнаруживает и исправляет ошибки, снижает риски сбоев и инцидентов, связанных с человеческим фактором, повышает надёжность системы в целом.
Сокращение затрат и оптимизация ресурсов. DevOps стремится к автоматизации и оптимизации процессов разработки и развёртывания, что позволяет сократить издержки и использование ресурсов, таких как время и оборудование.
В зависимости от процессов компании задачи DevOps-инженера могут отличаться: где-то он отвечает за продакшн, где-то за всё, что связано с CI/CD и тестовыми контурами. А где-то DevOps-инженеры отвечают исключительно за развитие продуктов, внедрение новых технологий и всего, что связано с CI/CD-конвейером.
Таким образом, в методологиях DevOps очень много разных практик. Стоит регулярно уделять часть времени на то, чтобы постепенно знакомиться с ними и подробно изучить их, когда станет необходимо.
Заключение
Этот Roadmap поможет сформировать навыки, которые чаще всего встречаются в вакансиях на позицию DevOps-инженера. Точно также мы учим на нашем 5-месячном курсе DevOps Upgrade. Разумеется, даже после его прохождения результат собеседования в большей степени зависит от самого кандидата, но сотням наших выпускников этот набор компетенций помог не только закрепиться в профессии, но и дал буст для дальнейшего развития. Если хотите увидеть, как выпускник курса DevOps Upgrade проходит собеседование на позицию DevOps-инженера, смотрите наш вебинар DevOps-инженер: открытое собеседование.
Во второй части статьи мы расскажем об Intermediate уровне и специализациях для middle+ инженеров.
Статья подготовлена по материалам вебинара Roadmap для DevOps-специалистов. Спикер — Максим Гусев, SRE-инженер в Dodo Engineering.
Редактор: Андрей Удалов.
Оформление: Екатерина Игумнова.