Источник: Nuances of Programming
Pulumi — это многоязычная мультиоблачная платформа разработки с открытым исходным кодом, позволяющая посредством кода управлять всей облачной инфраструктурой, а именно виртуальными машинами, сетевым взаимодействием, базами данных, современными архитектурами, бессерверными вычислениями и контейнерами.
Pulumi предоставляет следующие возможности.
- Создание современных приложений с помощью практикуемых языков программирования при условии их поддержки, а также привычных IDE и инструментов.
- Развертывание в любом облаке с помощью любого инструмента CI/CD. Независимо от вашего рабочего облака вы вольны использовать любимый язык и инструменты. Разработчики и системные операторы могут объединять усилия для реализации лучших DevOps-техник, упрощающих интеграцию Pulumi с любым инструментом.
- Управление облачными средами. Вам предоставляется обзор всех имеющихся сред и вносимых в них изменений. Кроме того, вы можете легко настраивать их конфигурации для защиты данных.
Инфраструктура как код (IaC)
Инфраструктура как код, иногда именуемая программируемой или программно определяемой, является важным DevOps-подходом для каждого проекта. Его цель — сделать процесс CI/CD более удобным для обслуживания и масштабирования. Достигается это благодаря созданию высокоуровневого кода для развертывания, обновления, удаления облачной инфраструктуры и применению качественных практик. Такой подход отличается от создания в облачной консоли вручную новых сервисов, неоднократного вызова функции или добавления строк кода.
Поскольку инфраструктура является еще и кодом, то она проходит тот же контроль версий, автоматизированное тестирование, а также разные этапы конвейера непрерывной интеграции и доставки (CI/CD).
Мы живем в мире, в котором все автоматизируется, поэтому идея создания кода, способного автоматически выполняться при каждом событии или в определенное время, представляется весьма разумной. Вы можете настроить код так, чтобы он развертывал всю инфраструктуру ранним утром, делая ее доступной в течение дня, а вечером, когда они вам больше не требуются, удалял все облачные ресурсы для экономии средств.
Для освоения развертывания IaC потребуется предварительное обучение, но познакомившись с этим полезным инструментом и поняв принцип его работы, вы сможете эффективно задействовать его в своих проектах.
Архитектура и концепции
Pulumi — это современная IaC-платформа , включающая CLI, библиотеки и размещенный на сервере сервис, совместная работа которых обеспечивает надежный способ предоставления, обновления и управления облачной инфраструктурой.
Pulumi обладает собственной моделью программирования для развертывания инфраструктуры, регулируя различные ресурсы с помощью своего SDK. Эта модель и SDK представляют новые концепции в виде программ, проектов и стеков для управления развертыванием, а также входные и выходные данные для работы с зависимостями, знание и применение которых необходимы для успешной реализации процесса.
Модель программирования
Модель программирования Pulumi содержит ключевые концепции, необходимые для написания IaC.
Проект Pulumi состоит из 3 компонентов.
Проект
Проект — это каталог, включающий программу и файл конфигурации .yaml , который определяет порядок ее выполнения.
Pulumi.yaml содержит важные метаданные, такие как имя и описание проекта, выбранный язык программирования, а также ряд других дополнительных конфигураций.
Программа
Программа — это набор файлов проекта, которые написаны на языке программирования, указанном в файле Pulumi.yaml .
Поскольку программы Pulumi написаны на знакомых языках, то вы вольны задействовать их родные библиотеки. Однако для развертывания инфраструктуры вам не обойтись без пакетов Pulumi и их типов ресурсов. Вы можете настроить программу на генерацию выходных данных, которые будут доступны в выполняющем ее стеке.
При выполнении программы через Pulumi CLI вы сможете предварительно просмотреть ресурсы, подлежащие созданию, обновлению или удалению в зависимости от кода и их текущего статуса.
Стеки
Стеки — это экземпляры проекта, количество которых не ограничено. Как правило, они используются для различных облачных сред, этапов или веток. Каждый стек имеет свой файл Pulumi.<stack>.yaml , что дает возможность его независимой настройки.
С помощью CLI можно выполнять основные операции, например создание, выбор и удаление стеков. Он также предоставляет и более конкретные возможности, такие как перечисление, добавление тегов, импорт/экспорт стеков и просмотр их выходов.
Лучшие практики
При организации кода в вашем распоряжении ряд наилучших практик и других подходов, к которым относятся монолитный и микростековый .
Монолитный подход
Как правило, на начальных этапах работы с Pulumi предпочтение отдается монолитному подходу. Он подразумевает, что один проект определяет инфраструктуру и ресурсы приложения для всего вертикального сервиса, включая всевозможные стеки для различных сред, например продакшена, инсценирования (staging) или тестирования.
Преимущества монолитного подхода:
- Простота . Обычный проект и набор стеков — все, что нужно сделать.
- Контроль версий . Весь код сосредоточен в одном проекте для управления его версиями.
- Динамичность . Все вышесказанное указывает на то, что монолитный подход — гарантия наилучшей производительности и, следовательно, подвижности. Он как нельзя лучше подходит для небольших проектов или команд разработки.
Микростеки
Большинство пользователей начинают с монолитной структуры, однако и у мелкомодульной декомпозиции проектов и стеков есть свои преимущества.
Микростек — это шаблон, предполагающий разделение проекта на меньшие отдельно управляемые подпроекты. Например, определение инфраструктуры кластера в одном из них и применение ее из другого. Можно также разбить его на большее число подпроектов для разных сред, а именно продакшена, инсценирования и тестирования.
Этот подход поднимает вопрос об управлении межстековыми зависимостями, для чего Pulumi предусматривает экспорт стеков, в процессе которого в одном стеке вы экспортируете выходное свойство сервиса, а в другом его получаете.
Ниже представлено несколько примеров разделения монолитного проекта:
- В архитектуре микростеков каждый стек получает свой проект.
- Образы контейнеров приложения можно пересоздавать и опубликовывать независимо от проектов инфраструктуры.
- Базовая низкоуровневая инфраструктура (сети, оркестраторы кластеров) могут быть независимы от другой инфраструктуры или ресурсов приложений.
Преимущества данного подхода:
- Независимость . Развертывание определенных проектов проходит в разном темпе. Например, ежедневно обновляемый сервис не следует размещать в одном проекте с важной редко изменяющейся инфраструктурой.
- Безопасность . Вы можете гарантировать, что любые изменения вносятся в важную инфраструктуру с разрешения уполномоченного персонала.
- Комплексность и производительность . Размещение всех сервисов в одном месте может увеличить время сборки. Подход с разделением на компоненты, которые можно создавать обособленно, повышает динамичность и улучшает производительность, особенно с учетом разной скорости разработки и/или управления, осуществляемого разными командами.
Принципы работы Pulumi
Используя состояния, Pulumi определяет, что необходимо сделать для каждого ресурса.
Модель состояний основана на 4 разных компонентах.
- Основной язык: язык, на котором была написана инфраструктура, запускает программу Pulumi и делает запрос на регистрацию каждого объявленного ресурса.
- Поставщики ресурсов: SDK, применяющие плагины для различных облачных провайдеров с целью развертывания ресурсов в облаке.
- Состояния. У каждого ресурса есть текущее и целевое состояние, которое может измениться в зависимости от выполняемых в нем действий.
- Механизм развертывания. С его помощью Pulumi подключает предшествующие компоненты и определяет, что нужно развертывать в облаке.
Взаимодействие с проектом осуществляется разными способами, которые определяют направленность действий Pulumi:
- Развертывание . Каждый ресурс создается с именем, свойствами, а также текущим и целевым состояниями.
- Обновление . Созданные свойства и целевое состояние ресурса могут меняться. При необходимости Pulumi его обновляет/удаляет. Если же такой необходимости нет — оставляет неизменным. Если есть еще несозданные ресурсы, то они создаются на этом этапе.
- Удаление . Целевое состояние каждого созданного ресурса будет изменено на “deleted”, и Pulumi удалит их.
По сути, механизм развертывания Pulumi выполняет с каждым ресурсом следующие операции:
- Получает от основного языка запрос на регистрацию ресурса.
- Проверяет, зависит ли ресурс от другого еще несозданного ресурса.
- Проверяет текущее состояние ресурса.
- Сравнивает текущее состояние с целевым и решает, какую операцию должен выполнить поставщик ресурса .
Если ресурс еще не создан:
- он его создает.
Если ресурс создан:
- При условии соответствия текущего состояния целевому он не предпринимает никаких действий.
- Если текущее состояние отличается от целевого, то для приведения его в соответствие с последним он обновляет или удаляет его.
5. Обновляет состояние ресурса.
Для компонента механизм развертывания работает по такому же принципу, но при этом основной язык выполняет многочисленные запросы на регистрацию ресурсов, и потомки запускаются, когда текущее состояние родителя становится целевым.
Начальные этапы развертывания инфраструктуры
Если вы прочитали статью до этого момента, то, наверняка, вам стало интересно, как начать процесс развертывания инфраструктуры с помощью Pulumi.
Прежде всего, следует выбрать облачного провайдера , если такового у вас еще нет, и язык программирования . Затем, руководствуясь документацией о начальных этапах работы , вы устанавливаете Pulumi и настраиваете облачный провайдер, а также предпочитаемый язык. Далее ознакомитесь с принципами создания и развертывания базового проекта, а также удаления всего стека.
После развертывания базового проекта следует углубиться в изучение документации и приступить к разработке собственных решений. Ознакомьтесь со ссылками на API для развертывания различных сервисов в облаке.
Читайте также:
Перевод статьи Gonzalo Muñoz : Introduction to Pulumi