Развертывание инфраструктуры для кластера YDB с помощью Terraform

Развернуть кластер YDB для production использования можно тремя рекомендованными способами: c помощью Ansible, Kubernetes или вручную. Если вариант с Kubernetes практически самодостаточен, то для вариантов с Ansible и вручную нужен ssh доступ на правильно сконфигурированные серверы или виртуальные машины.

В статье описывается как можно создать и сконфигурировать необходимый для работы кластера YDB набор виртуальных машин в различных облачных провайдерах с помощью Terraform.

Terraform – это программное обеспечение с открытым исходным кодом для управления инфраструктурой по модели "инфраструктура как код" (Infrastructure as Code). Такой же подход используется в Ansible, в системе управления конфигурациями. Terraform и Ansible работают на разных уровнях: Terraform управляет инфраструктурой, а Ansible настраивает окружения на ВМ:

AiC_scheme

Конфигурация настройки окружения ВМ описывается в 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.td с локальными переменными модуля и основной файл 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:

  1. Пользователь создаётся в разделе Security credentials → Access management → Users → Create User.
  2. На следующем шаге нужно назначить права пользователю. Выберете AmazonEC2FullAccess.
  3. После создания пользователя – перейдите в него, откройте вкладку Security credentials и нажмите кнопку Create access key в секции Access keys.
  4. Из предложенных вариантов наборов опций выберете Command Line Interface.
  5. Далее придумайте тег для разметки ключа и нажмите кнопку Create access key.
  6. Скопируйте значения полей Access key и Secret access key.

Установите AWS CLI и выполните команду aws configure. Введите значения полей Access key и Secret access key сохраненные ранее. Отредактируйте файлы ~/.aws/credentials и ~/.aws/config следующим образом:

  1. Добавьте [AWS_def_reg] в ~/.aws/config перед region = ....
  2. Добавьте [AWS] перед секретной информацией о ключах подключения.

Перейдите в директорию aws в скачанном репозитории и отредактируйте следующие переменные в файле variable.tf:

  1. aws_region – регион, в котором будет развернута инфраструктура.
  2. aws_profile – имя профиля безопасности из файла ~/.aws/credentials.
  3. availability_zones – список зон доступности региона. Формируется из названия региона и порядковой буквы. Например, для региона us-west-2 список зон доступности будет выглядеть так: ["us-west-2a", "us-west-2b", "us-west-2c"].

Теперь, находясь в поддиректории aws, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:

  1. terraform init – установка провайдера и инициализация модулей.
  2. terraform plan – создание плана будущей инфраструктуры.
  3. terraform apply (повторное выполнение) – создание ресурсов в облаке.

Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).

Создание инфраструктуры в Azure для развертывания YDB кластера

Создайте аккаунт в Azure и пополните счёт аккаунта на сумму, достаточную для работы девяти ВМ. Рассчитать примерную стоимость содержания инфраструктуры в зависимости от региона и прочих обстоятельств можно с помощью калькулятора.

Аутентификация в провайдере Azure для Terraform осуществляется через CLI:

  1. Скачать, установить и настроить Azure CLI можно, следуя этой инструкции.
  2. Авторизоваться в Azure с помощью Azure CLI можно в интерактивном режиме командой az login, а для создания пары SSH-ключей (Linux, macOS) проще всего будет воспользоваться командой ssh-keygen.

После авторизации в Azure и генерации SSH-ключей нужно изменить дефолтное значение следующих переменных в корневом файле variables.tf:

  1. auth_location – название региона, где будет развернута инфраструктура. Список доступных регионов в зависимости от подписки можно получить командой az account list-locations | grep "displayName".
  2. ssh_key_path – путь к публичной части сгенерированного SSH-ключа.

Теперь, находясь в поддиректории azure, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:

  1. terraform init – установка провайдера и инициализация модулей.
  2. terraform plan – создание плана будущей инфраструктуры.
  3. terraform apply (повторное выполнение) – создание ресурсов в облаке.

Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).

Создание инфраструктуры в Google Cloud Platform для развертывания YDB кластера

Зарегистрируйтесь в Google Cloud Console и создайте проект. Активируйте платежный аккаунт и пополните его средствами для запуска девяти ВМ. Рассчитать стоимость можно в калькуляторе.

Настройте GCP CLI:

  1. Актируйте Compute Engine API и Cloud DNS API.
  2. Скачайте и установите GCP CLI, следуя этой инструкции.
  3. Перейдите в поддиректорию .../google-cloud-sdk/bin и выполните команду ./gcloud compute regions list для получения списка доступных регионов.
  4. Выполните команду ./gcloud auth application-default login для настройки профиля подключения.

Перейдите в поддиректорию gcp (находится в скаченном репозитории) и в файле variables.tf задайте актуальные значения следующим переменным:

  1. project – название проекта, которое было задано в облачной консоли Google Cloud.
  2. region – регион, где будет развернута инфраструктура.
  3. zones – список зон доступности, в которых будут созданы подсети и ВМ.

Теперь, находясь в поддиректории gcp, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:

  1. terraform init – установка провайдера и инициализация модулей.
  2. terraform plan – создание плана будущей инфраструктуры.
  3. terraform apply (повторное выполнение) – создание ресурсов в облаке.

Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).

Создание инфраструктуры в Yandex Cloud для развертывания YDB кластера

Для создания инфраструктуры в Yandex Cloud с помощью Terraform нужно:

  1. Подготовить облако к работе:
  2. Установить и настроить Yandex Cloud CLI:
  3. Создать сервисный аккаунт с помощью CLI.
  4. Сгенерировать SA ключ в JSON формате для подключения Terraform к облаку с помощью CLI: yc iam key create --service-account-name <acc name> --output <file name> --folder-id <cloud folder id>. Будет сгенерирован SA ключ, а в терминал будет выведена секретная информация:
    access_key:
        id: ajenhnhaqgd3vp...
        service_account_id: aje90em65r6922...
        created_at: "2024-03-05T20:10:50.0150..."
        key_id: YCAJElaLsa0z3snzH4E...
    secret: YCPKNJDVhRZgyywl4hQwVdcSRC...
    
    Скопируйте access_key.id и secret. Значения этих полей нужны будут в дальнейшем при работе с AWS CLI.
  5. Скачать AWS CLI.
  6. Настроить окружение AWS CLI:
    • Запустите команду aws configure и последовательно введите сохраненные ранее access_key.id и secret. Для значения региона используйте ru-central1:
    aws configure
    AWS Access Key ID [None]: AKIAIOSFODNN********
    AWS Secret Access Key [None]: wJalr********/*******/bPxRfiCYEX********
    Default region name [None]: ru-central1
    Default output format [None]:
    
    Будут созданы файлы ~/.aws/credentials и ~/.aws/config.
  7. Отредактировать ~/.aws/credentials и ~/.aws/config следующим образом:
    • Добавьте [Ya_def_reg] в ~/.aws/config перед region = ru-central1-a.
    • Добавьте [Yandex] перед секретной информацией о ключах подключения.
  8. Настроить Yandex Cloud Terraform провайдера.
  9. Скачать данный репозиторий командой git clone https://github.com/ydb-platform/ydb-terraform.git.
  10. Перейти в директорию yandex_cloud (директория в скаченном репозитории) и внести изменения в следующие переменные, в файле variables.tf:
    • key_path – путь к сгенерированному SA ключу с помощью CLI.
    • cloud_id – ID облака. Можно получить список доступных облаков командой yc resource-manager cloud list.
    • profile – название профиля из файла ~/.aws/config.
    • folder_id – ID Cloud folder. Можно получить командой yc resource-manager folder list.

Теперь, находясь в поддиректории yandex_cloud, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:

  1. terraform init – установка провайдера и инициализация модулей.
  2. terraform plan – создание плана будущей инфраструктуры.
  3. terraform apply (повторное выполнение) – создание ресурсов в облаке.

Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).

Примечание

С помощью Yandex Cloud провайдера можно не только создавать инфраструктуру для дальнейшего развертывания на ней YDB кластера с помощью Ansible, но и управлять serverless или dedicated версией YDB прямо из Terraform. О возможностях работы с YDB в Yandex Cloud читайте в разделе Работа с YDB через Terraform документации Yandex Cloud.