Блог

Знання, без яких не обійтися DevOps'у. Топ базових інструментів і підходів

Професія DevOps — одна з наймолодших в IT. У цій сфері постійно все розвивається, від нових інструментів до підходів. Тому інженерам слід регулярно оновлювати свої знання. Початківцю може бути важко зорієнтуватися в цьому бурхливому різноманітті й зрозуміти, що треба вивчити тут і зараз. У цій статті я описав усе, що DevOps має знати хоча б на базовому рівні.

Основні навички

Залежно від проєкту задачі DevOps-інженера можуть відрізнятися і відповідно — необхідні скіли. Та основа переважно однакова:

  • Адміністрування операційних систем

Більшість серверів та хмарних сервісів працюють на Linux. Тож ви маєте знати принципи роботи ОС під капотом, вміти працювати з терміналом, запускати бекапи, створювати облікові записи, налаштовувати безпеку тощо. Варто розібратися хоча б у декількох популярних дистрибутивах типу Ubuntu, Debian, CentOS. Це дозволить обирати оптимальне рішення під ваш проєкт. Стануть у пригоді й аналогічні знання про Windows Server.

  • Адміністрування серверів

DevOps повинен налаштовувати, підтримувати і автоматизувати роботу веб-серверів. Передусім це nginx та Apache, але можна не обмежуватися ними. Водночас фахівець має розбиратися в роботі та конфігуруванні поштових серверів, DNS-серверів і серверів баз даних, у тому числі SQL та NoSQL.

  • Розгортання сайтів

Одна з базових задач DevOps. Треба підготувати оточення для деплою сайту, зібрати та залити код на сервер, налаштувати систему моніторингу з логами та метриками, конфігурувати мережу.

Мови програмування

DevOps-інженери не є розробниками, але вони також пишуть код. Це потрібно для створення скриптів, які допоможуть автоматизувати велику кількість рутинних процедур. Тому фахівець має знати базово хоча б одну мову програмування. Найбільш популярний варіант у нашій сфері — Python, зі зрозумілим синтаксисом та безліччю готових рішень для більшості завдань.

Особисто я б радив ще bash і Groovy (допоможе в роботі з Jenkins, про який розповім далі), а також PowerShell для Windows Server. Плюсом будуть знання й такої потужної нескриптової мови, як Golang. Та в будь-якому разі глибоко занурюватися в ці мови вам не треба.

Хмарні провайдери

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

Щодо провайдера, то тут вибір за вами. Я раджу зосередитися на одному з трьох китів: Amazon Web Services, Azure від Microsoft або Google Cloud Platform. Вони подібні за функціоналом, але в кожного свої переваги і недоліки. Не намагайтесь охопити все. Краще добре розберіться в одному провайдері і станьте в ньому профі.

Системи контролю версій

Сьогодні існує чимало систем контролю версій, але стандартом у галузі є Git. З ним можна швидко розділяти та об’єднувати версії, відстежувати та аналізувати будь-які зміни в коді та файлах, повертатися до старих версій. Усе це важливо в проєктах із розподіленими командами, коли розробники одночасно працюють над різними фічами, які має деплоїти DevOps.

У роботі з Git ви стикатиметесь з областями даних (робочі директорії, Git-індекс, репозиторій), будете використовувати теги і такі основні команди: перемикання між гілками, перевірка комітів, клонування репозиторія.

DevOps має розуміти відмінності між типами робочих флоу в сучасній розробці. Насамперед важливі моделі розгалуження. Найбільш мають попит тут Gitflow і Trunk Based Development. Перший флоу більше підходить для проєктів із чітким графіком релізів, а другий — відповідає ітеративному принципу реалізації фіч та проєкту.

Інструменти управління конфігураціями

Конфіг-менеджмент потрібен для стандартизованих налаштувань і контролю серверів, сервісів, середовищ, застосунків. Для автоматизації всього цього інструментів вдосталь. Як на мене, найпростіший і зручний — Ansible. Також можете розглянути Puppet, SaltStack або Chef.

Ansible відмінно справляється з автоматизацією деплою застосунків, підтримує основні ОС (крім Windows) і хмарні сервіси, має зрозумілу документацію. Для опису конфігурацій у ньому застосовується декларативна мова розмітки, а для команд — YAML. Ansible написаний на Python та побудований на модулях, що спрощує написання коду і дозволяє легко масштабувати систему, розширювати функціонал відповідно до поставлених задач. До того ж Ansible підтримує SSH-протокол для зв’язку з віддаленими пристроями. В більшості інших тулзів цього типу такого немає.

Інструменти управління інфраструктурою

DevOps багато в чому спирається на підхід Infrastructure as a Code. Згідно з цієюмоделлю, менеджмент інфраструктури відбувається через конфіг-файли, які можна перевикористовувати (замість ручного редагування окремих конфігурацій). Це прискорює створення та налаштування інфраструктури і знижує ризик помилок через людський фактор. Найбільш поширеним інструментом для цього є Terraform. Хоча зараз набирає популярності Pulumi. Іноді для розгортання інфраструктури обирають Ansible, але я б не радив. Краще взяти його для подальших налаштувань і деплою.

Terraform підтримує роботу з AWS, Azure, GCP та GitHub. Цей інструмент підпорядковує віртуальні машини, сховища даних, балансувальники навантаження, хмарні сервіси та інші об’єкти інфраструктури. Для управління системою використовується декларативна мова конфігурації з HCL або JSON. Ви просто описуєте бажаний результат, система створює виклик через API, і інфраструктура змінюється відповідно до конфіг-файлу. Так само легко повернутися до попередньої версії та імпортуватись в інші середовища.

Інструменти CI/CD

Впровадження у розробці підходів Continuous Integration та Continuous Deployment фактично є однією з причин появи DevOps-методології як такої. Тому вам не обійтися без володіння хоча б одним інструментом, що забезпечує безперервну інтеграцію фіч і деплой застосунків. Серед них: GitHub Actions, ArgoCD, CircleCI, TeamCity. Лідером за популярністю зараз є Jenkins. Він має розвинений функціонал, який дозволяє комплексно вирішувати завдання CI/CD.

Ви зможете кілька разів на день об’єднувати в одну гілку код від різних девелоперів, розподіляти навантаження, масштабувати вузли та автоматизувати деплой. Такий конвеєр функціонує завдяки джобсам і пайплайнам — сценаріям певних дій, які виконує система (наприклад, збір або розгортання). Також вам будуть доступні сотні плагінів майже під будь-яку ціль: від опису задачі до відстеження пулреквестів. Також Jenkins інтегрується з іншими DevOps-тулзами, зокрема з Ansible, GitHub, Docker та Kubernetes.

Хочу виділити автоматизоване тестування коду за допомогою Jenkins. Ви зможете побудувати процес тестування, котрий покриває всі етапи розробки. Це значно зменшує кількість помилок та прискорює їх виправлення. Але тут треба знатися на всіх типах тестів у CI-процесі. Йдеться про юніт- і перфоманс-тести, компонентні та інтеграційні тести, a/b-тести.

Інструменти контейнеризації

Під час збірки і розгортанні застосунків зазвичай використовують контейнеризацію. Застосунок упаковують у контейнери — образи, котрі запускаються в ізольованому середовищі і не потребують віртуалізації обладнання. Тобто відсутня прив’язка до інфраструктури. Це допомагає будувати послідовні сценарії деплою й оновлення різних частин застосунку, а також додавати нові частини і масштабувати систему. Всі процеси відбуваються автоматично, а принципи розбивки подібні до мікросервісної архітектури.

Чи не головним інструментом для виконання цієї задачі є Docker. Він має простий синтаксис та архітектуру. Всі команди деплою прописуються в текстовому документі Dockerfile. Для розгортання достатньо лише однієї команди, а не декількох скриптів, як зазвичай. Для повторюваних задач можна створити шаблони у вигляді Docker-образів, а щоб керувати кількома контейнерами, застосувати пакетний менеджер Docker Compose. Все це прискорює роботу DevOps-фахівця. На додачу Docker підтримує AWS та Azure, а також інтеграцію з Ansible, Jenkins та GitHub.

Інструменти оркестрації

Коли у вас є один або лише кілька контейнерів, управляти ними можна і за допомогою Docker. Однак із масштабуванням системи з’явиться потреба в окремих інструментах для кластеризації та менеджменту контейнерів. Золотим стандартом тут є Kubernetes. Він автоматизує управління, масштабування, розгортання, балансування та моніторинг контейнерів.

Kubernetes інтегрований із Docker, Terraform та Jenkins, підтримує роботу з AWS, Azure та GCP. В YAML-файлах ви зможете описувати процеси деплою та змінювати конфігурацію. При цьому можна використовувати й образи Dockerfile. Також у цьому інструменті є менеджери пакетів. І тут хочу виділити Helm. Він працює на всіх основних ОС і допомагає оновлювати застосунки, якими керує Kubernetes. Helm передбачає використання діаграм (charts), що спрощує і пришвидшує деплой навіть дуже великих, складних застосунків.

Якщо ви опанували всі описані вище інструменти, то вже вийшли на рівень дійсного хорошого DevOps-інженера та може вирішити 95% завдань. Проте у довершеності немає меж. Завжди є щось цікаве для вивчення.

Бонусні знання для DevOps

  • Інструменти збірки

Це програми автоматизації компіляції, збірки і розгортання софту. Рекомендувати тут щось конкретне важко, адже все залежить від проєкту. Для прикладу згадаю кілька популярних інструментів для Java, .NET та JavaScript. У першому випадку це Apache Maven, Gradle та Apache Ant. Для .NET варті уваги MSBuild та NAnt. У роботі з JS стануть у пригоді webpack, Parcel і Snowpack.

  • Інструменти перевірки і тестування безпеки

У DevOps-методології є окремий напрям, присвячений захисту мереж, середовищ та застосунків — SecOps. Навіть якщо ви не будете спеціалізуватися на цьому, все одно не завадить хоча б базово знати інструменти перевірки безпеки. Наприклад, SonarQube або Anchore. Перший контролює якість коду, виконує статичний аналіз, забезпечує безпеку та інтегрується з XML, PHP, Java, Python, GitLab. Anchore зосереджений на безпеці контейнерів, захисті середовищ Kubernetes, перевірці паролів, пакетів ОС, сторонніх бібліотек та образів Dockerfile.

  • Менеджери репозиторіїв

Допомагають збирати всі бінарні ресурси в одному місці. Це можуть бути залежності, віддалені артефакти, пропрієтарні бібліотеки. Менеджери репозиторіїв обробляють всі ресурси для експорту, копіювання та переміщення. Вони підтримують інтеграцію збірки на звичайних і хмарних CI-серверах. Подібних інструментів існує чимало, але я виділю Artifactory. Це універсальне рішення для роботи з Kubernetes та Docker, з повними CLI та REST API, підтримкою charts із Helm та широкими можливостями кастомізації під вашу систему.

Направду кажучи, конкретні інструменти не мають особливого значення. DevOps повинен знати не стільки тулзи, скільки принцип роботи певного інструмента. У цій сфері вони змінюються швидше, ніж у розробці. Те, що актуальне сьогодні, через кілька років може стати нікому не потрібним. Та якщо ви розумієте суть процесів під капотом і кінцеву ціль, то легко засвоїте будь-який новий інструмент.