Создать сервер, кластер Managed Kubernetes и кластер облачной базы данных в приватной подсети
Это пример создания инфраструктуры, которая состоит:
- из приватной подсети
192.168.199.0/24
; - облачного сервера произвольной конфигурации с загрузочным сетевым диском и дополнительным сетевым диском;
- отказоустойчивого кластера Managed Kubernetes с нодами произвольной конфигурации;
- кластера MySQL semi-sync произвольной конфигурации.
Мы рекомендуем создавать ресурсы по порядку. Если вы единовременно создаете все ресурсы, которые описаны в конфигурационном файле, может возникнуть ошибка — Terraform создает ресурсы независимо от порядка, в котором они перечислены в файле.
-
Опционально: настройте провайдеры.
Конфигурационные файлы
Пример файла для настройки провайдеров
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "~>6.0.0"
}
openstack = {
source = "terraform-provider-openstack/openstack"
version = "2.1.0"
}
}
}
provider "selectel" {
domain_name = "123456"
username = "user"
password = "password"
auth_region = "ru-9"
auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
}
resource "selectel_vpc_project_v2" "project_1" {
name = "project"
}
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "username"
password = "password"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}
provider "openstack" {
auth_url = "https://cloud.api.selcloud.ru/identity/v3"
domain_name = "123456"
tenant_id = selectel_vpc_project_v2.project_1.id
user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
password = selectel_iam_serviceuser_v1.serviceuser_1.password
region = "ru-9"
}
Пример файла для создания сервера произвольной конфигурации с загрузочным сетевым диском и дополнительным сетевым диском
resource "selectel_vpc_keypair_v2" "keypair_1" {
name = "keypair"
public_key = file("~/.ssh/id_rsa.pub")
user_id = selectel_iam_serviceuser_v1.serviceuser_1.id
}
resource "openstack_compute_flavor_v2" "flavor_1" {
name = "custom-flavor-with-network-volume"
vcpus = 2
ram = 2048
disk = 0
is_public = false
lifecycle {
create_before_destroy = true
}
}
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}
data "openstack_networking_network_v2" "external_network_1" {
external = true
}
resource "openstack_networking_router_v2" "router_1" {
name = "router"
external_network_id = data.openstack_networking_network_v2.external_network_1.id
}
resource "openstack_networking_router_interface_v2" "router_interface_1" {
router_id = openstack_networking_router_v2.router_1.id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
resource "openstack_networking_port_v2" "port_1" {
name = "port"
network_id = openstack_networking_network_v2.network_1.id
fixed_ip {
subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
}
data "openstack_images_image_v2" "image_1" {
name = "Ubuntu 20.04 LTS 64-bit"
most_recent = true
visibility = "public"
}
resource "openstack_blockstorage_volume_v3" "volume_1" {
name = "boot-volume-for-server"
size = "5"
image_id = data.openstack_images_image_v2.image_1.id
volume_type = "fast.ru-9a"
availability_zone = "ru-9a"
enable_online_resize = true
lifecycle {
ignore_changes = [image_id]
}
}
resource "openstack_blockstorage_volume_v3" "volume_2" {
name = "additional-volume-for-server"
size = "7"
volume_type = "universal.ru-9a"
availability_zone = "ru-9a"
enable_online_resize = true
}
resource "openstack_compute_instance_v2" "server_1" {
name = "server"
flavor_id = openstack_compute_flavor_v2.flavor_1.id
key_pair = selectel_vpc_keypair_v2.keypair_1.name
availability_zone = "ru-9a"
network {
port = openstack_networking_port_v2.port_1.id
}
lifecycle {
ignore_changes = [image_id]
}
block_device {
uuid = openstack_blockstorage_volume_v3.volume_1.id
source_type = "volume"
destination_type = "volume"
boot_index = 0
}
block_device {
uuid = openstack_blockstorage_volume_v3.volume_2.id
source_type = "volume"
destination_type = "volume"
boot_index = -1
}
vendor_options {
ignore_resize_confirmation = true
}
}
resource "openstack_networking_floatingip_v2" "floatingip_1" {
pool = "external-network"
}
resource "openstack_networking_floatingip_associate_v2" "association_1" {
port_id = openstack_networking_port_v2.port_1.id
floating_ip = openstack_networking_floatingip_v2.floatingip_1.address
}
output "public_ip_address" {
value = openstack_networking_floatingip_v2.floatingip_1.fixed_ip
}
Пример файла для создания отказоустойчивого кластера Managed Kubernetes с нодами произвольной конфигурации
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
name = "private-subnet"
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}
data "openstack_networking_network_v2" "external_network_1" {
external = true
}
resource "openstack_networking_router_v2" "router_1" {
name = "router"
external_network_id = data.openstack_networking_network_v2.external_network_1.id
}
resource "openstack_networking_router_interface_v2" "router_interface_1" {
router_id = openstack_networking_router_v2.router_1.id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
data "selectel_mks_kube_versions_v1" "versions" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
}
resource "selectel_mks_cluster_v1" "cluster_1" {
name = "high_availability_cluster"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
kube_version = data.selectel_mks_kube_versions_v1.versions.latest_version
network_id = openstack_networking_network_v2.network_1.id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
maintenance_window_start = "00:00:00"
}
resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
cluster_id = selectel_mks_cluster_v1.cluster_1.id
project_id = selectel_mks_cluster_v1.cluster_1.project_id
region = selectel_mks_cluster_v1.cluster_1.region
availability_zone = "ru-9a"
nodes_count = "2"
cpus = 2
ram_mb = 4096
volume_gb = 32
volume_type = "fast.ru-9a"
install_nvidia_device_plugin = false
labels = {
"label-key0": "label-value0",
"label-key1": "label-value1",
"label-key2": "label-value2",
}
}
Пример файла для создания кластера MySQL semi-sync произвольной конфигурации
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}
data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
engine = "mysql_native"
version = "8"
}
}
resource "selectel_dbaas_mysql_datastore_v1" "datastore_1" {
name = "datastore-1"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
node_count = 3
flavor {
vcpus = 1
ram = 4096
disk = 32
}
}
resource "selectel_dbaas_user_v1" "user_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_mysql_datastore_v1.datastore_1.id
name = "user"
password = "secret"
}
resource "selectel_dbaas_mysql_database_v1" "database_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_mysql_datastore_v1.datastore_1.id
name = "database_1"
}
resource "selectel_dbaas_grant_v1" "grant_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_mysql_datastore_v1.datastore_1.id
database_id = selectel_dbaas_mysql_database_v1.database_1.id
user_id = selectel_dbaas_user_v1.user_1.id
}
1. Опционально: настроить провайдеры
Если вы настроили провайдеры Selectel и OpenStack, пропустите этот шаг.
-
Убедитесь, что в панели управления вы создали сервисного пользователя с ролями Администратор аккаунта и Администратор пользователей.
-
Создайте директорию для хранения конфигурационных файлов и отдельный файл с расширением
.tf
для настройки провайдеров. -
В файл д ля настройки провайдеров добавьте провайдеры Selectel и OpenStack:
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "6.0.0"
}
openstack = {
source = "terraform-provider-openstack/openstack"
version = "2.1.0"
}
}
}Здесь
version
— версии провайдеров. Актуальную версию можно посмотреть в документации Selectel (в Terraform Registry и GitHub) и OpenStack (в Terraform Registry и GitHub).Подробнее о продуктах, услугах и сервисах, которыми можно управлять с помощью провайдеров, в инструкции Провайдеры Selectel и OpenStack.
-
Инициализируйте провайдер Selectel:
provider "selectel" {
domain_name = "123456"
username = "user"
password = "password"
auth_region = "ru-9"
auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
}Здесь:
domain_name
— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;username
— имя сервисного пользователя с ролями Администратор аккаунта и Администратор пользователей. Можно посмотреть в панели управлени я: раздел Управление доступом → Управление пользователями → вкладка Сервисные пользователи (раздел доступен только Владельцу аккаунта и Администратору пользователей);password
— пароль сервисного пользователя. Можно посмотреть при создании пользователя или изменить на новый;auth_region
— пул, напримерru-9
. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
-
Создайте проект:
resource "selectel_vpc_project_v2" "project_1" {
name = "project"
}Посмотрите подробное описание ресурса selectel_vpc_project_v2.
-
Создайте сервисного пользователя для доступа к проекту и назначьте ему роль Администратор проекта:
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "username"
password = "password"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}Здесь:
username
— имя пользователя;password
— пароль пользователя. Пароль должен быть не короче восьми символов и содержать латинские буквы разных регистров и цифры;project_id
— ID проекта. Можно посмотреть в панели управления: раздел Облачная платформа → откройте меню проектов (название текущего проекта) → в строке нужного проекта нажмите .
Посмотрите подробное описание ресурса selectel_iam_serviceuser_v1.
-
Инициализируйте провайдер OpenStack:
provider "openstack" {
auth_url = "https://cloud.api.selcloud.ru/identity/v3"
domain_name = "123456"
tenant_id = selectel_vpc_project_v2.project_1.id
user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
password = selectel_iam_serviceuser_v1.serviceuser_1.password
region = "ru-9"
}Здесь:
domain_name
— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;region
— пул, напримерru-9
. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
-
Если одновременно с настройкой провайдеров вы создаете ресурсы, то для ресурсов OpenStack добавьте аргумент
depends_on
. Например, для ресурса openstack_networking_network_v2:resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
depends_on = [
selectel_vpc_project_v2.project_1,
selectel_iam_serviceuser_v1.serviceuser_1
]
} -
Опционально: если вы хотите использовать зеркало, создайте отдельный конфигурационный файл Terraform CLI и добавьте в него блок:
provider_installation {
network_mirror {
url = "https://tf-proxy.selectel.ru/mirror/v1/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}Подробнее о настройках зеркал в инструкции CLI Configuration File документации HashiCorp.
-
Откройте CLI.
-
Инициализируйте конфигурацию Terraform в директории:
terraform init
-
Проверьте, что конфигурационные файлы составлены без ошибок:
terraform validate
-
Отформатируйте конфигурационные файлы:
terraform fmt
-
Проверьте, какие ресурсы будут созданы:
terraform plan
-
Примените изменения и создайте ресурсы:
terraform apply
-
Подтвердите создание — введите yes и нажмите Enter. Созданные ресурсы отобразятся в панели управления.
-
Если для создания ресурсов оказалось недостаточно квот, увеличьте квоты.
2. Создать пару SSH-ключей
resource "selectel_vpc_keypair_v2" "keypair_1" {
name = "keypair"
public_key = file("~/.ssh/id_rsa.pub")
user_id = selectel_iam_serviceuser_v1.serviceuser_1.id
}
Здесь public_key
— путь до публичного SSH-ключа. Если SSH-ключи не созданы, сгенерируйте их.
Посмотрите подробное описание ресурса selectel_vpc_keypair_v2.
3.Создать приватную сеть и подсеть
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
name = "private-subnet"
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}
Здесь cidr
— CIDR приватной подсети, например 192.168.199.0/24
.
Посмотрите подробное описание ресурсов:
4. Создать облачный роутер, подключенный к внешней сети
Облачный роутер, подключенный к внешней сети, выполняет функцию 1:1 NAT для доступа из приватной сети в интернет через публичный IP-адрес роутера.
data "openstack_networking_network_v2" "external_network_1" {
external = true
}
resource "openstack_networking_router_v2" "router_1" {
name = "router"
external_network_id = data.openstack_networking_network_v2.external_network_1.id
}
resource "openstack_networking_router_interface_v2" "router_interface_1" {
router_id = openstack_networking_router_v2.router_1.id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
Посмотрите подробное описание ресурсов:
- openstack_networking_network_v2;
- openstack_networking_router_v2;
- openstack_networking_router_interface_v2.
5. Создать облачный сервер
1. Создать порт для облачного сервера
resource "openstack_networking_port_v2" "port_1" {
name = "port"
network_id = openstack_networking_network_v2.network_1.id
fixed_ip {
subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
}
Посмотрите подробное описание ресурса openstack_networking_port_v2.
2. Получить образ
data "openstack_images_image_v2" "image_1" {
name = "Ubuntu 20.04 LTS 64-bit"
most_recent = true
visibility = "public"
}
Посмотрите подробное описание источника данных openstack_images_image_v2.
3. Создать загрузочный сетевой диск
resource "openstack_blockstorage_volume_v3" "volume_1" {
name = "boot-volume-for-server"
size = "5"
image_id = data.openstack_images_image_v2.image_1.id
volume_type = "fast.ru-9a"
availability_zone = "ru-9a"
enable_online_resize = true
lifecycle {
ignore_changes = [image_id]
}
}
Здесь:
size
— размер диска в ГБ. Учитывайте лимиты сетевых дисков на максимальный размер;volume_type
— ID или имя типа сетевого диска. Например,fast.ru-9a
— имя для создания сетевого диска с типом SSD Быстрый в сегменте пула ru-9a. Список типов можно посмотреть в таблице Список типов сетевого диска во всех сегментах пула;availability_zone
— сегмент пула, в котором будет создан сетевой диск, напримерru-9a
. Список доступных сегментов пула можно посмотреть в инструкции Матрицы доступности.
Посмотрите подробное описание ресурса openstack_blockstorage_volume_v3.
4. Создать облачный сервер
resource "openstack_compute_instance_v2" "server_1" {
name = "server"
flavor_id = "4011"
key_pair = selectel_vpc_keypair_v2.keypair_1.name
availability_zone = "ru-9a"
network {
port = openstack_networking_port_v2.port_1.id
}
lifecycle {
ignore_changes = [image_id]
}
block_device {
uuid = openstack_blockstorage_volume_v3.volume_1.id
source_type = "volume"
destination_type = "volume"
boot_index = 0
}
vendor_options {
ignore_resize_confirmation = true
}
}
Здесь:
availability_zone
— сегмент пула, в котором будет создан облачный сервер, напримерru-9a
. Список доступных сегментов пула можно посмотреть в инструкции Матрицы доступности;flavor_id
— ID флейвора. Флейворы соответствуют конфигурациям облачного сервера и определяют количество vCPU, RAM и размер локального диска (опционально) сервера. Можно использовать флейворы фиксированных конфигураций. Например,4011
— ID для создания сервера с фиксированной конфигурацией линейки Memory Line с 2 vCPU, 16 ГБ RAM в пуле ru-9. Список флейворов можно посмотреть в таблице Список флейворов фиксированной конфигурации во всех пулах.
Посмотрите подробное описание ресурса openstack_compute_instance_v2.
5. Создать публичный IP-адрес
resource "openstack_networking_floatingip_v2" "floatingip_1" {
pool = "external-network"
}
Посмотрите подробное описание ресурса openstack_networking_floatingip_v2.
6. Назначи ть ассоциацию публичного и приватного IP-адреса облачного сервера
Публичный IP-адрес будет подключен к порту облачного сервера и ассоциирован с приватным IP.
resource "openstack_networking_floatingip_associate_v2" "association_1" {
port_id = openstack_networking_port_v2.port_1.id
floating_ip = openstack_networking_floatingip_v2.floatingip_1.address
}
Посмотрите подробное описание ресурса openstack_networking_floatingip_associate_v2.
6. Создать кластер Managed Kubernetes
1. Создать отказоустойчивый кластер
data "selectel_mks_kube_versions_v1" "versions" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
}
resource "selectel_mks_cluster_v1" "cluster_1" {
name = "high_availability_cluster"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
kube_version = data.selectel_mks_kube_versions_v1.versions.latest_version
network_id = openstack_networking_network_v2.network_1.id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
maintenance_window_start = "00:00:00"
}
Здесь region
— пул, в котором будет создан кластер, например ru-9
.
Посмотрите подробное описание ресурса selectel_mks_cluster_v1.
2. Создать группу нод произвольной конфигурации с сетевым диском
resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
cluster_id = selectel_mks_cluster_v1.cluster_1.id
project_id = selectel_mks_cluster_v1.cluster_1.project_id
region = selectel_mks_cluster_v1.cluster_1.region
availability_zone = "ru-9a"
nodes_count = "2"
cpus = 2
ram_mb = 4096
volume_gb = 32
volume_type = "fast.ru-9a"
install_nvidia_device_plugin = false
labels = {
"label-key0": "label-value0",
"label-key1": "label-value1",
"label-key2": "label-value2",
}
}
Здесь:
-
availability_zone
— сегмент пула, в котором будет находиться группа нод, напримерru-9a
; -
nodes_count
— количество рабочих нод в группе нод. Максимальное количество нод — 15; -
cpus
— количество vCPU для каждой ноды; -
ram_mb
— количество RAM для каждой ноды в МБ; -
volume_gb
— размер диска в ГБ; -
volume_type
— тип диска в формате<type>.<pool_segment>
, напримерbasic.ru-9a
:<type>
—basic
,universal
илиfast
;<pool_segment>
— сегмент пула, в котором будет создан сетевой диск, напримерru-9a
;
-
install_nvidia_device_plugin
— подтверждает или отменяет установку драйверов GPU и NVIDIA® Device Plugin:true
— для флейворов с GPU подтверждает установку драйверов GPU и NVIDIA® Device Plugin;false
— для флейворов с GPU и без GPU отменяет установку драйверов GPU и NVIDIA® Device Plugin. Вы можете самостоятельно установить драйверы для групп нод с GPU.
Посмотрите подробное описание ресурса selectel_mks_nodegroup_v1.
7. Создать кластер облачной базы данных
1. Создать MySQL semi-sync кластер произвольной конфигурации
data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
engine = "mysql_native"
version = "8"
}
}
resource "selectel_dbaas_mysql_datastore_v1" "datastore_1" {
name = "datastore-1"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
node_count = 3
flavor {
vcpus = 1
ram = 4096
disk = 32
}
}
Здесь:
region
— пул, напримерru-9
. Список доступных пулов можно посмотреть в инструкции Матрицы доступности;filter
— фильтр типов облачных баз данных:engine
— тип облачных баз данных. Для кластера MySQL semi-sync укажитеmysql_native
;version
— версия облачной базы данных. Список доступных версий можно посмотреть в инструкции Версии и конфигурации;
nodes_count
— количество нод. Максимальное количество нод — 6;flavor
— произвольная конфигурация кластера. Доступные значения произвольных конфигураций можно посмотреть в инструкции Версии и конфигурации:vcpus
— количество vCPU;ram
— количество RAM в МБ;disk
— размер диска в ГБ.
Посмотрите подробное описание источников данных и ресурсов:
2. Создать пользователя
resource "selectel_dbaas_user_v1" "user_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_mysql_datastore_v1.datastore_1.id
name = "user"
password = "secret"
}
Здесь:
region
— пул, в котором находится кластер;name
— имя пользователя;password
— пароль пользователя.
Посмотрите подробное описание ресурса selectel_dbaas_user_v1.
3. Создать базу данных
resource "selectel_dbaas_mysql_database_v1" "database_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_mysql_datastore_v1.datastore_1.id
name = "database_1"
}
Здесь region
— пул, в котором находится кластер.
Посмотрите подробное описание ресурса selectel_dbaas_mysql_database_v1.
4. Выдать пользователю доступ к базе данных
resource "selectel_dbaas_grant_v1" "grant_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_mysql_datastore_v1.datastore_1.id
database_id = selectel_dbaas_mysql_database_v1.database_1.id
user_id = selectel_dbaas_user_v1.user_1.id
}
Посмотрите подробное описание ресурса selectel_dbaas_grant_v1.