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:
-
Декларативный. Пользователь указывает, что нужно получить в итоге. Весь алгоритм действий на пути к конечному результату отдаётся на откуп провайдера IaC-инструмента. Примерами такого провайдера являются Terraform, Puppet.
-
Императивный. Пользователь пошагово определяет, что нужно сделать, чтобы прийти к нужному состоянию. Примеры инструментов — 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-провайдер:
-
Создание новой конфигурации для новых ресурсов. Способ подразумевает, что новые ресурсы будут попадать в новую конфигурацию, а инстанс со старыми будет существовать параллельно. Это неудобно, поскольку нужно поддерживать две конфигурации, а ресурсы могут задваиваться.
-
Использование команды import. Метод позволяет сразу перенести ресурсы в новую конфигурацию, поэтому в большинстве кейсов считается приоритетным.
Процесс миграции на Terraform-провайдер VK Cloud с помощью команды
import
состоит из нескольких этапов:
- Добавляем пустой ресурс в конфигурацию.
- Выполняем команду импорта ресурса:
terraform import vkcs_compute_instance.myWM Resource_ID
.
- Получаем конфигурацию импортированного ресурса командой
terraform show
.
- Добавляем конфигурацию в файл.
- Проверяем конфигурацию командой
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: регулярные дайджесты, полезные статьи, а также анонсы конференций и вебинаров.