Создать группу виртуальных машин с фиксированными IP-адресами
Вы можете использовать теги и переменные, чтобы создать группу ВМ с заранее заданными внутренними и публичными IP-адресами.
По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, создайте его.
Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе назначьте сервисному аккаунту роль compute.editor.
Чтобы создать группу ВМ с фиксированными IP-адресами:
-
По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, создайте его.
-
Создайте облачную сеть и подсети, например в двух зонах доступности, если у вас их нет.
-
Если вы хотите, чтобы ВМ из группы были доступны из интернета, зарезервируйте необходимое количество статических публичных IP-адресов. Для примера, приведенного ниже, вам будет достаточно четырех IP-адресов.
-
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду
yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров--folder-nameили--folder-id. -
Посмотрите описание команды CLI для создания группы ВМ:
yc compute instance-group create --help -
Выберите один из публичных образов Yandex Cloud Marketplace, например Ubuntu 22.04 LTS.
Чтобы получить список доступных образов с помощью CLI, выполните команду:
yc compute image list --folder-id standard-imagesРезультат:
+----------------------+-------------------------------------+--------------------------+----------------------+--------+ | ID | NAME | FAMILY | PRODUCT IDS | STATUS | +----------------------+-------------------------------------+--------------------------+----------------------+--------+ ... | fdvk34al8k5n******** | centos-7-1549279494 | centos-7 | dqni65lfhvv2******** | READY | | fdv7ooobjfl3******** | windows-2016-gvlk-1548913814 | windows-2016-gvlk | dqnnc72gj2is******** | READY | | fdv4f5kv5cvf******** | ubuntu-1604-lts-1549457823 | ubuntu-1604-lts | dqnnb6dc7640******** | READY | ... +----------------------+-------------------------------------+--------------------------+----------------------+--------+Где:
-
ID— идентификатор образа. -
NAME— имя образа. -
FAMILY— идентификатор семейства образов, к которому относится образ. -
PRODUCT IDS— идентификаторы продуктов Yandex Cloud Marketplace, связанных с образом. -
STATUS— текущий статус образа. Может принимать одно из значений:STATUS_UNSPECIFIED— статус образа не определен.CREATING— образ в процессе создания.READY— образ готов к использованию.ERROR— образ нельзя использовать из-за возникшей с ним проблемы.DELETING— образ в процессе удаления.
-
-
Подготовьте файл с YAML-спецификацией группы ВМ с произвольным именем, например
specification.yaml.Чтобы назначить ВМ группы фиксированные IP-адреса, добавьте в спецификацию:
-
В поле
allocation_policy— вложенное полеzonesс парными параметрамиzone_idиinstance_tags_poolдля каждой из зон доступности, в которых будут создаваться ВМ. Например, если ВМ группы будут расположены в зонах доступностиru-central1-aиru-central1-b, полеallocation_policyбудет выглядеть так:allocation_policy: zones: - zone_id: ru-central1-a instance_tags_pool: - <тег1_зоны_ru-central1-a> - <тег2_зоны_ru-central1-a> - zone_id: ru-central1-b instance_tags_pool: - <тег1_зоны_ru-central1-b> - <тег2_зоны_ru-central1-b>Где:
zone_id— идентификатор зоны доступности.instance_tags_pool— список уникальных тегов для привязки IP-адресов к ВМ группы. Значение тега участвует в формировании имен ВМ, а также в формировании переменных, содержащих IP-адреса ВМ. Количество тегов для каждой зоны доступности должно соответствовать количеству ВМ, создаваемых в этой зоне. Примеры возможных значений тегов:ru1-a1,ru1-b2и т.п.
-
Поле
variables, содержащее набор переменных, через которые с помощью шаблонов в группу ВМ передаются IP-адреса создаваемых ВМ:variables: - key: ip_<тег1_зоны_ru-central1-a> value: <внутренний_IP-адрес1> - key: external_ip_<тег1_зоны_ru-central1-a> value: <публичный_IP-адрес1> ... - key: ip_<тег2_зоны_ru-central1-b> value: <внутренний_IP-адрес_4> - key: external_ip_<тег2_зоны_ru-central1-b> value: <публичный_IP-адрес_4>Где:
-
key— имя переменной, в формате<префикс>_<тег>:-
<префикс>определяет тип IP-адреса. Например, для внутренних адресов можно использовать префиксip, а для публичных IP-адресов —external_ip. -
<тег>должен быть идентичен значению соответствующего тега, заданного для данной ВМ в полеallocation_policy, напримерru1-a1.
-
-
value— значение переменной: внутренний или публичный IP-адрес создаваемой ВМ.Внутренние IP-адреса должны принадлежать диапазону IP-адресов, выделенному для указанной подсети в соответствующей зоне доступности.
Если виртуальные машины группы будут создаваться без привязанных публичных IP-адресов, не задавайте переменные с префиксом
external_ip.
Подробнее об использовании переменных в шаблоне ВМ см. в разделе Переменные в шаблоне виртуальной машины.
-
-
В поле
instance_template.name— имя виртуальной машины, содержащее шаблон тега. Например:sample-vm-{instance.tag}. После подстановки значений тегов в этот шаблон имена ВМ будут выглядеть какsample-vm-ru1-a1,sample-vm-ru1-b2и т.д. -
В поле
instance_template.network_interface_specs— идентификаторы подсетей и шаблоны IP-адресов:instance_template: ... network_interface_specs: - subnet_ids: - <идентификатор_подсети_в_ru-central1-a> - <идентификатор_подсети_в_ru-central1-b> primary_v4_address_spec: address: "{ip_{instance.tag}}" one_to_one_nat_spec: ip_version: IPV4 address: "{<external_ip_{instance.tag}}"Где:
subnet_ids— список идентификаторов подсетей, в которых должны располагаться ВМ. Требуется указать одну подсеть в каждой из зон доступности, в которых будут созданы ВМ группы.primary_v4_address_spec.address— шаблон внутренних IP-адресов. В шаблон будет подставлено значение из переменной, заданной для данной ВМ в полеvariables.primary_v4_address_spec.one_to_one_nat_spec.address— шаблон для публичных IP-адресов. В шаблон будет подставлено значение из переменной, заданной для данной ВМ в полеvariables.
Если виртуальные машины группы будут создаваться без привязанных публичных IP-адресов, не добавляйте в спецификацию поле
primary_v4_address_spec.one_to_one_nat_spec.
Пример YAML-спецификации:
service_account_id: <идентификатор_сервисного_аккаунта> name: my-vm-group-with-fixed-ips description: Example of using tags for managing ips. Created with CLI scale_policy: fixed_scale: size: 4 deploy_policy: max_unavailable: 2 allocation_policy: zones: - zone_id: ru-central1-a instance_tags_pool: - ru1-a1 - ru1-a2 - zone_id: ru-central1-b instance_tags_pool: - ru1-b1 - ru1-b2 variables: - key: ip_ru1-a1 value: 192.168.2.5 - key: external_ip_ru1-a1 value: 84.201.***.** - key: ip_ru1-a2 value: 192.168.2.15 - key: external_ip_ru1-a2 value: 130.193.**.** - key: ip_ru1-b1 value: 192.168.1.5 - key: external_ip_ru1-b1 value: 84.201.***.** - key: ip_ru1-b2 value: 192.168.1.15 - key: external_ip_ru1-b2 value: 84.201.***.* instance_template: name: sample-vm-{instance.tag} platform_id: standard-v2 resources_spec: memory: 2G cores: 2 boot_disk_spec: mode: READ_WRITE disk_spec: image_id: fd8dlvgiatiqd8tt2qke type_id: network-hdd size: 20g network_interface_specs: - subnet_ids: - e2l3qffk0h6t******** - e9bijtoprmcu******** primary_v4_address_spec: address: "{ip_{instance.tag}}" one_to_one_nat_spec: address: "{external_ip_{instance.tag}}"В данном примере приведена спецификация для создания группы ВМ фиксированного размера с фиксированными внутренними и публичными IP-адресами.
Подробнее о параметрах спецификации группы ВМ см. в разделе Спецификация группы виртуальных машин в формате YAML.
-
-
Создайте группу ВМ в каталоге по умолчанию:
yc compute instance-group create --file specification.yamlДанная команда создаст группу ВМ со следующими характеристиками:
- С именем
my-vm-group-with-fixed-ips. - С OC
Ubuntu 22.04 LTS. - С четырьмя ВМ — по две в зонах доступности
ru-central1-aиru-central1-b. - С двумя vCPU и двумя ГБ RAM.
- С сетевым HDD-диском объемом 20 ГБ.
- К каждой ВМ группы будут привязаны фиксированные внутренний и публичный IP-адреса.
- С именем
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры ресурсов, которые вы хотите создать:
resource "yandex_compute_instance_group" "ig-1" { name = "fixed-ig" folder_id = "<идентификатор_каталога>" service_account_id = "${yandex_iam_service_account.ig-sa.id}" deletion_protection = false depends_on = [yandex_resourcemanager_folder_iam_member.compute_editor] instance_template { name = "sample-vm-{instance.tag}" platform_id = "standard-v3" resources { memory = 2 cores = 2 } boot_disk { mode = "READ_WRITE" initialize_params { image_id = "fd8dlvgiatiqd8tt2qke" } } network_interface { network_id = "${yandex_vpc_network.ig-network.id}" subnet_ids = ["${yandex_vpc_subnet.ig-subnet-a.id}", "${yandex_vpc_subnet.ig-subnet-b.id}"] nat = true ip_address = "{ip_{instance.tag}}" nat_ip_address = "{external_ip_{instance.tag}}" } metadata = { user-data = "#cloud-config\n datasource:\n Ec2:\n strict_id: false\n ssh_pwauth: no\n users:\n - name: <имя_пользователя_ВМ>\n sudo: ALL=(ALL) NOPASSWD:ALL\n shell: /bin/bash\n ssh_authorized_keys:\n - <публичный_SSH-ключ>\n runcmd: []" } } variables = { ip_ru1-a1 = "192.168.2.5" external_ip_ru1-a1 = "${yandex_vpc_address.external-address-a1.external_ipv4_address[0].address}" ip_ru1-a2 = "192.168.2.15" external_ip_ru1-a2 = "${yandex_vpc_address.external-address-a2.external_ipv4_address[0].address}" ip_ru1-b1 = "192.168.1.5" external_ip_ru1-b1 = "${yandex_vpc_address.external-address-b1.external_ipv4_address[0].address}" ip_ru1-b2 = "192.168.1.15" external_ip_ru1-b2 = "${yandex_vpc_address.external-address-b2.external_ipv4_address[0].address}" } scale_policy { fixed_scale { size = 4 } } allocation_policy { zones = ["ru-central1-a","ru-central1-b"] instance_tags_pool { zone = "ru-central1-a" tags = ["ru1-a1","ru1-a2"] } instance_tags_pool { zone = "ru-central1-b" tags = ["ru1-b1","ru1-b2"] } } deploy_policy { max_unavailable = 1 max_expansion = 0 } } resource "yandex_iam_service_account" "ig-sa" { name = "instance-group-sa" description = "Сервисный аккаунт для управления группой ВМ." } resource "yandex_resourcemanager_folder_iam_member" "compute_editor" { folder_id = "<идентификатор_каталога>" role = "compute.editor" member = "serviceAccount:${yandex_iam_service_account.ig-sa.id}" depends_on = [ yandex_iam_service_account.ig-sa, ] } resource "yandex_vpc_network" "ig-network" { name = "ig-network" } resource "yandex_vpc_subnet" "ig-subnet-a" { name = "ig-subnet-a" zone = "ru-central1-a" network_id = "${yandex_vpc_network.ig-network.id}" v4_cidr_blocks = ["192.168.2.0/24"] } resource "yandex_vpc_subnet" "ig-subnet-b" { name = "ig-subnet-b" zone = "ru-central1-b" network_id = "${yandex_vpc_network.ig-network.id}" v4_cidr_blocks = ["192.168.1.0/24"] } resource "yandex_vpc_address" "external-address-a1" { name = "external-address-a1" external_ipv4_address { zone_id = "ru-central1-a" } } resource "yandex_vpc_address" "external-address-a2" { name = "external-address-a2" external_ipv4_address { zone_id = "ru-central1-a" } } resource "yandex_vpc_address" "external-address-b1" { name = "external-address-b1" external_ipv4_address { zone_id = "ru-central1-b" } } resource "yandex_vpc_address" "external-address-b2" { name = "external-address-b2" external_ipv4_address { zone_id = "ru-central1-b" } }Где:
-
yandex_compute_instance_group— описание группы ВМ:-
Общая информация о группе ВМ:
-
name— имя группы ВМ. -
folder_id— идентификатор каталога. -
service_account_id— идентификатор сервисного аккаунта.Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе назначьте сервисному аккаунту роль compute.editor.
-
deletion_protection— защита группы ВМ от удаления:trueилиfalse. Пока опция включена, группу ВМ удалить невозможно. Значение по умолчаниюfalse.
-
-
instance_template— шаблон ВМ:-
name— имя виртуальной машины, содержащее шаблон тега, напримерsample-vm-{instance.tag}. После подстановки значений тегов в этот шаблон имена ВМ будут выглядеть какsample-vm-ru1-a1,sample-vm-ru1-b2и т.д. -
platform_id— платформа. -
resources— количество ядер vCPU и объем RAM, доступные ВМ. Значения должны соответствовать выбранной платформе. -
boot_disk— настройки загрузочного диска:mode— режим доступа к диску:READ_ONLY(чтение) илиREAD_WRITE(чтение и запись).image_id— идентификатор выбранного образа. Вы можете получить идентификатор образа из списка публичных образов.
-
network_interface— настройка сети:subnet_ids— список идентификаторов подсетей, в которых должны располагаться ВМ. Требуется указать одну подсеть в каждой из зон доступности, в которых будут созданы ВМ группы.nat— параметр, задающий привязку публичного IP-адреса к ВМ. Возможные значенияtrueиfalse.ip_address— внутренний IP-адрес ВМ. В качестве значения используется шаблон, в который будет подставлено значение из переменной, заданной для данной ВМ в блокеvariables.nat_ip_address— публичный IP-адрес ВМ. В качестве значения используется шаблон, в который будет подставлено значение из переменной, заданной для данной ВМ в полеvariables.
-
metadata— в метаданных передайте имя пользователя ВМ и открытый ключ для SSH-доступа этого пользователя на ВМ.Подробнее см. в разделе Метаданные виртуальной машины.
-
-
variables— переменные, назначаемые группе ВМ. Блок содержит список переменных в формате<имя> = <значение>. Через переменные с помощью шаблонов в группу ВМ передаются IP-адреса создаваемых ВМ:-
имя переменной: должно быть в формате
<префикс>_<тег>:-
<префикс>определяет тип IP-адреса. Например, для внутренних IP-адресов можно использовать префиксip, а для публичных IP-адресов —external_ip. -
<тег>должен быть идентичен значению соответствующего тега, заданного для данной ВМ в полеallocation_policy, напримерru1-a1.
-
-
значение переменной: внутренний или публичный IP-адрес создаваемой ВМ.
Внутренние IP-адреса должны принадлежать диапазону IP-адресов, выделенному для указанной подсети в соответствующей зоне доступности.
Если виртуальные машины группы будут создаваться без привязанных публичных IP-адресов, не задавайте переменные с префиксом
external_ip.
Подробнее об использовании переменных в шаблоне ВМ см. в разделе Переменные в шаблоне виртуальной машины.
-
-
deploy_policy— политика развертывания ВМ в группе.scale_policy— политика масштабирования ВМ в группе.allocation_policy— политика распределения ВМ по зонам доступности и регионам:-
zones— массив, содержащий идентификаторы зон доступности, в которых будут создаваться ВМ группы. -
instance_tags_pool— список уникальных тегов, необходимых для привязки IP-адресов к ВМ группы. Задается отдельно для каждой зоны доступности, в которых будут создаваться ВМ группы.Значение тегов, заданных в массиве
tags, участвует в формировании имен ВМ, а также в формировании переменных, содержащих IP-адреса ВМ. Количество тегов в массивеtagsдля каждой зоны доступности должно соответствовать количеству ВМ, создаваемых в этой зоне. Примеры возможных значений тегов:ru1-a1,ru1-b2и т.п.
-
-
-
yandex_iam_service_account— описание сервисного аккаунта. Все операции в Instance Groups выполняются от имени сервисного аккаунта.Сервисный аккаунт нельзя удалить, пока он связан с группой виртуальных машин.
-
yandex_resourcemanager_folder_iam_member— описание прав доступа к каталогу, которому принадлежит сервисный аккаунт. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль compute.editor. -
yandex_vpc_network— описание облачной сети. -
yandex_vpc_subnet— описание подсетей, к которым будут подключены ВМ группы. -
yandex_vpc_address— описание зарезервированного статического публичного IP-адреса.Примечание
Если у вас уже есть подходящие ресурсы (сервисный аккаунт, облачная сеть и подсети, зарезервированные статические IP-адреса), описывать их повторно не нужно. Используйте их имена и идентификаторы в соответствующих параметрах.
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера.
-
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Воспользуйтесь методом REST API create для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/Create.