Развёртывание инфраструктуры для кластера YDB с помощью Terraform
- Обзор разворачиваемой инфраструктуры
- Создание инфраструктуры в AWS для развертывания YDB кластера
- Создание инфраструктуры в Azure для развертывания YDB кластера
- Создание инфраструктуры в Google Cloud Platform для развертывания YDB кластера
- Создание инфраструктуры в Yandex Cloud для развертывания YDB кластера
Развернуть кластер YDB для использования в production можно тремя рекомендованными способами: с помощью Ansible, Kubernetes или вручную. Если вариант с Kubernetes практически самодостаточен, то для вариантов с Ansible и вручную нужен SSH-доступ к правильно сконфигурированным серверам или виртуальным машинам.
В статье описывается, как создать и настроить необходимый для работы кластера YDB набор виртуальных машин у различных облачных провайдеров с помощью Terraform.
Terraform – это программное обеспечение с открытым исходным кодом для управления инфраструктурой по модели «инфраструктура как код» (Infrastructure as Code). Такой же подход используется в Ansible, системе управления конфигурациями. Terraform и Ansible работают на разных уровнях: Terraform управляет инфраструктурой, а Ansible настраивает окружения на ВМ:
Конфигурация настройки окружения ВМ описывается в YAML-формате, а инфраструктурный код пишется на HCL (язык конфигурации Terraform). Основной логической единицей записи в HCL является «блок». Блок состоит из ключевого слова, идентифицирующего его тип, названия и фигурных скобок, обозначающих тело блока. Например, так может выглядеть блок управления виртуальным сервером в AWS:
resource "aws_instance" "ydb-vm" {
count = var.instance_count
ami = "ami-008fe2fc65df48dac"
instance_type = "t2.micro"
key_name = var.req_key_pair
vpc_security_group_ids = [var.input_security_group_id]
subnet_id = element(var.input_subnet_ids, count.index % length(var.input_subnet_ids))
tags = {
Name = "ydb-node-${count.index +1}"
Username = "ubuntu"
}
}
Блоки могут располагаться друг за другом в одном файле и быть независимыми, могут ссылаться друг на друга и быть зависимыми, а также могут вкладываться друг в друга.
Основные типы блоков:
resource
– блок инициализации ресурса инфраструктуры (ВМ, сеть, подсеть, диск, DNS-зона и т.д.);provider
– блок инициализации провайдера, версии API и данных для аутентификации;variable
– переменная как со значением по умолчанию, так и пустая для хранения данных, введённых пользователем или переданных другими блоками;output
– вывод данных в терминал и сохранение в переменной;data
– переменная для запроса данных от внешних облачных ресурсов, не представленных в создаваемой инфраструктуре;module
– логическая группировка ресурсов, которые можно переиспользовать несколько раз в рамках одного или разных проектов;terraform
– блок настройки поведения самого Terraform, включая версию Terraform и используемых провайдеров, а также настройки бэкенда, который используется для хранения состояния Terraform.
Блоки записываются в файлы с расширением .tf
и логически группируются в директориях, которые в терминологии Terraform называют модулями. Модуль обычно состоит из следующих файлов:
main.tf
– основной файл, в котором находится код инфраструктуры. Может быть несколько файлов, содержащих инфраструктурный код.variables.tf
– локальные переменные модуля, которые принимают данные от других модулей или имеют значения по умолчанию.outputs.tf
– переменные, которые содержат результаты работы ресурса (IP-адреса ВМ, ID сетей/подсетей и т.д.).
Модули подключаются к проекту в корневом файле main.tf
следующим образом:
module "vpc" {
source = "./modules/vpc"
subnets_count = var.subnets_count
subnets_availability_zones = var.availability_zones
}
В примере подключается модуль vpc
(имя модуля назначается при подключении). Обязательный параметр – это source
, путь к директории, где располагается модуль. subnets_count
и subnets_availability_zones
– это переменные внутри модуля vpc
, которые принимают значения из переменных глобального уровня var.subnets_count
и var.availability_zones
.
Модули, как и блоки, располагаются друг за другом в корневом main.tf
проекта. Основное преимущество модульного подхода организации проекта – возможность легко управлять логически связанными наборами ресурсов. Поэтому репозиторий с готовыми Terraform-сценариями организован следующим образом:
.
├── README.md
├── README_RU.md
├── aws
│ ├── README.md
│ ├── README_RU.md
│ ├── main.tf
│ ├── modules
│ │ ├── dns
│ │ ├── eip
│ │ ├── instance
│ │ ├── key_pair
│ │ ├── security
│ │ └── vpc
│ └── variables.tf
├── azure
│ ├── README.md
│ ├── README_RU.md
│ ├── main.tf
│ ├── modules
│ │ ├── dns
│ │ ├── resource_group
│ │ ├── security
│ │ ├── vm
│ │ └── vpc
│ └── variables.tf
├── ...
Поддиректории содержат два readme
, файл variables.tf
с локальными переменными модуля и основной файл main.tf
, который подключает модули из поддиректории modules
. Набор модулей зависит от облачного провайдера. Базовые модули, функционально одинаковые для всех провайдеров, имеют одинаковые названия:
vpc
– модуль управления облачной сетью и подсетями;dns
– модуль управления DNS-зоной и DNS-записями;security
– модуль управления группами безопасности;instance
– модуль управления ВМ.
Чтобы воспользоваться готовыми Terraform-сценариями из репозитория, нужно скачать репозиторий командой git clone https://github.com/ydb-platform/ydb-terraform.git
, внести изменения в конфигурационный файл Terraform ~/.terraformrc
, задать актуальные значения глобальных переменных сценария и скачать CLI того облачного провайдера, где будет создана инфраструктура.
Если вы планируете использовать несколько провайдеров, можно добавить следующий код в ~/.terraformrc
, который установит пути скачивания для всех провайдеров, описанных ниже:
provider_installation {
network_mirror {
url = "https://terraform-mirror.yandexcloud.net/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
exclude = ["terraform.storage.ydb.tech/*/*"]
}
Если уже используются Terraform-провайдеры, представленные в официальном репозитории, они продолжат работать.
Обзор разворачиваемой инфраструктуры
Далее приведены пошаговые инструкции создания инфраструктуры в AWS, Azure, GCP, Yandex Cloud. Предложенные примеры Terraform-сценариев развертывают однотипную инфраструктуру:
- Виртуальные машины в трёх зонах доступности;
- Облачная сеть, публичные и приватные подсети (по подсети на зону доступности);
- Приватная DNS-зона;
- Группы безопасности, разрешающие ICMP и трафик на портах: 22, 65535, 19001, 8765, 2135.
Большинство параметров кластера регулируются (количество ВМ, объём и тип подключаемого диска, количество сетей, домен DNS-зоны и т.д.), однако значения по умолчанию являются минимально рекомендованными. Их изменение в меньшую сторону может привести к проблемам.
Создание инфраструктуры в AWS для развертывания YDB кластера
Создайте аккаунт в AWS и пополните баланс на сумму, достаточную для работы 9 ВМ. Рассчитать примерную стоимость содержания инфраструктуры в зависимости от региона и прочих обстоятельств можно с помощью калькулятора.
Создайте пользователя и ключ подключения в AWS Cloud для работы AWS CLI:
- Пользователь создаётся в разделе Security credentials → Access management → Users → Create User.
- На следующем шаге нужно назначить права пользователю. Выберете
AmazonEC2FullAccess
. - После создания пользователя – перейдите в него, откройте вкладку
Security credentials
и нажмите кнопку Create access key в секции Access keys. - Из предложенных вариантов наборов опций выберете
Command Line Interface
. - Далее придумайте тег для разметки ключа и нажмите кнопку Create access key.
- Скопируйте значения полей
Access key
иSecret access key
.
Установите AWS CLI и выполните команду aws configure
. Введите значения полей Access key
и Secret access key
сохраненные ранее. Отредактируйте файлы ~/.aws/credentials
и ~/.aws/config
следующим образом:
- Добавьте
[AWS_def_reg]
в~/.aws/config
передregion = ...
. - Добавьте
[AWS]
перед секретной информацией о ключах подключения.
Перейдите в директорию aws
в скачанном репозитории и отредактируйте следующие переменные в файле variable.tf
:
aws_region
– регион, в котором будет развернута инфраструктура.aws_profile
– имя профиля безопасности из файла~/.aws/credentials
.availability_zones
– список зон доступности региона. Формируется из названия региона и порядковой буквы. Например, для регионаus-west-2
список зон доступности будет выглядеть так:["us-west-2a", "us-west-2b", "us-west-2c"]
.
Теперь, находясь в поддиректории aws
, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init
– установка провайдера и инициализация модулей.terraform plan
– создание плана будущей инфраструктуры.terraform apply
(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan
, terraform apply
и terraform destroy
(уничтожение созданной инфраструктуры).
Создание инфраструктуры в Azure для развертывания YDB кластера
Создайте аккаунт в Azure и пополните счёт аккаунта на сумму, достаточную для работы девяти ВМ. Рассчитать примерную стоимость содержания инфраструктуры в зависимости от региона и прочих обстоятельств можно с помощью калькулятора.
Аутентификация в провайдере Azure для Terraform осуществляется через CLI:
- Скачать, установить и настроить Azure CLI можно, следуя этой инструкции.
- Авторизоваться в Azure с помощью Azure CLI можно в интерактивном режиме командой
az login
, а для создания пары SSH-ключей (Linux, macOS) проще всего будет воспользоваться командойssh-keygen
.
После авторизации в Azure и генерации SSH-ключей нужно изменить дефолтное значение следующих переменных в корневом файле variables.tf
:
auth_location
– название региона, где будет развернута инфраструктура. Список доступных регионов в зависимости от подписки можно получить командойaz account list-locations | grep "displayName"
.ssh_key_path
– путь к публичной части сгенерированного SSH-ключа.
Теперь, находясь в поддиректории azure
, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init
– установка провайдера и инициализация модулей.terraform plan
– создание плана будущей инфраструктуры.terraform apply
(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan
, terraform apply
и terraform destroy
(уничтожение созданной инфраструктуры).
Создание инфраструктуры в Google Cloud Platform для развертывания YDB кластера
Зарегистрируйтесь в Google Cloud Console и создайте проект. Активируйте платежный аккаунт и пополните его средствами для запуска девяти ВМ. Рассчитать стоимость можно в калькуляторе.
Настройте GCP CLI:
- Актируйте Compute Engine API и Cloud DNS API.
- Скачайте и установите GCP CLI, следуя этой инструкции.
- Перейдите в поддиректорию
.../google-cloud-sdk/bin
и выполните команду./gcloud compute regions list
для получения списка доступных регионов. - Выполните команду
./gcloud auth application-default login
для настройки профиля подключения.
Перейдите в поддиректорию gcp
(находится в скаченном репозитории) и в файле variables.tf
задайте актуальные значения следующим переменным:
project
– название проекта, которое было задано в облачной консоли Google Cloud.region
– регион, где будет развернута инфраструктура.zones
– список зон доступности, в которых будут созданы подсети и ВМ.
Теперь, находясь в поддиректории gcp
, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init
– установка провайдера и инициализация модулей.terraform plan
– создание плана будущей инфраструктуры.terraform apply
(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan
, terraform apply
и terraform destroy
(уничтожение созданной инфраструктуры).
Создание инфраструктуры в Yandex Cloud для развертывания YDB кластера
Для создания инфраструктуры в Yandex Cloud с помощью Terraform нужно:
-
Подготовить облако к работе:
- Зарегистрироваться в Yandex Cloud.
- Подключить платежный аккаунт.
- Убедится в наличии достаточного количества средств для создания девяти ВМ.
-
Установить и настроить Yandex Cloud CLI:
-
Создать сервисный аккаунт с помощью CLI.
-
Сгенерировать авторизованный ключ в JSON формате для подключения Terraform к облаку с помощью CLI:
yc iam key create --service-account-name <acc name> --output <file name> --folder-id <cloud folder id>
. В терминал будет выведена информация о созданном ключе:id: ajenap572v8e1l... service_account_id: aje90em65r69... created_at: "2024-09-03T15:34:57.495126296Z" key_algorithm: RSA_2048
Авторизованный ключ будет создан в директории, где вызывалась команда.
-
Настроить Yandex Cloud Terraform провайдера.
-
Скачать данный репозиторий командой
git clone https://github.com/ydb-platform/ydb-terraform.git
. -
Перейти в директорию
yandex_cloud
(директория в скаченном репозитории) и внести изменения в следующие переменные, в файлеvariables.tf
:key_path
– путь к сгенерированному авторизованному ключу с помощью CLI.cloud_id
– ID облака. Можно получить список доступных облаков командойyc resource-manager cloud list
.folder_id
– ID Cloud folder. Можно получить командойyc resource-manager folder list
.
Теперь, находясь в поддиректории yandex_cloud
, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init
– установка провайдера и инициализация модулей.terraform plan
– создание плана будущей инфраструктуры.terraform apply
(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan
, terraform apply
и terraform destroy
(уничтожение созданной инфраструктуры).
Примечание
С помощью Yandex Cloud провайдера можно не только создавать инфраструктуру для дальнейшего развертывания на ней YDB кластера с помощью Ansible, но и управлять serverless или dedicated версией YDB прямо из Terraform. О возможностях работы с YDB в Yandex Cloud читайте в разделе Работа с YDB через Terraform документации Yandex Cloud.