Введение в Pulumi

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 выполняет с каждым ресурсом следующие операции: 

  1. Получает от основного языка запрос на регистрацию ресурса.  
  2. Проверяет, зависит ли ресурс от другого еще несозданного ресурса. 
  3. Проверяет текущее состояние ресурса. 
  4. Сравнивает текущее состояние с целевым и решает, какую операцию должен выполнить поставщик ресурса

Если ресурс еще не создан: 

  • он его создает. 

Если ресурс создан: 

  • При условии соответствия текущего состояния целевому он не предпринимает никаких действий. 
  • Если текущее состояние отличается от целевого, то для приведения его в соответствие с последним он обновляет или удаляет его. 

5. Обновляет состояние ресурса. 

Для компонента механизм развертывания работает по такому же принципу, но при этом основной язык выполняет многочисленные запросы на регистрацию ресурсов, и потомки запускаются, когда текущее состояние родителя становится целевым.

Начальные этапы развертывания инфраструктуры 

Если вы прочитали статью до этого момента, то, наверняка, вам стало интересно, как начать процесс развертывания инфраструктуры с помощью Pulumi.

Прежде всего, следует выбрать облачного провайдера, если такового у вас еще нет, и язык программирования. Затем, руководствуясь документацией о начальных этапах работы, вы устанавливаете Pulumi и настраиваете облачный провайдер, а также предпочитаемый язык. Далее ознакомитесь с принципами создания и развертывания базового проекта, а также удаления всего стека. 

После развертывания базового проекта следует углубиться в изучение документации и приступить к разработке собственных решений. Ознакомьтесь со ссылками на API для развертывания различных сервисов в облаке. 

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Gonzalo Muñoz: Introduction to Pulumi

Предыдущая статьяЧто нужно учить фронтенд-разработчику в 2021 году
Следующая статьяПоиск утечек памяти с помощью автоматизированных тестов