Terraform — один из самых популярных инструментов для автоматизации работы с инфраструктурой. По данным исследования состояния DevOps в России 2023, его выбирают 37% специалистов. Вместе с тем многие DevOps-инженеры и системные администраторы продолжают сталкиваться с проблемами при освоении инструмента на практике. Попытаемся исправить это. 

Меня зовут Алексей Волков, я продуктовый менеджер, отвечаю за Cloud Containers — сервис по управлению кластерами в VK Cloud. В этой статье я расскажу о Terraform и покажу алгоритм работы с инструментом в облаке по основным сценариям.

Infrastructure as a Code (IaC)


Инфраструктура как код (Infrastructure as Code, IaC) — модель автоматизации, которая подразумевает написание кода, его тестирование и выполнение для определения, развёртывания, обновления и удаления инфраструктуры. Следование принципам IaC сокращает разницу между написанием приложений и развёртыванием сред для них. Таким образом, можно взаимодействовать с серверами, базами данных, сетями, журналами и приложениями.
 
Помимо повышения удобства, это позволяет получить несколько преимуществ:

  • Снижение стоимости разработки. IaC позволяет получать нужную инфраструктуру и автоматически выполнять отдельные задачи администрирования. Это уменьшает время и затраты на разработку, тестирование и релиз ИТ-продуктов.
  • Уменьшение рисков. IaC позволяет проверять все изменения в системе управления версиями и, если нужно, быстро откатываться к нужной версии или контрольной точке.
  • Повышение тестируемости. Infrastructure as Code позволяет тестировать любые, даже небольшие изменения. Более того, для поиска ошибок можно применять статический анализ и автотесты. 
  • Упрощение обслуживания. Автоматизация с помощью IaC исключает зависимость от конкретного специалиста и позволяет инициировать процессы любому пользователю из команды DevOps. А декларативный подход IaC позволяет получить любые необходимые ресурсы.
  • Обеспечение идемпотентности. При IaC достаточно однажды описать желаемое состояние инфраструктуры в коде, чтобы всегда получать одинаковый результат. Это удобно, когда нужно запускать десятки идентичных инстансов: ошибки и несоответствия исключены. 

Есть два основных подхода IaC:

  1. Декларативный. Пользователь указывает, что нужно получить в итоге. Весь алгоритм действий на пути к конечному результату отдаётся на откуп провайдера IaC-инструмента. Примерами такого провайдера являются Terraform, Puppet.
  2. Императивный. Пользователь пошагово определяет, что нужно сделать, чтобы прийти к нужному состоянию. Примеры инструментов — Ansible, DSC.

Одно из самых популярных IaC-решений — Terraform, с которым работают 37% специалистов

Немного о Terraform


Terraform — Open-Source-решение, которое позволяет создавать, изменять инфраструктуру и управлять ею в облаке и виртуальных средах. Это один из ключевых инструментов DevOps, облегчающий управление и автоматизацию. 

У Terraform есть несколько преимуществ по сравнению с Ansible, Shell-скриптами, самописными Go- и Python-скриптами и другими решениями:

  • Высокий уровень абстракции. Terraform позволяет описывать инфраструктуру на более высоком уровне абстракции, что делает код более читаемым и понятным. Ansible, Shell и самописные скрипты обычно требуют больше кода и сложнее для новых разработчиков.
  • Планирование изменений. Terraform позволяет просматривать план изменений перед их применением, чтобы избежать ошибок или потери данных при обновлении инфраструктуры. При работе с Ansible, Shell и самописными скриптами такой функции «из коробки» нет, или получить её сложнее.
  • Простое управление состоянием. Terraform автоматически управляет состоянием инфраструктуры: отслеживает изменения и сохраняет текущее состояние. Как результат, можно быстро восстановить или воссоздать инфраструктуру в случае сбоев или потери данных. В случае с Ansible, Shell и самописными скриптами для этого нужны дополнительные манипуляции на этапе настройки или использования.
  • Расширенная поддержка провайдеров. Terraform «из коробки» совместим со многими облачными провайдерами, что упрощает развёртывание в разных облачных окружениях. В случае с Shell и самописными скриптами обеспечить совместимость сложнее.

На платформе VK Cloud есть свой Terraform-провайдер, который в том числе используется для управления Cloud Containers (сервис по управлению кластерами в VK Cloud).

Terraform-провайдер VK Cloud


Облако VK Cloud основано на OpenStack. Поэтому изначально наши клиенты использовали OpenStack Terraform-провайдер. Спустя время мы создали свой Terraform-провайдер, в котором объединили возможности как OpenStack, так и собственного решения. Он поддерживает все ресурсы нашего облака: диски, ВМ, ключевые пары, инстансы и кластеры БД, Kubernetes-кластеры, балансировщики нагрузки, сети, VPN, Shared filesystem. Благодаря такой совместимости его можно применять для разных сценариев. 

Пример: создание кластера с помощью Terraform


Важно: Перед созданием кластера нужно инициализировать Terraform и настроить провайдер, подключить OpenStack CLI и пройти авторизацию, а также создать конфигурационный файл Terraform.

Подготовка нужных источников данных

Для начала надо выбрать тип ВМ для master-узлов кластера. Для этого выполняем команду OpenStack flavor list, в ответ на которую будет выведен список всех доступных типов ВМ. Выбираем ВМ нужного типа и записываем её название.

Следом нужно выбрать версию K8s, с которой надо создать кластер. Для этого добавляем в конфигурационный файл следующие строки:

data "vkcs_kubernetes_clustertemplates" "k8s-template-list" {}
output "k8s-version-list" {
    value = data.vkcs_kubernetes_clustertemplates.k8s-template-list.cluster_templates.*.version
}

После этого выполняем команды terraform refresh и terraform output k8s-version-list, после чего будет выведен список доступных версий K8s — выбираем нужную и записываем её номер.

На следующем этапе нужно добавить в конфигурационный файл источники данных:

  • Шаблон виртуальной машины для master-узлов. Например: 

data "vkcs_compute_flavor" "k8s-master-flavor" {
    name = "имя шаблона"
}

  • Шаблон кластера. Например:

data "vkcs_kubernetes_clustertemplate" "k8s-template" {
    version = "версия K8s"
}

Описание конфигурации кластера

На этом этапе нужно добавить в конфигурационный файл ресурс кластера.

resource "vkcs_kubernetes_cluster" "k8s-cluster" {
  name                = "k8s-cluster"
  cluster_template_id = data.vkcs_kubernetes_clustertemplate.k8s-template.id
  master_flavor       = data.vkcs_compute_flavor.k8s-master-flavor.id
  master_count        = <количество master-узлов>
  network_id          = "<идентификатор сети>"
  subnet_id           = "<идентификатор подсети>"
  availability_zone   = "<зона доступности>"
  floating_ip_enabled = <true или false: назначить ли публичный IP-адрес для API-кластера>
}

Описание конфигураций одной или нескольких групп worker-узлов

Подробно алгоритм настройки описан здесь. Но это необязательный шаг: можно создать кластер только из master-узлов, а группы worker-узлов добавить потом.

Инициализация создания кластера

Для начала проверяем корректность конфигурационного файла Terraform с помощью команды terraform validate. После можно посмотреть планируемые изменения и принять их, последовательно выполнив команды terraform plan и terraform apply.
 
После этого начнётся создание кластера K8s. 

Пример: развёртывание приложения в кластере Kubernetes в интеграции с DBaaS для повышения отказоустойчивости


Для примера создадим в облаке сеть, балансировщик нагрузки и кластер, в котором развёрнем приложение WordPress и добавим БД на основе MySQL. Для начала запускаем команду terraform init, которая инициирует скачивание всех плагинов, описанных провайдером. 



После скачивания выполняем команду terraform apply, которая начинает создание конфигурации. Переходим в режим конфигурации, где вводим команду yes: мы подтверждаем, что согласны с перечнем ресурсов, которые собирается развернуть Terraform.
 


Например, в нашей конфигурации мы прописываем файлы с описанием провайдеров, настройками сети и подсетей, параметрами БД, конечным элемент в нашей конфигурации — WordPress, в котором создаём балансировщика, Persistent volume claim, Deployment с двумя репликами и множество остальных настроек. 



Большую часть настроек и прописанных параметров в файлах конфигурации указываем самостоятельно. Недостающие обязательные настройки можно найти в личном кабинете VK Cloud во вкладке «Настройки проекта» в разделе «API-ключи». 



После запуска всех команд и открытия терминала можно увидеть все текущие процессы. Например, что создались сети, роутер, инстанс БД, пользователь и кластер и начинается создание нод-группы. Только после этого в кластере Kubernetes создастся WordPress. 



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



Также есть IP-адрес, который можно использовать. Для проверки открываем его в браузере и попадаем в окно настройки WordPress — всё работает корректно.



Подробнее ознакомиться с примером можно в репозитории.

Пример: миграция манифестов на Terraform-провайдер VK Cloud 


Есть два основных способа миграции на новый Terraform-провайдер:

  1. Создание новой конфигурации для новых ресурсов. Способ подразумевает, что новые ресурсы будут попадать в новую конфигурацию, а инстанс со старыми будет существовать параллельно. Это неудобно, поскольку нужно поддерживать две конфигурации, а ресурсы могут задваиваться.
  2. Использование команды import. Метод позволяет сразу перенести ресурсы в новую конфигурацию, поэтому в большинстве кейсов считается приоритетным. 

Процесс миграции на Terraform-провайдер VK Cloud с помощью команды import
состоит из нескольких этапов:

  1. Добавляем пустой ресурс в конфигурацию.
  2. Выполняем команду импорта ресурса: terraform import vkcs_compute_instance.myWM Resource_ID.
  3. Получаем конфигурацию импортированного ресурса командой terraform show.
  4. Добавляем конфигурацию в файл.
  5. Проверяем конфигурацию командой terraform plan.

Рассмотрим, как это происходит, на примере ранее созданной конфигурации. Пример можно найти в репозитории.

Для начала у нас есть:

  • папка migrate_to_vkcs с файлами;
  • переменные окружения, которые нужно применить, чтобы инициализировать;
  • файл main, где через окружение инициализируется Terraform-провайдер VK Cloud;
  • пустой инстанс, который имеет заголовок, ресурс, тип и имя инстанса;
  • пустая конфигурация.

Для миграции заходим в личный кабинет VK Cloud. В демонстрационном проекте есть всего одна ВМ — CentOS_Basic.



В настройках получаем ID виртуальной машины.



Копируем ID, переходим в консоль. Вводим команду terraform import, добавляем имя ресурса, который мы хотим импортировать, и скопированный ID ресурса. Информацию об имени ресурса берём из конфигурации.



Запускаем команду, получаем подтверждение об успешном импорте.

Важно: Предварительно нужно инициализировать Terraform-провайдер с помощью команды terraform init.



Далее вводим команду terraform show, чтобы увидеть конфигурацию, которая существует в облаке. 



Копируем данные о ресурсах и заменяем их в файле instance.tf. После этого удаляем лишние элементы, например ID, metadata, tags, MAC-адрес.



Выполняем команду terraform plan. Получаем подтверждение, что конфигурация соответствует конфигурации в облаке, то есть виртуальная машина успешно импортирована. 



Вместо выводов


Terraform — «швейцарский нож», с помощью которого можно легко разворачивать серверы, настраивать сети, балансировщики нагрузки и другие компоненты инфраструктуры. Его главная фишка — соответствие модели автоматизации IaC и декларативный подход к управлению. То есть Terraform позволяет получать нужные ресурсы и состояния инфраструктуры с помощью нескольких команд и кликов — это я и показал на примере работы с Terraform-провайдером VK Cloud.

Вы прямо сейчас можете воспользоваться Kubernetes от VK Cloud. Для тестирования мы начисляем новым пользователям 3 000 бонусных рублей и будем рады вашей обратной связи.

Stay tuned

Присоединяйтесь к Telegram-каналу «Вокруг Kubernetes», чтобы быть в курсе новостей из мира K8s: регулярные дайджесты, полезные статьи, а также анонсы конференций и вебинаров.

Комментарии (0)