Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Как добавить правило балансировщика через Terraform

Немного теории

Terraform

Terraform — это инструмент для управления инфраструктурой с помощью кода, созданный компанией HashiCorp. С его помощью можно автоматизировать создание и изменение ресурсов инфраструктуры с использованием декларативного языка конфигурации HCL.

Возможности Terraform:

  • Управление инфраструктурой с помощью единого инструмента
  • Контроль версий и повторное использование конфигураций
  • Возможность отслеживать текущее состояние инфраструктуры

Сетевые балансировщики

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

Горизонтальное масштабирование — это процесс добавления дополнительных узлов или машин к существующей инфраструктуре для увеличения её возможностей и обработки большего количества трафика.

Основные преимущества, которые предоставляет балансировщик:

  • Балансировка нагрузки для TCP-сессий, обеспечивающая оптимальное использование ресурсов серверов.
  • Поддержка различных протоколов HTTP, HTTP2, HTTPS, TCP.
  • Отказоустойчивость сервера приложений, позволяющая избежать проблем с доступностью и работоспособностью сервиса.
  • Возможность настраивать правила маршрутизации трафика, чтобы направлять запросы к определенным портам на серверах.
  • Возможность настройки SSL и переадресации на протокол HTTPS.

Создаем сетевой балансировщик

Для начала определимся с требованиями к балансировщику нагрузки:

  1. У нас будет два сервера, у которых на 80-м порту будет развернут сайт.
  2. Обращаясь по 80 порту к адресу балансировщика, мы должны будем попадать на наш сайт, на один из серверов.
  3. Алгоритм — Round robin.
  4. Дополнительных параметров нет.

Чтобы добавить правило к нашему балансировщику, нам нужно создать его и настроить балансировку серверов.

Я добавил два сервера для того, чтобы настроить для них балансировку нагрузки.

Image5

Теперь добавим проект на terraform. Подробнее об установке и настройке провайдера можно прочитать тут

Сначала необходимо создать папку, где будут находиться конфигурации:

mkdir timeweb-lb
cd timeweb-lb

Общая структура файлов получилась следующей:

├── timeweb-lb
│   ├── main.tf
│   ├── variables.tf

В файле variables.tf укажем переменные для токена провайдера и IP-адресов для балансировки:

variable "tw_token" {
  type = string
  sensitive = true
}

variable "lb-ips" {
    type = set(string)
}

В файле main.tf добавим информацию о провайдере:

terraform {
  required_providers {
    twc = {
        source = "tf.timeweb.cloud/timeweb-cloud/timeweb-cloud"
    }
  }
  required_version = ">= 1.5.3"
}

provider "twc" {
  token = var.tw_token
}

Когда мы описываем конфигурацию Terraform, мы используем два основных типа сущностей — это источники данных (data) и ресурсы (resources).

  • Источники данных предназначены для того, чтобы определять различные переменные и настройки, которые доступны в рамках выбранного провайдера. К таким источникам данных могут относиться, например, пресеты, проекты и другие параметры.
  • Ресурсы — это те элементы инфраструктуры, которые мы хотим создать с помощью Terraform — например, серверы, базы данных, балансировщики нагрузки и другие компоненты.

В файле main.tf укажем пресет для настройки:

data "twc_lb_preset" "lb-preset" {
  requests_per_second = "10K"
  price_filter {
    from = 100
    to = 200
  }
}

Если в панели управления вы используете проекты, то можно указать конкретный проект, в котором будут созданы ресурсы. Например, добавим проект с названием «Articles»:

data "twc_projects" "articles" {
  name = "Articles"
}

Ресурс, который мы будем создавать, называется twc_lb. При его создании мы можем указать множество опциональных параметров, например настройки healthcheck, выбор алгоритма балансировки. Возьмем самую простую настройку:

resource "twc_lb" "load-balancer" {
    name = "load-balancer"
    algo = "roundrobin"

    project_id = data.twc_projects.articles.id
    preset_id = data.twc_lb_preset.lb-preset.id


    health_check {
      proto = "tcp"
      port = 80
    }

    ips = var.lb-ips
}

Вот какие параметры мы можем ещё указать:

  • ips — список IP-адресов для балансировки
  • is_keepalive — флаг, который указывает на поддержание TCP-соединения с сервером
  • is_ssl — автоматический редирект на протокол HTTPS
  • is_sticky — сохранять пользовательскую сессию для одного бэкэнд-сервера

Также в проект я добавил файл .tfvars, где указал значения переменных из variables.tf:

tw_token = "<тут api key для провайдера>"
lb-ips = [ "<тут ip-адрес для первого сервера>", "<тут — для второго>" ]

Далее выполним команду:

terraform validate

Если всё хорошо, вы должны увидеть сообщение, как на скриншоте. 

Image1

Теперь можно выполнить следующую команду, чтобы посмотреть, какие ресурсы будут созданы:

terraform plan -var-file=.tfvars

Флаг -var-file=.tfvars позволяет нам указать на файл с переменными, которые необходимо будет подставить при применении этого кода.

Image8

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

  1. С помощью параметра -var, например -var="tw_token=243453452345235456643"
  2. C помощью переменных окружения —
    export TF_VAR_tw_token=243453452345235456643

Добавляем правила к балансировщику

Правилом в балансировщике будем называть настройку перенаправления портов. В правиле, независимо от способа создания, необходимо указать:

  1. Порт, на который мы будем обращаться по адресу балансировщика.
  2. Порт, на который мы будем перенаправляться на конкретных серверах.

Добавим новый ресурс в нашу конфигурацию, в файл main.tf:

resource "twc_lb_rule" "lb-rule" {
  lb_id = resource.twc_lb.load-balancer.id
  balancer_proto = "http"
  balancer_port = 80
  server_proto = "http"
  server_port = 80
}

Снова выполним команды:

terraform validate
terraform plan -var-file=.tfvars
terraform apply -var-file=.tfvars

Подтвердим применение команды, введя yes.

Image2

В панели управления видим созданные ресурсы:

  • Балансировщик

830daf03 83ea 443c 939b 0187dd70a249

  • Правило

Image10

Перейдём по адресу нашего балансировщика (два раза, чтобы попасть на разные серверы):

  • Первый сервер, указанный в переменных:

Image3

  • Второй сервер, указанный в переменных:

Image6

Что делать, если нам потребовалось добавить второе правило? Например, на серверах мы развернули новое приложение на порту 81.

Просто добавим ещё один блок resource для правила:

resource "twc_lb_rule" "lb-second-rule" {
  # таким образом мы укажем идентификатор балансировщика, созданного ранее
  lb_id = resource.twc_lb.load-balancer.id
  balancer_proto = "http"
  balancer_port = 81
  server_proto = "http"
  server_port = 81
}

Снова выполним команду ниже, чтобы посмотреть на изменения:

terraform plan -var-file=.tfvars

Image4

Мы видим информацию о том, что один балансировщик и одно правило уже созданы, а новое правило будет добавлено. 

Выполним команду:

terraform apply -var-file=.tfvars

При запросе согласимся на применение конфигурации:

Image9

Теперь заглянем в панель управления — у нас настроены два правила:

Image11

Обратимся по адресу балансировщика, чтобы проверить, что всё работает корректно:

Image12

Заключение

В этой статье мы научились создавать сетевые балансировщики и правила с помощью Terraform. Помимо использования этого инструмента, балансировщиками можно управлять с помощью CLI и API.

Все примеры из статьи доступны на Гитхабе.

Полезные ссылки:

Была ли статья полезна?

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону