В этой статье мы рассмотрим критические навыки DevOps-инженера, которые сделают вас экспертом. Итак, поскольку мы понимаем, что люди приходят в нашу компанию с разных мест работы и у всех разный объем компетенций и уровень знаний, мы решили создать универсальную дорожную карту для роста и развития инженера DevOps. Но это не сработало так, как мы хотели, поэтому мы решили пойти другим путем и создать список навыков и компетенций, необходимых для работы в нашей компании. Таким образом, сделав трехуровневую систему, каждый уровень состоит из анкеты и критериев для кандидата. Говоря иначе, мы подготовили первую версию грейдинга и сертификации. Однако и эта система не помогла решить нашу проблему. Позже мы нашли отличный инструмент – матрицу навыков самооценки. Мы решили применить этот инструмент на практике для DevOps и позже преобразовали его в матрицу навыков. После этого мы провели сессию, на которой поставили себе текущие и желаемые полугодовые оценки. В качестве инструмента мы использовали Miro, но вы также можете воспользоваться листами Google.
Навыки и компетенции
Поскольку DevOps-инженеры в Mad Devs глубоко погружаются в операционную и инфраструктурную части, мы определили стек знаний для наших нынешних и будущих сотрудников, чтобы начать работать в качестве младших “MadOps”.
Для начала работы вам необходим уровень как минимум среднего сисадмина. Также для дальнейшего роста необходимы навыки и понимание абстрактных навыков и принципов:
- подготовка и эксплуатация сервиса в продакшене;
- логирование анализа;
- создания отказоустойчивости;
- аварийного восстановления;
- программирования сценариев и автоматизации;
- управление конфигурацией.
Linux
В основе лежит ядро Linux, подсистемы и окружающие их утилиты. Что вам нужно знать:
- Процессы, устройства, дисковые разделы, lvm, файловые системы, пространства имен и cgroups;
- Загрузчики, процесс запуска, systemd и модули;
- Сетевая подсистема Netfilter, пользовательские утилиты: iptables, Shorewall, tc и т.д., базовые знания сетевых протоколов;
- Виртуализация – в первую очередь KVM, также необходимо знать типы виртуализации и другие технологии;
- Как настроить и работать с основными сервисами: dhcpd, NFS, sshd, DNS (bind), почта (postfix, Sendmail), веб (Nginx, apache, caddy, traefik, etc.), базы данных (MySQL, Postgres);
- Базовый скриптинг на bash/python;
- Базовый поиск и устранение неисправностей.
Docker/контейнеры
Несмотря на то, что Docker отходит на второй план, мы не можем исключить его из списка необходимых навыков. Трудно представить себе что-то другое для локального использования еще несколько лет. Если говорить о k8s, то официальная поддержка Docker как Container Runtime должна полностью прекратиться с выходом версии 1.23.
Следует также упомянуть, что Docker был технологией, которая принесла контейнеризацию в массы. В то время как сама технология контейнеризации существует уже давно, ее пользователи часто были в основном “гиками”.
Что нужно знать:
- Различия между контейнеризацией и виртуализацией;
- Какие компоненты ядра Linux необходимы для работы контейнеров;
- Как запускать контейнеры docker, используя публичные образы docker;
- Уметь писать собственные Docker-файлы на основе лучших практик (порядок слоев, кэши, многоступенчатые сборки и т.д.);
- Готовить файлы docker-compose для ускорения и упрощения локальной разработки;
- Как работает сеть в docker;
- Практики безопасности для docker и dockerized приложений;
- Как перейти на dockerless инструменты, если это необходимо. Например, buildkit, buildah, kaniko и т.д.
Terraform и IaC
Среди огромного разнообразия инструментов (pulumi, Cloudformation, AWS CDK и т.д.), которые помогают донести подход IaC (Infrastructure as a Code) до масс, мы решили использовать Terraform в качестве основного инструмента для описания инфраструктурной составляющей.
Об этом необходимо знать:
- Terraform не является серебряной пулей и не может заменить абсолютно все инструменты. Для конфигурирования виртуальных машин лучше использовать следующие инструменты:a) Packer;b) Ansible/Chef/Puppet/Salt;c) Что угодно (bash?).
- Terraform не является инструментом управления мультиоблаками. Назвать его таковым можно с большой натяжкой. Управляя только AWS, вы не сможете развернуть инфраструктуру в GCP, используя тот же код. Каждый провайдер имеет свой набор ресурсов, и эти ресурсы называются по-разному. Однако использование Terraform позволяет не изучать новый синтаксис различных инструментов и новые подходы к организации кода для работы с разными облаками/провайдерами. Что в разы ускоряет процесс написания, сопровождения и передачи кода между инженерами.
Требования к знаниям:
- Умение читать чужой терраформный код. Это означает, что вы можете прочитать и понять код, используемый в публичных модулях (параметры ввода/вывода, логика, используемые ресурсы); Свободное использование публичных модулей;
- Способность описать инфраструктуру проекта в виде читаемого, сопровождаемого и многократно используемого кода;
- Написание собственных модулей и понимание того, как их использовать;
- Понимание того, как организовать структуру проекта;
- Ручная работа с файлом состояния (импорт существующих ресурсов в код, удаление объектов, перемещение объектов между ресурсами (например – из ресурса в модуль));
- У MadDevs есть Open Source проект GitHub – maddevsio/aws-eks-base: Этот шаблон содержит конфигурации terraform для быстрого развертывания кластера Kubernetes, поддерживающих сервисов и базовой инфраструктуры в AWS. Предполагается, что человек, владеющий навыками работы с Terraform на достаточном уровне, активно участвует в обсуждении улучшений, а также периодически вносит изменения.
CI/CD
Сейчас невозможно представить ни один проект, который хочет сократить время выхода на рынок без потери качества и не использует процессы CI / CD (Continuous Integration / Continuous Delivery / Continuous Deployment). Поэтому крайне важно понимать концепции и правильно их применять. Наша задача часто заключается в написании конвейера, касающегося разработки и потока исходного кода. Давайте закрепим мысль, что мы не натягиваем поток на конвейер, а подгоняем конвейер под поток. Сейчас практически не важно, какая система CI / CD будет использоваться, потому что все они имеют практически одинаковую функциональность. Но важно помнить, что EDGE-кейсы существуют, и знание сильных/слабых сторон той или иной системы позволит вам сделать правильный выбор в нужное время.
Необходимые знания в этой области:
- Понимание концепций CI, CD и CD. Знайте, что это такое и в чем различия.
- Написание простых и читабельных конвейеров;
- Умение переносить поток разработки на CI / CD конвейер, который может включать сложную логику:
- откаты,
- ручные шаги,
- триггеры других заданий, сервисы,
- уведомления..;
- Оптимизация конвейера. Умение находить узкие места, ускорять и оптимизировать с точки зрения затрат;
- Знание различных стратегий развертывания нового релиза и умение их реализовывать:
- Скользящее обновление,
- Синий/Зеленый;
- Канарейка;
- GitOps – что это такое, когда его лучше применять и какие инструменты лучше использовать;
- Знание инструментария. Интеграция анализа кода инфраструктуры и приложений, образов и систем на предмет уязвимостей, а также проверки безопасности публичных конечных точек в этапы конвейера.
AWS/Azure/GCP (облако)
Каждый из этих облачных провайдеров предлагает более 100 услуг. Для детального ознакомления со всеми не хватит времени. Значительная часть сервисов совершенно уникальна и может никогда не встречаться в работе.
Что необходимо знать:
- Как настроить сеть: сюда могут входить такие сервисы, как VPC, – Группы безопасности и ACL, топология и подсети, пиринги, VPN и т.д;
- Виртуальная машина;
- IAM;
- Хранилища: блочные и объектные хранилища;
- Сервисы развертывания контейнеров: ECS, AppRunner, Beanstalk, AppEngine, Web Apps и т.д;
- Услуги баз данных (как реляционных, так и нет);
- Управляемые кластерные сервисы Kubernetes;
- Балансировщики нагрузки, CDN, WAF.
При построении облачной инфраструктуры также полезно:
- Понимать и знать различные PaaS, IaaS и SaaS. Эти знания могут значительно ускорить начало проекта без лишних шагов;
- Уметь мигрировать в облака из локальных и между облаками. Необходимо правильно рассчитать мощность и стоимость, выбрать необходимые сервисы, разработать и реализовать план миграции;
- Постоянно помнить о парадигме оптимизации затрат и применять методы снижения затрат (споты, резервирование, вытесняющие узлы, лучшие и более эффективные сервисы или самостоятельные решения);
- Понимать хорошо спроектированную структуру и уметь строить инфраструктуру на ее основе;
- Знать, как построить инфраструктуру, соответствующую определенным требованиям (iso 27001, PCI, GDPR, HIPAA) и готовую к аудиту;
- Уметь эффективно управлять обширной инфраструктурой (ежемесячная проверка составляет более 10 тыс. и выше).
Kubernetes
Там, где это возможно (а это 99,9999999% проектов), мы используем управляемые решения от облачных провайдеров, что определяет характер работы с k8s. Большую часть времени мы выступаем в роли пользователей кластера, а не администраторов кластера, поэтому список необходимых знаний основан на опыте пользователей:
- Уметь различать управляемые и вендоры: GKE, EKS, AKS. Знать, в чем преимущества и недостатки.
- Понимать, уметь работать и отлаживать основные объекты: Pod, Deployment, Replicaset, Jobs/Cron Jobs, DaemonSet, Statefulset.
- Знать типы сервисов и что такое Ingress.
- Уметь работать с Configmaps, Secrets, sealed secrets и external secrets.
- Понимать разницу между контейнерами sidecar и init и их применение.
- Автомасштабирование кластера. Использовать различные типы узлов и пулов для оптимизации затрат.
- Применение передовых методов планирования стручков: nodeSelector, affinity, antiAffinity, topologySpread.
- Управление ресурсами подсистемы/пространства имен.
- Понимание и настройка RBAC и сетевых политик.
- Знать различия между контроллерами Admission и Mutating. Уметь писать решения при необходимости.
- Внедрять ServiceMesh там, где это необходимо.
- Широкомасштабное применение/реализация практик безопасности. Использование OPA (Open Policy Agent) при необходимости.
- Базовое понимание архитектуры: что такое компоненты, за что они отвечают и как они взаимосвязаны.
Helm
Поскольку helm – это инструмент для Kubernetes, все требования связаны со знаниями k8s, например:
- “Чтение” публичных диаграмм helm. Какие переменные могут быть использованы, где они подставляются, и из каких k8s манифестов состоит диаграмма.
- Создавайте свои собственные диаграммы. Там, где это необходимо, используйте циклы, условия и функции, чтобы сократить объем кода. Шаблоны должны быть читабельными.
- При необходимости пишите зонтичные диаграммы.
- Как настраивать/патчить публичные диаграммы (т.е. добавлять новые объекты).
- Опыт работы с такими инструментами, как helm-diff и helmfile.
Наблюдаемость
Одним из наиболее важных компонентов современных систем является наблюдаемость. Невозможно эффективно донести изменения до пользователя и эффективно управлять ресурсами без хорошо настроенных инструментов наблюдаемости.
Мы часто слышим только о “мониторинге” и “протоколировании”. Наблюдаемость – это более широкое понятие, включающее в себя мониторинг, протоколирование и трассировку.
Ожидаемые навыки:
- Умение работать с популярными системами мониторинга: Prometheus, VictoriaMetrics и т.д. и компонентами вокруг них (т.е. многочисленными экспортерами);
- Умение работать с распространенными системами/стеками логирования: ELK, EFK, Loki, Datadog и т.д.;
- Опыт работы с популярными системами трассировки: Jaeger, APM и т.д.;Отслеживание ошибок и мониторинг производительности: Sentry, NewRelic и т.д.;
- Знание того, как создавать пользовательские дашборды для Grafana на основе требований;
- Иметь навыки разбора и фильтрации логов в используемых системах логирования.
Безопасность
Сложно составить четкий список требований, поскольку мы не специалисты по безопасности, а скорее реализаторы. Поэтому вот общие положения:
- Придерживаться принципа наименьших привилегий при работе с пользователями, учетными записями служб и предоставлении прав.
- За последние несколько десятилетий процесс создания инфраструктуры кардинально изменился. Если раньше основной и ошибочной идеей была “безопасность по умолчанию” внутри своей частной сети”, то все новые подходы ближе к “Zero Trust” (мы не доверяем никому и ничему). Поэтому нужно стараться придерживаться этой концепции везде, где это возможно, как внутри, так и вне вашей инфраструктуры.
- Знание стандартов ISO 27001, HIPAA, PCI DSS, GDPR, CIS Benchmark и OWASP.
Разработка решений
Важным элементом нашей работы является разработка и внедрение решений. Целью таких решений является упрощение разработки, снижение затрат, переход на новую, более эффективную, безопасную технологию и т.д. Отсюда вытекает несколько необходимых исполнительских навыков:
- Умение декомпозировать задачи на атомарные подзадачи;
- Умение оценивать свои усилия;
- Умение конкретизировать требования;
- Умение построить “дорожную карту” и двигаться по ней;
- Умение находить и применять “эффективные решения” возникающих проблем и задач;
- Управление документацией;
- Самостоятельное исследование, разработка и презентация PoC;
- Внедрение поддерживаемых и настраиваемых решений, готовых к производству.
DevOps/SRE
Всем известно, что DevOps и SRE – это в первую очередь культурные аспекты и практики. Где DevOps приходит из разработки и нацелен на доставку функций клиенту, а SRE приходит из эксплуатации и нацелен на стабильность. Наши требования довольно просты:
- Иметь хорошее понимание SDLC, в первую очередь интересует модель Agile;
- Знать, что такое Delivery Pipeline и Feedback Loop. Уметь строить/оптимизировать эти процессы вместе с командой, выбирать адекватный инструмент для каждого этапа;
- Понимать и уметь построить процесс управления инцидентами:
- Регистрация и категоризация,
- Уведомление и эскалация,
- Поиск и устранение первопричины,
- Написание игровых книг;
- Уметь писать вскрытия для систематического улучшения стабильности и качества;
- Уметь разрабатывать и внедрять план аварийного восстановления, отвечающий требованиям бизнеса.
Мягкие навыки
Помимо того, что хороший DevOps-инженер должен обладать широким техническим кругозором и рядом навыков автоматизации, крайне важно развивать soft skills. То есть тех личностных качеств, которые помогают эффективно связывать и синхронизировать работу всех участников и подразделений в единое целое. Несомненно, наличие хорошо развитых soft-skills является важным элементом как личностного роста, так и карьерного продвижения (а иногда и основополагающим).
Чаще всего инженеры – частные лица, но времена меняются, и работать в одиночку невозможно. Инженер DevOps – это связующее звено между операциями, разработкой и менеджерами. Ему постоянно приходится общаться с командой, помогая достигать общей цели.
Что выделяется среди навыков:
- Самообразование. Сегодня, когда технологии меняются каждый день, невозможно полагаться на знания, полученные 10 лет назад (если речь идет о базовых вещах, таких как TPC / IP). Необходимо постоянно совершенствоваться и узнавать что-то новое. Без самообучения невозможно быстро улучшить свои сложные навыки.
- Коммуникативные навыки. Рабочий процесс devops в основном основан на командной работе, коммуникациях, эскалации проблем и т.д. Также в рамках таких коммуникаций реально можно проверить и прокачать свои hard skills. Кроме того, не забывайте о том, как вы формулируете свои мысли при постановке целей и задач. Ваша команда должна получать четкие и понятные объяснения задач.
- Самоорганизация. Способность работать самостоятельно без постоянного наставничества. Мы не говорим о том, когда вы только приступили к своим обязанностям и даже не знаете, в каком направлении вам нужно работать. Но чем быстрее вы сможете начать работать без постоянного наставника, тем быстрее пойдет процесс выравнивания.
- Наставничество. Не обязательно быть старшим инженером, чтобы стать чьим-то наставником. Умение учить других – хороший способ закрепить и систематизировать свои собственные знания. Это также помогает развивать коммуникативные навыки.
- Приверженность. Вы должны уметь добиваться своих целей в одиночку или работая в команде. Не всегда есть возможность попасть в проект с командой инженеров DevOps, поэтому вам нужно уметь ставить и достигать свои цели.
- Свободное владение английским языком. Большинство источников знаний написаны на английском языке. Технологии также создаются на английском языке. Работа в разработке и эксплуатации ведется на английском языке. В нашей компании специально для оценки soft skills мы составили специальную матрицу, где выделены все необходимые навыки.
Резюме
Подводя итог, можно сказать, что значение DevOps-инженера в разных компаниях разное, что затрудняет составление единого списка компетенций специалиста. Даже при 10-летней карьере столько направлений и подводных камней – не хватит времени на их изучение. Также стоит учитывать, какими услугами пользуются компании – одни используют облачные сервисы, другие – собственное или арендованное оборудование. Поэтому необходимые знания будут зависеть от того, в какой компании вы хотите работать. Специально для этого случая мы составили нашу матрицу навыков инженера DevOps, чтобы упростить процесс работы для соискателей и сотрудников.
Ранее опубликовано на maddevs.io/blog.