Настройка сетевого взаимодействия ресурсов из разных каталогов
В Yandex Cloud сетевые ресурсы, например, облачные сети и подсети, обычно создаются в одном облачном каталоге ресурсов, а связь с ресурсами в других каталогах облака отсутствует. При развертывании ресурсов в Yandex Cloud часто возникает необходимость обеспечить сетевое взаимодействие между ресурсами из разных каталогов. Один из способов решения этой задачи – метод Multi-folder VPC
, расширяющий область действия отдельно взятой сети VPC с одного каталога на несколько.
В зависимости от выбранного интерфейса управления Yandex Cloud расширение области действия сети в другие каталоги достигается за счет:
- перемещения подсетей в другие каталоги облака —
консоль управления (UI)
,YC CLI
; - создания подсетей в целевых каталогах —
YC CLI
; - создания подсетей в целевых каталогах —
Terraform
.
После этого к подсетям в целевых каталогах можно подключать виртуальные машины, кластеры Managed Service for Kubernetes, хосты БД, балансировщики нагрузки, агенты нагрузочного тестирования или другие ресурсы, находящиеся в этих каталогах. Таким образом можно получить сеть, которая обеспечит связность между ресурсами из разных каталогов.
В данном руководстве описан пример создания инфраструктуры, состоящей из трех виртуальных машин, расположенных в трех разных каталогах и объединенных в одну общую внутреннюю сеть. Сетевое объединение облачных ресурсов в разных каталогах заключается в создании в одном из этих каталогов облачной сети с последующим расширением области ее действия в другие каталоги. Таким образом, сеть из одного каталога, как бы растягивается на несколько каталогов, давая возможность подключать к «растянутым подсетям»
в этих каталогах нужные ресурсы.
Важно
Перемещение подсетей возможно только между каталогами одного облака.
Например, в составе среды разработки есть модуль CI/CD, компоненты которого размещаются в каталоге net-folder
. Им необходимо обеспечить сетевое взаимодействие с компонентами dev-, stage- и prod-окружений, которые находятся в соответствующих каталогах.
Схема такого решения показана на рисунке ниже.
В результате будет настроена сетевая связность между виртуальными машинами в разных окружениях (каталогах), которые подключены к разным подсетям одной сети. Кроме того, все ВМ смогут общаться друг с другом не только по IP-адресам, но и через доменные имена FQDN службы DNS.
Порядок действий
В зависимости от выбранного интерфейса управления порядок действий для создания Multi-folder VPC
может отличаться.
Чтобы создать тестовую инфраструктуру и организовать связь ресурсов:
- Подготовьте облако к работе.
- Создайте каталоги без сети VPC.
- Создайте облачную сеть VPC с подсетями.
- Переместите подсети.
- Создайте виртуальные машины.
- Проверьте сетевую связность ресурсов.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно работающие ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичных IP-адресов и исходящий трафик (см. тарифы Yandex Virtual Private Cloud).
Настройте права доступа
Настройте права доступа к каталогу:
- Чтобы создавать сети и управлять подсетями, назначьте сервисному аккаунту или пользователю сервисную роль
vpc.admin
либо сервисные ролиvpc.privateAdmin
,vpc.publicAdmin
,vpc.securityGroups.admin
. - Чтобы создавать и управлять ВМ в каталоге, назначьте сервисные роли
vpc.user
иcompute.admin
.
Разграничение сетевого доступа обеспечивается группами безопасности.
Создайте каталоги без сети VPC
-
Создайте каталоги
net-folder
,dev-folder
иprod-folder
:Консоль управленияCLITerraformAPI- В консоли управления
выберите облако и нажмите кнопку Создать каталог. - Введите имя каталога
net-folder
. - Отключите опцию Создать сеть по умолчанию, чтобы создать сеть и подсети вручную.
- Нажмите кнопку Создать.
Аналогично создайте еще два каталога без сети VPC с именами
dev-folder
иprod-folder
.Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
Примечание
Для создания ресурсов с помощью CLI необходимо аутентифицироваться от имени сервисного аккаунта с ролью
admin
на облако.-
Посмотрите описание команды создания каталога:
yc resource-manager folder create --help
-
Создайте облачные каталоги
net-folder
,dev-folder
иprod-folder
:yc resource-manager folder create --name net-folder yc resource-manager folder create --name dev-folder yc resource-manager folder create --name prod-folder
-
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Задайте параметры для Terraform-провайдера Yandex Cloud:
# ================================== # Terraform & Provider Configuration # ================================== terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = "~> 0.92.0" } } }
-
Опишите входные переменные:
variable "cloud_id" { description = "YC cloud-id. Taken from environment variable." }
-
Опишите целевые ресурсы — облачные каталоги:
# ======== # Folders # ======== resource "yandex_resourcemanager_folder" "net_folder" { cloud_id = var.cloud_id name = "net-folder" } resource "yandex_resourcemanager_folder" "dev_folder" { cloud_id = var.cloud_id name = "dev-folder" } resource "yandex_resourcemanager_folder" "prod_folder" { cloud_id = var.cloud_id name = "prod-folder" }
-
Создайте необходимую инфраструктуру:
-
Выполните команды:
export TF_VAR_cloud_id=$(yc config get cloud-id) export YC_TOKEN=$(yc iam create-token) terraform apply
-
Подтвердите изменение ресурсов и дождитесь завершения операции.
-
Воспользуйтесь методом REST API create для ресурса Folder или вызовом gRPC API FolderService/Create.
- В консоли управления
Создайте облачную сеть VPC с подсетями
В каталоге net-folder
создайте сеть shared-net
с тремя подсетями со следующими параметрами:
Имя подсети | Префикс | Зона доступности | Целевой каталог |
---|---|---|---|
subnet-a |
10.1.11.0/24 |
ru-central1-a |
net-folder |
subnet-b |
10.1.12.0/24 |
ru-central1-b |
dev-folder |
subnet-d |
10.1.13.0/24 |
ru-central1-d |
prod-folder |
-
Создайте облачную сеть:
Консоль управленияCLITerraformAPI- В консоли управления
перейдите в каталогnet-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- Задайте имя сети
shared-net
. - Отключите опцию Создать подсети, чтобы создать подсети вручную.
- Нажмите кнопку Создать сеть.
-
Посмотрите описание команды CLI для создания облачной сети:
yc vpc network create --help
-
Создайте облачную сеть
shared-net
в каталогеnet-folder
:yc vpc network create --folder-name net-folder --name shared-net
-
Опишите целевой ресурс — облачную сеть:
# ============= # VPC Resources # ============= resource "yandex_vpc_network" "shared_net" { folder_id = yandex_resourcemanager_folder.net_folder.id name = "shared-net" }
-
Выполните команды
export TF_VAR_cloud_id=$(yc config get cloud-id) export YC_TOKEN=$(yc iam create-token) terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
Воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
- В консоли управления
-
Создайте подсеть
subnet-a
в зоне доступностиru-central1-a
:Консоль управленияCLITerraformAPI- В консоли управления
перейдите в каталогnet-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Нажмите на имя облачной сети
shared-net
. - Нажмите кнопку Создать подсеть.
- Укажите название подсети
subnet-a
. - Выберите зону доступности
ru-central1-a
из выпадающего списка. - Введите CIDR подсети: IP-адрес
10.1.11.0
и маску подсети24
. Подробнее про диапазоны IP-адресов в подсетях читайте в разделе Облачные сети и подсети. - Нажмите кнопку Создать подсеть.
Аналогично создайте подсети
subnet-b
иsubnet-d
в зонах доступностиru-central1-b
иru-central1-d
в каталоге net-folder.-
Посмотрите описание команды CLI для создания подсети:
yc vpc subnet create --help
-
Создайте подсети в целевых каталогах:
yc vpc subnet create --folder-name net-folder --name subnet-a \ --network-name shared-net --zone ru-central1-a --range 10.1.11.0/24 yc vpc subnet create --folder-name dev-folder --name subnet-b \ --network-name shared-net --zone ru-central1-b --range 10.1.12.0/24 yc vpc subnet create --folder-name prod-folder --name subnet-d \ --network-name shared-net --zone ru-central1-d --range 10.1.13.0/24
-
Проверьте состояние созданных подсетей:
yc vpc subnet list --folder-name net-folder yc vpc subnet list --folder-name dev-folder yc vpc subnet list --folder-name prod-folder
-
Опишите целевые ресурсы — облачные подсети:
resource "yandex_vpc_subnet" "subnet_a" { folder_id = yandex_resourcemanager_folder.net_folder.id name = "subnet-a" description = "NET folder subnet" v4_cidr_blocks = ["10.1.11.0/24"] zone = "ru-central1-a" network_id = yandex_vpc_network.shared_net.id } resource "yandex_vpc_subnet" "subnet_b" { folder_id = yandex_resourcemanager_folder.dev_folder.id name = "subnet-b" description = "DEV folder subnet" v4_cidr_blocks = ["10.1.12.0/24"] zone = "ru-central1-b" network_id = yandex_vpc_network.shared_net.id } resource "yandex_vpc_subnet" "subnet_d" { folder_id = yandex_resourcemanager_folder.prod_folder.id name = "subnet-d" description = "PROD folder subnet" v4_cidr_blocks = ["10.1.13.0/24"] zone = "ru-central1-d" network_id = yandex_vpc_network.shared_net.id }
-
Выполните команды:
export TF_VAR_cloud_id=$(yc config get cloud-id) export YC_TOKEN=$(yc iam create-token) terraform apply
-
Подтвердите изменение ресурсов и дождитесь завершения операции.
Воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
- В консоли управления
Переместите подсети
Переместите подсеть subnet-b
в каталог dev-folder
:
- В консоли управления
перейдите в каталогnet-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Нажмите на имя облачной сети
shared-net
. - Нажмите значок
в строке подсетиsubnet-b
, и выберите Переместить. - В выпадающем списке выберите каталог
dev-folder
. - Нажмите кнопку Переместить.
-
Посмотрите описание команды CLI для перемещения подсети:
yc vpc subnet move --help
-
Переместите подсеть:
yc vpc subnet move subnet-b \ --destination-folder-name dev-folder
Воспользуйтесь методом REST API move для ресурса Subnet или вызовом gRPC API SubnetService/Move.
Аналогично переместите подсеть subnet-d
в каталог prod-folder
.
Создайте виртуальные машины
Создайте виртуальные машины со следующими параметрами:
Имя ВМ | Каталог | Зона доступности | Подсеть |
---|---|---|---|
net-vm |
net-folder |
ru-central1-a |
subnet-a |
dev-vm |
dev-folder |
ru-central1-b |
subnet-b |
prod-vm |
prod-folder |
ru-central1-d |
subnet-d |
Создайте ВМ net-vm
с ОС Linux в каталоге net-folder
:
- В консоли управления
выберите каталогnet-folder
. - В списке сервисов выберите Compute Cloud.
- Нажмите кнопку Создать виртуальную машину.
- В блоке Общая информация:
- Введите имя
net-vm
. - Выберите зону доступности
ru-central1-a
.
- Введите имя
- В блоке Образ загрузочного диска выберите Ubuntu 22.04 LTS.
- В блоке Сетевые настройки выберите подсеть
subnet-a
. - В блоке Доступ укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя
ycuser
. - В поле SSH-ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.
- В поле Логин введите имя пользователя
- Остальные настройки оставьте без изменения и нажмите кнопку Создать ВМ.
Аналогично создайте ВМ dev-vm
и prod-vm
в соответствующих каталогах.
Примечание
При создании ВМ назначаются публичный и внутренний IP-адреса. Запишите их — они понадобятся для доступа к ВМ и проверки сетевого взаимодействия с другими ВМ.
-
Опишите шаблон для метаданных ВМ в отдельном файле
vm-init.tpl
:#cloud-config datasource: Ec2: strict_id: false ssh_pwauth: yes users: - name: "${USER_NAME}" sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash ssh_authorized_keys: - "${USER_SSH_KEY}"
-
Сгенерируйте файл с метаданными для развертывания ВМ:
export USER_NAME=ycuser export USER_SSH_KEY=$(cat ~/.ssh/id_rsa.pub) envsubst < vm-init.tpl > vm-config.txt
-
Создайте виртуальные машины:
yc compute instance create --name=net-vm --hostname=net-vm \ --zone=ru-central1-a \ --platform=standard-v3 \ --cores=2 --memory=4G --core-fraction=100 \ --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2204-lts \ --network-interface subnet-name=subnet-a,ipv4-address=auto,nat-ip-version=ipv4 \ --metadata-from-file user-data=vm-config.txt yc compute instance create --name=dev-vm --hostname=dev-vm \ --zone=ru-central1-b \ --platform=standard-v3 \ --cores=2 --memory=4G --core-fraction=100 \ --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2204-lts \ --network-interface subnet-name=default-ru-central1-b,ipv4-address=auto,nat-ip-version=ipv4 \ --metadata-from-file user-data=vm-config.txt yc compute instance create --name=prod-vm --hostname=prod-vm \ --zone=ru-central1-d \ --platform=standard-v3 \ --cores=2 --memory=4G --core-fraction=100 \ --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2204-lts \ --network-interface subnet-name=default-ru-central1-d,ipv4-address=auto,nat-ip-version=ipv4 \ --metadata-from-file user-data=vm-config.txt
-
Сохраните публичные IP-адреса ВМ для дальнейшего использования:
NET_VM_IP=$(yc compute instance get net-vm --format=json | jq -r '.network_interfaces[0].primary_v4_address.one_to_one_nat.address') DEV_VM_IP=$(yc compute instance get dev-vm --format=json | jq -r '.network_interfaces[0].primary_v4_address.one_to_one_nat.address') PROD_VM_IP=$(yc compute instance get prod-vm --format=json | jq -r '.network_interfaces[0].primary_v4_address.one_to_one_nat.address')
-
Опишите входные переменные:
variable "user_name" { description = "VM User Name" default = "ycuser" } variable "user_ssh_key_path" { description = "User's SSH public key file" default = "~/.ssh/id_rsa.pub" }
-
Опишите шаблон для метаданных ВМ в отдельном файле
vm-init.tpl
:#cloud-config datasource: Ec2: strict_id: false ssh_pwauth: yes users: - name: "${USER_NAME}" sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash ssh_authorized_keys: - "${USER_SSH_KEY}"
-
Опишите целевые ресурсы — виртуальные машины:
# ================= # Compute Resources # ================= data "yandex_compute_image" "vm_image" { family = "ubuntu-2204-lts" } resource "yandex_compute_disk" "boot-disk-1" { name = "boot-disk-1" type = "network-hdd" zone = "ru-central1-a" size = "20" image_id = yandex_compute_image.vm_image.id } resource "yandex_compute_disk" "boot-disk-2" { name = "boot-disk-2" type = "network-hdd" zone = "ru-central1-b" size = "20" image_id = yandex_compute_image.vm_image.id } resource "yandex_compute_disk" "boot-disk-3" { name = "boot-disk-3" type = "network-hdd" zone = "ru-central1-d" size = "20" image_id = yandex_compute_image.vm_image.id } resource "yandex_compute_instance" "net_vm" { folder_id = yandex_resourcemanager_folder.net_folder.id name = "net-vm" hostname = "net-vm" platform_id = "standard-v3" zone = "ru-central1-a" resources { cores = 2 memory = 4 } boot_disk { disk_id = yandex_compute_disk.boot-disk-1.id } network_interface { subnet_id = yandex_vpc_subnet.subnet_a.id nat = true } metadata = { user-data = templatefile("vm-init.tpl", { USER_NAME = var.user_name USER_SSH_KEY = file(var.user_ssh_key_path) }) } } resource "yandex_compute_instance" "dev_vm" { folder_id = yandex_resourcemanager_folder.dev_folder.id name = "dev-vm" hostname = "dev-vm" platform_id = "standard-v3" zone = "ru-central1-b" resources { cores = 2 memory = 4 } boot_disk { disk_id = yandex_compute_disk.boot-disk-2.id } network_interface { subnet_id = yandex_vpc_subnet.subnet_b.id nat = true } metadata = { user-data = templatefile("vm-init.tpl", { USER_NAME = var.user_name USER_SSH_KEY = file(var.user_ssh_key_path) }) } } resource "yandex_compute_instance" "prod_vm" { folder_id = yandex_resourcemanager_folder.prod_folder.id name = "prod-vm" hostname = "prod-vm" platform_id = "standard-v3" zone = "ru-central1-d" resources { cores = 2 memory = 4 } boot_disk { disk_id = yandex_compute_disk.boot-disk-3.id } network_interface { subnet_id = yandex_vpc_subnet.subnet_d.id nat = true } metadata = { user-data = templatefile("vm-init.tpl", { USER_NAME = var.user_name USER_SSH_KEY = file(var.user_ssh_key_path) }) } } # ======= # Outputs # ======= output "NET-vm" { value = yandex_compute_instance.network_vm.network_interface.0.nat_ip_address } output "DEV-vm" { value = yandex_compute_instance.dev_vm.network_interface.0.nat_ip_address } output "PROD-vm" { value = yandex_compute_instance.prod_vm.network_interface.0.nat_ip_address }
-
Выполните команды
export TF_VAR_cloud_id=$(yc config get cloud-id) export YC_TOKEN=$(yc iam create-token) terraform apply
-
Подтвердите изменение ресурсов и дождитесь завершения операции.
Чтобы создать виртуальную машину, воспользуйтесь методом REST API create для ресурса Compute Instance или вызовом gRPC API InstanceService/Create.
Проверьте сетевую связность ресурсов
-
Подключитесь к ВМ
net-vm
по SSH:ssh ycuser@<публичный_IP-адрес_ВМ_net-vm>
-
Проверьте IP-связность с ВМ
dev-vm
внутри VPC:ping -c3 <внутренний_IP-адрес_ВМ_dev-vm>
Результат:
PING 10.127.20.4 (10.127.20.4) 56(84) bytes of data. 64 bytes from 10.127.20.4: icmp_seq=1 ttl=61 time=7.45 ms 64 bytes from 10.127.20.4: icmp_seq=2 ttl=61 time=5.61 ms 64 bytes from 10.127.20.4: icmp_seq=3 ttl=61 time=5.65 ms --- 10.127.20.4 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 5.613/6.235/7.446/0.855 ms
-
Аналогично проверьте IP-связность с ВМ
prod-vm
внутри VPC. -
Подключитесь к ВМ
dev-vm
по SSH и проверьте IP-связность с ВМnet-vm
и ВМprod-vm
с помощью команды ping. -
Подключитесь к ВМ
prod-vm
по SSH и проверьте IP-связность с ВМnet-vm
и ВМdev-vm
с помощью команды ping.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы, удалите ВМ net-vm
, dev-vm
и prod-vm
.