Облачная платформаEvolution

Развертывание Kafka, Redis и DNS в приватной сети с помощью Terraform


С помощью этого руководства вы развернете приватную инфраструктуру для распределенного приложения с использованием Terraform: виртуальную сеть, подсеть, кластеры Managed Kafka и Managed Redis, а также внутренний DNS-сервер.

Созданные ресурсы будут находиться в одной VPC и взаимодействовать через приватную сеть:

../_images/common_schema.svg

Terraform будет единой точкой управления инфраструктурой: вы опишете ее желаемое состояние в конфигурационных файлах, а Terraform Provider создаст ресурсы через API Cloud.ru.

../_images/tf_with_schema.svg

Ссылки между ресурсами в конфигурации сформируют граф зависимостей. Например, кластеры Kafka и Redis будут ссылаться на созданную подсеть, а DNS-сервер — на подсеть и VPC. Terraform определит порядок создания ресурсов автоматически.

../_images/isolation_resources.svg

Kafka и Redis будут созданы как управляемые сервисы: устанавливать их на виртуальные машины и обслуживать инфраструктурное программное обеспечение самостоятельно не потребуется.

../_images/tf_vs_vm.svg

Для развертывания вы будете использовать следующие сервисы:

  • Managed Kafka — сервис для развертывания и управления кластерами Apache Kafka®.

  • Managed Redis — хранилище данных в оперативной памяти.

  • DNS — сервис по управлению приватными и публичными зонами и их ресурсными записями.

  • VPC — изолированная виртуальная сеть для создания безопасной инфраструктуры.

  • «Подсети» — сервис, позволяющий создавать подсети для размещения в них облачных ресурсов.

Шаги:

  1. Подготовьте файлы конфигурации.

  2. Разверните инфраструктуру.

  3. Проверьте созданные ресурсы.

  4. Удалите созданные ресурсы.

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Установите Terraform.

  3. Установите и настройте Terraform Provider.

  4. Создайте сервисный аккаунт и ключ доступа. Сохраните Key ID (логин) и Key Secret (пароль): они потребуются для аутентификации в Terraform.

  5. Скопируйте идентификатор проекта.

Примечание

Примеры конфигурации подготовлены для Terraform Provider версии 2.1.4.

1. Подготовьте файлы конфигурации

  1. Создайте файл terraform.tfvars и укажите данные для подключения Terraform Provider к проекту:

    auth_key_id = "<auth_key_id>"
    auth_secret = "<auth_secret>"
    project_id = "<project_id>"

    Где:

    • <auth_key_id> — Key ID ключа доступа сервисного аккаунта.

    • <auth_secret> — Key Secret ключа доступа сервисного аккаунта.

    • <project_id> — идентификатор проекта Cloud.ru.

    Внимание

    Не добавляйте terraform.tfvars с ключами доступа в систему контроля версий.

  2. Создайте файл variables.tf с описанием входных переменных:

    variable "auth_key_id" {
    type = string
    sensitive = true
    }
    variable "auth_secret" {
    type = string
    sensitive = true
    }
    variable "project_id" {
    description = "ID проекта в EVO Cloud"
    type = string
    }
    variable "kafka_brokers" {
    type = number
    description = "Number of Kafka brokers"
    default = 3
    }
    variable "kafka_storage_gib" {
    type = number
    description = "Kafka storage size in GiB"
    default = 50
    }
    variable "redis_storage_gib" {
    type = number
    description = "Redis storage size in GiB"
    default = 40
    }
    variable "subnet_address" {
    type = string
    description = "Private subnet address"
    default = "10.20.0.0/24"
    }
  3. Создайте файл main.tf с конфигурацией Terraform Provider и адресами API сервисов:

    terraform {
    required_providers {
    cloudru = {
    source = "cloud.ru/cloudru/cloud"
    version = "2.1.4"
    }
    }
    }
    provider "cloudru" {
    auth_key_id = var.auth_key_id
    auth_secret = var.auth_secret
    region = "ru-central-1"
    project_id = var.project_id
    endpoints = {
    iam_endpoint = "iam.api.cloud.ru:443"
    compute_endpoint = "compute.api.cloud.ru:443"
    baremetal_endpoint = "baremetal.api.cloud.ru:443"
    mk8s_endpoint = "mk8s.api.cloud.ru:443"
    vpc_endpoint = "vpc.api.cloud.ru:443"
    magic_router_endpoint = "magic-router.api.cloud.ru"
    dns_endpoint = "dns.api.cloud.ru:443"
    nlb_endpoint = "nlb.api.cloud.ru"
    kafka_endpoint = "kafka.api.cloud.ru:443"
    redis_endpoint = "redis.api.cloud.ru:443"
    spark_endpoint = "dataplatform.api.cloud.ru:443"
    trino_endpoint = "dataplatform.api.cloud.ru:443"
    metastore_endpoint = "dataplatform.api.cloud.ru:443"
    artifact_registry_endpoint = "ar.api.cloud.ru:443"
    object_storage_endpoint = "https://s3.cloud.ru"
    cloud_platform_endpoint = "organization.api.cloud.ru:443"
    postgresql_endpoint = "postgresql.api.cloud.ru:443"
    }
    }
  4. Создайте файл kafka.tf с конфигурацией кластера Managed Kafka:

    resource "cloudru_evolution_kafka_cluster" "test" {
    name = "test-private-kafka"
    project_id = var.project_id
    version_id = local.kafka_version_id
    specification_id = local.kafka_specification_id
    brokers = var.kafka_brokers
    storage_gib = var.kafka_storage_gib
    subnet_id = cloudru_evolution_compute_subnet.test_data.id
    ui_enabled = false
    cruise_control_enabled = false
    cruise_control_rebalance_auto_enabled = false
    }
  5. Создайте файл redis.tf с конфигурацией кластера Managed Redis:

    resource "cloudru_evolution_redis_cluster" "test" {
    name = "test-private-redis"
    project_id = var.project_id
    version_id = local.redis_version_id
    specification_id = local.redis_specification_id
    subnet_id = cloudru_evolution_compute_subnet.test_data.id
    type = "CLUSTER"
    shards = 1
    replicas = 2
    storage_gib = var.redis_storage_gib
    }
  6. Создайте файл dns.tf с конфигурацией внутреннего DNS-сервера:

    resource "cloudru_evolution_dns_dns_server" "test" {
    name = "test-dns"
    availability_zone_id = local.availability_zone_id
    subnet_id = cloudru_evolution_compute_subnet.test_data.id
    vpc_id = cloudru_evolution_vpc_vpc.test.id
    ip_address = "10.20.0.10"
    }
  7. Создайте файл network.tf с конфигурацией VPC и подсети для размещения сервисов:

    resource "cloudru_evolution_vpc_vpc" "test" {
    name = "test-data-platform-vpc"
    project_id = var.project_id
    description = "Private Kafka and Redis network"
    }
    resource "cloudru_evolution_compute_subnet" "test_data" {
    project_id = var.project_id
    name = "test-data-subnet"
    zone = {
    id = local.availability_zone_id
    }
    vpc_id = cloudru_evolution_vpc_vpc.test.id
    subnet_address = var.subnet_address
    routed_network = true
    }
  8. Создайте файл data.tf с источниками данных для выбора зоны доступности, версий и конфигураций кластеров:

    data "cloudru_evolution_compute_zone_collection" "test_available" {
    project_id = var.project_id
    }
    data "cloudru_evolution_kafka_version_collection" "test_available" {
    product_type = "kafka"
    }
    data "cloudru_evolution_redis_version_collection" "test_available" {}
    locals {
    availability_zone = one([
    for zone in data.cloudru_evolution_compute_zone_collection.test_available.zones :
    zone
    if zone.enabled && zone.default
    ])
    availability_zone_id = local.availability_zone.id
    availability_zone_name = local.availability_zone.name
    kafka_versions = data.cloudru_evolution_kafka_version_collection.test_available.versions
    kafka_version = local.kafka_versions[
    length(local.kafka_versions) - 1
    ]
    kafka_version_id = local.kafka_version.id
    redis_versions = data.cloudru_evolution_redis_version_collection.test_available.versions
    redis_version = local.redis_versions[
    length(local.redis_versions) - 1
    ]
    redis_version_id = local.redis_version.id
    }
    data "cloudru_evolution_kafka_specification_collection" "test_available" {
    availability_zone_id = local.availability_zone_id
    version_id = local.kafka_version_id
    }
    data "cloudru_evolution_redis_specification_collection" "test_available" {
    availability_zone_id = local.availability_zone_id
    version_id = local.redis_version_id
    }
    locals {
    kafka_specifications = [
    for specification in data.cloudru_evolution_kafka_specification_collection.test_available.specifications :
    specification
    if(
    specification.min_brokers <= var.kafka_brokers &&
    specification.max_brokers >= var.kafka_brokers &&
    specification.min_storage_gigs <= var.kafka_storage_gib
    )
    ]
    kafka_specification = local.kafka_specifications[0]
    kafka_specification_id = local.kafka_specification.id
    redis_specifications = data.cloudru_evolution_redis_specification_collection.test_available.specifications
    redis_specification = local.redis_specifications[0]
    redis_specification_id = local.redis_specification.id
    }

2. Разверните инфраструктуру

  1. В терминале перейдите в каталог проекта.

  2. Отформатируйте конфигурационные файлы:

    terraform fmt
  3. Инициализируйте рабочий каталог Terraform:

    terraform init
  4. Проверьте синтаксис и внутреннюю согласованность конфигурации:

    terraform validate

    При успешной проверке Terraform выведет сообщение Success! The configuration is valid.

  5. Сформируйте план изменений:

    terraform plan

    Убедитесь, что Terraform планирует создать VPC, подсеть, кластеры Managed Kafka и Managed Redis, а также DNS-сервер.

  6. Примените конфигурацию:

    terraform apply
  7. Проверьте план еще раз, введите yes и нажмите Enter. Дождитесь сообщения об успешном завершении операции.

3. Проверьте созданные ресурсы

  1. Выведите ресурсы, которыми управляет Terraform:

    terraform state list

    Должны отобразиться следующие ресурсы:

    • cloudru_evolution_vpc_vpc.test;

    • cloudru_evolution_compute_subnet.test_data;

    • cloudru_evolution_kafka_cluster.test;

    • cloudru_evolution_redis_cluster.test;

    • cloudru_evolution_dns_dns_server.test.

  2. Перейдите в личный кабинет Cloud.ru и проверьте, что VPC, подсеть, кластеры Managed Kafka и Managed Redis, а также DNS-сервер созданы в выбранном проекте.

  3. Убедитесь, что кластеры перешли в рабочее состояние и используют созданную подсеть.

Использование инфраструктуры как основы приложения

Созданные сервисы можно использовать совместно или независимо друг от друга в зависимости от архитектуры приложения.

4. Удалите созданные ресурсы

Если инфраструктура больше не нужна, удалите созданные ресурсы, чтобы прекратить потребление платных ресурсов:

terraform destroy

Проверьте план удаления и введите yes. Terraform удалит ресурсы с учетом зависимостей между ними.

Результат

Вы подготовили единую Terraform-конфигурацию для VPC, подсети, кластеров Managed Kafka и Managed Redis и внутреннего DNS-сервера, развернули инфраструктуру и проверили созданные ресурсы. Итоговая схема управления инфраструктурой выглядит следующим образом:

../_images/final_schema.svg

Эту конфигурацию можно использовать как основу приложения и воспроизводить в разных окружениях, изменяя параметры кластеров и сети через входные переменные Terraform.