Всі знають що таке Infrastructure as a Code, але як почати використовувати цей підхід в своїй компанії? Як організувати код? Як налагодити взаємодію між компонентами, розробка яких ведеться окремо ? Як "подружити" розгортання інфраструктури та додавання інстансів в CD пайплайн ? Хто має розробляти інфраструктуру та хто має мати можливість контрібютити в неї? На ці, та інші питання я хочу спробувати дати відповідь в своїй доповіді.
3. Continuous Delivery. Continuous DevOps. KYIV, 2020
Проблеми
• Зв’язок модулів компонентів /
Передача outputs між модулями
• Конфігурація backend
• Оркестрація модулів
• Georedundancy
• Патерни деплоймента інфраструктури
• Проблема організації команд /
розподіл обов’язків
• Формування артефактів
6. Continuous Delivery. Continuous DevOps. KYIV, 2020
Remote state
ПЛЮСИ:
• Не потрібно додаткової
інфраструктури, тільки backend
• Стандартне оголошення output
• Мало додаткового коду при
зчитуванні, один datasource на
модуль
МІНУСИ:
• Потрібно писати в datasource повну
конфігурацію бекенда
• Проблеми при реорганізації модулів
• Важко мокати залежності
9. Continuous Delivery. Continuous DevOps. KYIV, 2020
Key-Value Bus
ПЛЮСИ:
• Явна декларація залежностей
модуля (більш явна ніж з remote
state)
• Ідентифікатор output-a не залежить
від модуля
• Просто мокати залежності
• Вирішує додаткові проблеми
МІНУСИ:
• Додаткивий сервіс в інфраструктурі
• Окремий datasource на кожну
змінну, яка зчитується модулем
14. Continuous Delivery. Continuous DevOps. KYIV, 2020
Приклад врапера
ПАРАМЕТРИ МОДУЛІВ:
• Environment
• Location
• Cloud provider credentials
• Backend configuration
• Key-value bus configuration
PRE-REQUIREMENTS:
• Azure
• В кожному сабскрібшені ресурсна
група, в якій storage account і key
vault
• В якості backend – azure storage
account.
• Для кожного енва – свій блоб
контейнер.
• В якості key-value – azure key-vault
17. Continuous Delivery. Continuous DevOps. KYIV, 2020
Оркестрація модулів: terragrunt
Запуск кількох модулів однією
командою
Залежності модулів в коді
Конфігурація бекенда в одному місці
CLI флаги в одному місці
27. Continuous Delivery. Continuous DevOps. KYIV, 2020
Git tags vs mbt
Плюси git tags:
• Просто версіонувати
• Не потрібно додаткового стореджа
для модулів
Мінуси git tags:
• Проблеми з організацією доступу
• Незручно організувати release
notes/package metadata
Плюси mbt:
• Легко поширювати/роздавати доступ
• Легко додавати в модуль metadata
• В пакет можна включати додаткові
модулі
Мінуси mbt:
• Потрібен сторедж/репозиторій
30. Continuous Delivery. Continuous DevOps. KYIV, 2020
Корисні ресурси
• Terraform / Terragrunt врапер і приклад для georedundancy:
https://github.com/id27182/devopsfest2020samples
• https://terragrunt.gruntwork.io/
• CI & тестування: https://www.contino.io/insights/top-3-terraform-testing-strategies-
for-ultra-reliable-infrastructure-as-code
• Branching workflow comparison: https://medium.com/@patrickporto/4-branching-
workflows-for-git-30d0aaee7bf
• Monorepo vs Polyrepo: https://danielkummer.github.io/git-flow-cheatsheet/
https://github.com/joelparkerhenderson/monorepo_vs_polyrepo
• Про клауд і IaaC: https://www.youtube.com/watch?v=BEZKub1BYCE&feature=youtu.be
IaaC з terraform це круто і зручно, але в той же час і складно. В процесі роботи виникає багато проблем, рішення яких не очевидні і не описані в документації. Сьогодні я хочу поговорити про такі проблеми та як їх уникнути (на прикладі azure).
Мене звуть БМ, і я працюю з проектами, які стосуються різних варіацій IaaC більше двох років. Давайте починати.
Уявимо абстрактну компанію, яка використовує azure, та інфраструктура якої виглядає ось так
Пройтись по компонентам і зв*язкам
Компоненти можуть розроблятись і, відповідно, розгортають окремо, є сенс описувати кожен окремим модулем.
Але що робити у випадку, коли треба зчитати якесь значення, яке генерується в модуді бекенд, наприклад з модуля бекофіс.
Це значення може бути апі енндоінтом, ключем, сертифікатом і т д
Є два рішення
Тераформу необхідно зберігати дані про вашу інфраструктуру та конфігурацію. Стейт використовується тераформом для того щоб зберігати інформацію про зв*язок реальних ресурсів і ваших модулів, метадату та для інших цілей. Це означає, що всі динамічно згенеровані значення зберігаються в стейті, і цим можна скористатись.
Як виглядає в коді (Т)
Для цього потрібно описати датасорс
і окрім всього, може статись (Т)
Альтернатива цьому підходу – Key-Value шина
Підхід полягає в тому, щоб використовувати якийсь KV (приклад) для запису аутпутів і їх зчитування
Ось як виглядає (Т)
Без kv – великі vars файли в сорс контролі або костилі
З – централізований сторедж
уявіть що проект тільки стартує ....
(Т)
Давайте розглянемо приклад
Всі модулі приймають уніфікований список параметрів (решта в kv)
Бувають ситуації, коли потрібно розбивати на окремі модулі
Наприклад ...
Потрібно уніфіковано запускати
(Т)
Цю проблему можна вирішити за допомогою терагрант
Террагрант – це врапер, який дозволяє адекватно ...
Адекватний спосіб описувати georedundant серидовища
Зручно розділити ресурси по модулям
Ще одна проблема, яку може вирішити такий підхід до організації модулів – деплоймент стратегія для продакшн
Звісно, можна
Але
З вище описаною організацією модулів, можна зробити rolling update з можливістю протестувати перед тим, як повернути в балансувальник навантаження
Якщо інфраструктура описється кодом – деплоймент повинен бути такий же, як для коду
Одне з питань, яке може виникнути – хто повинен бути оунером коду , та кому можна контрібютити
Хашикорп рекомендує
Але хто ж
Невизначеність може привести до двох крайностей
Вихід є: Оунер той – хто найчастіше міняє
Хашикорп рекомендує
Різні види інфраструктури (легісі, cloud-native з функціями і т д, AKS)
Немає чіткого алгоритму
Оунер той – хто найчастіше міняє