Terraform — это инструмент для управления инфраструктурой с помощью кода, созданный компанией HashiCorp. С его помощью можно автоматизировать создание и изменение ресурсов инфраструктуры с использованием декларативного языка конфигурации HCL.
Возможности Terraform:
В инструкции рассмотрим, как управлять правилами балансировщика нагрузки с помощью Terraform.
Сетевой балансировщик дает возможность равномерно распределить входящий трафик по нескольким серверам для улучшения доступности и надежности вашего сервиса. Он является незаменимым инструментом при реализации горизонтального масштабирования сервисов.
Горизонтальное масштабирование — это процесс добавления дополнительных узлов или машин к существующей инфраструктуре для увеличения её возможностей и обработки большего количества трафика.
Основные преимущества, которые предоставляет балансировщик:
Для начала определимся с требованиями к балансировщику нагрузки:
Чтобы добавить правило к нашему балансировщику, нам нужно создать его и настроить балансировку серверов.
Я добавил два сервера для того, чтобы настроить для них балансировку нагрузки.
Теперь добавим проект на 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).
В файле 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
— автоматический редирект на протокол HTTPSis_sticky
— сохранять пользовательскую сессию для одного бэкэнд-сервераТакже в проект я добавил файл .tfvars
, где указал значения переменных из variables.tf
:
tw_token = "<тут api key для провайдера>" lb-ips = [ "<тут ip-адрес для первого сервера>", "<тут — для второго>" ]
Далее выполним команду:
terraform validate
Если всё хорошо, вы должны увидеть сообщение, как на скриншоте.
Теперь можно выполнить следующую команду, чтобы посмотреть, какие ресурсы будут созданы:
terraform plan -var-file=.tfvars
Флаг -var-file=.tfvars
позволяет нам указать на файл с переменными, которые необходимо будет подставить при применении этого кода.
Помимо определения переменных в файле, указать их можно следующими способами:
-var
, например -var="tw_token=243453452345235456643"
export TF_VAR_tw_token=243453452345235456643
Правилом в балансировщике будем называть настройку перенаправления портов. В правиле, независимо от способа создания, необходимо указать:
Добавим новый ресурс в нашу конфигурацию, в файл 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
.
В панели управления видим созданные ресурсы:
Перейдём по адресу нашего балансировщика (два раза, чтобы попасть на разные серверы):
Что делать, если нам потребовалось добавить второе правило? Например, на серверах мы развернули новое приложение на порту 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
Мы видим информацию о том, что один балансировщик и одно правило уже созданы, а новое правило будет добавлено.
Выполним команду:
terraform apply -var-file=.tfvars
При запросе согласимся на применение конфигурации:
Теперь заглянем в панель управления — у нас настроены два правила:
Обратимся по адресу балансировщика, чтобы проверить, что всё работает корректно:
В этой статье мы научились создавать сетевые балансировщики и правила с помощью Terraform. Помимо использования этого инструмента, балансировщиками можно управлять с помощью CLI и API.
Все примеры из статьи доступны на Гитхабе.
Полезные ссылки:
Полностью решил мой вопрос
Понятно и доступно написано
Быстро нашел нужную информацию