Найти тему
Nuances of programming

Введение в Pulumi

Источник: 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 подключает предшествующие компоненты и определяет, что нужно развертывать в облаке.
-2

Взаимодействие с проектом осуществляется разными способами, которые определяют направленность действий Pulumi:

  • Развертывание . Каждый ресурс создается с именем, свойствами, а также текущим и целевым состояниями.
  • Обновление . Созданные свойства и целевое состояние ресурса могут меняться. При необходимости Pulumi его обновляет/удаляет. Если же такой необходимости нет  —  оставляет неизменным. Если есть еще несозданные ресурсы, то они создаются на этом этапе.
  • Удаление . Целевое состояние каждого созданного ресурса будет изменено на “deleted”, и Pulumi удалит их.

По сути, механизм развертывания Pulumi выполняет с каждым ресурсом следующие операции:

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

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

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

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

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

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

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

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

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

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

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

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

Читайте нас в Telegram , VK

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