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.
Все примеры из статьи доступны на Гитхабе.
Полезные ссылки: