Создать группу виртуальных машин с подключением к файловому хранилищу
Одним из способов работы со Stateful-нагрузкой является сохранение состояния приложения в независимом от группы ВМ файловом хранилище.
Чтобы создать группу ВМ, в которой к каждой ВМ будет автоматически подключаться общее файловое хранилище:
-
По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, создайте его.
-
Если у вас нет файлового хранилища, создайте его.
-
Создайте группу ВМ:
CLITerraformAPIЕсли у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.-
Посмотрите описание команды CLI для создания группы ВМ:
yc compute instance-group create --help
-
Проверьте, есть ли в каталоге сети:
yc vpc network list
Если ни одной сети нет, создайте ее.
-
Выберите один из публичных образов 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 | ... +----------------------+-------------------------------------+--------------------------+----------------------+--------+
-
Подготовьте файл с YAML-спецификацией группы ВМ с произвольным именем, например
specification.yaml
.Для того чтобы привязать файловое хранилище к виртуальным машинам группы, добавьте в спецификацию:
-
В поле
instance_template
— вложенное полеfilesystem_specs
с описанием файлового хранилища:instance_template: ... filesystem_specs: - mode: READ_WRITE device_name: <имя_устройства_ВМ> filesystem_id: <идентификатор_файлового_хранилища>
Где:
mode
— режим доступа к файловому хранилищу:READ_WRITE
(чтение и запись).device_name
— имя устройства, под которым файловое хранилище будет подключено к ВМ. Например:sample-fs
. Имя может содержать строчные буквы латинского алфавита, цифры и дефисы. Первый символ должен быть буквой. Последний символ не может быть дефисом. Максимальная длина имени — 63 символа.filesystem_id
— идентификатор файлового хранилища. Посмотреть идентификатор можно в консоли управления или с помощью команды CLIyc compute filesystem list
.
-
В секцию
#cloud-config
поляinstance_template.metadata.user-data
— набор команд для монтирования файлового хранилища на ВМ:instance_template: ... metadata: user-data: |- #cloud-config ... runcmd: - mkdir <точка_монтирования_на_ВМ> - mount -t virtiofs <имя_устройства_ВМ> <точка_монтирования_на_ВМ> - echo "test-fs <точка_монтирования_на_ВМ> virtiofs rw 0 0" | tee -a /etc/fstab
Где:
<точка_монтирования_на_ВМ>
— директория на ВМ, в которую будет смонтировано подключенное файловое хранилище. Например:/mnt/vfs0
.<имя_устройства_ВМ>
— имя устройства, под которым файловое хранилище будет подключено к ВМ. Значение должно соответствовать значению, указанному ранее в полеinstance_template.filesystem_specs.device_name
.
Пример YAML-спецификации:
name: my-vm-group-with-fs service_account_id: ajegtlf2q28a******** description: "Эта группа ВМ создана с помощью YAML-файла конфигурации." instance_template: platform_id: standard-v3 resources_spec: memory: 2g cores: 2 boot_disk_spec: mode: READ_WRITE disk_spec: image_id: fd8dlvgiatiqd8tt2qke type_id: network-hdd size: 32g network_interface_specs: - network_id: enp9mji1m7b3******** primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 } } security_group_ids: - enpuatgvejtn******** filesystem_specs: - mode: READ_WRITE device_name: sample-fs filesystem_id: epdccsrlalon******** metadata: user-data: |- #cloud-config datasource: Ec2: strict_id: false ssh_pwauth: no users: - name: my-user sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash ssh_authorized_keys: - <публичный_SSH-ключ> runcmd: - mkdir /mnt/vfs0 - mount -t virtiofs sample-fs /mnt/vfs0 - echo "sample-fs /mnt/vfs0 virtiofs rw 0 0" | tee -a /etc/fstab deploy_policy: max_unavailable: 1 max_expansion: 0 scale_policy: fixed_scale: size: 2 allocation_policy: zones: - zone_id: ru-central1-a instance_tags_pool: - first - second
В данном примере приведена спецификация для создания группы ВМ фиксированного размера с подключенным к виртуальным машинам файловым хранилищем.
Подробнее о параметрах спецификации группы ВМ см. в разделе Спецификация группы виртуальных машин в формате YAML.
-
-
Создайте группу ВМ в каталоге по умолчанию:
yc compute instance-group create --file specification.yaml
Данная команда создаст группу из двух однотипных ВМ со следующими характеристиками:
- С именем
my-vm-group-with-fs
. - С OC
Ubuntu 22.04 LTS
. - В зоне доступности
ru-central1-a
. - С 2 vCPU и 2 ГБ RAM.
- С сетевым HDD-диском объемом 32 ГБ.
- С подключенным файловым хранилищем. Файловое хранилище будет смонтировано в директорию
/mnt/vfs0
виртуальных машин группы. -
К каждой ВМ группы будет привязан публичный IP-адрес. Это сделано для удобства подключения по SSH к ВМ группы при проверке результата.
Если вы создадите группу ВМ без публичных IP-адресов, вы по-прежнему сможете подключаться по SSH к ВМ группы, указывая внутренний IP-адрес или FQDN виртуальной машины вместо публичного IP-адреса. Но такое подключение можно выполнить только с другой виртуальной машины, имеющей публичный IP-адрес и расположенной в той же облачной сети Yandex Cloud, что и ВМ группы.
- С именем
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
resource "yandex_iam_service_account" "ig-sa" { name = "ig-sa" description = "Сервисный аккаунт для управления группой ВМ." } resource "yandex_resourcemanager_folder_iam_member" "editor" { folder_id = "<идентификатор_каталога>" role = "editor" member = "serviceAccount:${yandex_iam_service_account.ig-sa.id}" depends_on = [ yandex_iam_service_account.ig-sa, ] } resource "yandex_compute_instance_group" "ig-1" { name = "fixed-ig" folder_id = "<идентификатор_каталога>" service_account_id = "${yandex_iam_service_account.ig-sa.id}" deletion_protection = "<защита_от_удаления>" depends_on = [yandex_resourcemanager_folder_iam_member.editor] instance_template { platform_id = "standard-v3" resources { memory = <объем_RAM_ГБ> cores = <количество_ядер_vCPU> } boot_disk { mode = "READ_WRITE" initialize_params { image_id = "<идентификатор_образа>" } } filesystem { mode = "READ_WRITE" device_name = "<имя_устройства_ВМ>" filesystem_id = "<идентификатор_файлового_хранилища>" } network_interface { network_id = "${yandex_vpc_network.network-1.id}" subnet_ids = ["${yandex_vpc_subnet.subnet-1.id}"] security_group_ids = ["<список_идентификаторов_групп_безопасности>"] nat = true } 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:\n - mkdir <точка_монтирования_на_ВМ>\n - mount -t virtiofs <имя_устройства_ВМ> <точка_монтирования_на_ВМ>\n - echo \"sample-fs <точка_монтирования_на_ВМ> virtiofs rw 0 0\" | tee -a /etc/fstab" } } scale_policy { fixed_scale { size = <количество_ВМ_в_группе> } } allocation_policy { zones = ["ru-central1-a"] } deploy_policy { max_unavailable = 1 max_expansion = 0 } } resource "yandex_vpc_network" "network-1" { name = "network1" } resource "yandex_vpc_subnet" "subnet-1" { name = "subnet1" zone = "ru-central1-a" network_id = "${yandex_vpc_network.network-1.id}" v4_cidr_blocks = ["192.168.10.0/24"] }
Где:
-
yandex_iam_service_account
— описание сервисного аккаунта. Все операции в Instance Groups выполняются от имени сервисного аккаунта.Сервисный аккаунт нельзя удалить, пока он связан с группой виртуальных машин.
-
yandex_resourcemanager_folder_iam_member
— описание прав доступа к каталогу, которому принадлежит сервисный аккаунт. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту рольeditor
. -
yandex_compute_instance_group
— описание группы ВМ:- Общая информация о группе ВМ:
name
— имя группы ВМ.folder_id
— идентификатор каталога.service_account_id
— идентификатор сервисного аккаунта.deletion_protection
— защита группы ВМ от удаления:true
илиfalse
. Пока опция включена, группу ВМ удалить невозможно. Значение по умолчаниюfalse
.
- Шаблон ВМ:
-
platform_id
— платформа. -
resources
— количество ядер vCPU и объем RAM, доступные ВМ. Значения должны соответствовать выбранной платформе. -
boot_disk
— настройки загрузочного диска.mode
— режим доступа к диску:READ_ONLY
(чтение) илиREAD_WRITE
(чтение и запись).image_id
— идентификатор выбранного образа. Вы можете получить идентификатор образа из списка публичных образов.
-
filesystem
— настройки файлового хранилища.mode
— режим доступа к файловому хранилищу:READ_WRITE
(чтение и запись).device_name
— имя устройства, под которым файловое хранилище будет подключено к ВМ. Например:sample-fs
. Имя может содержать строчные буквы латинского алфавита, цифры и дефисы. Первый символ должен быть буквой. Последний символ не может быть дефисом. Максимальная длина имени — 63 символа.filesystem_id
— идентификатор файлового хранилища. Посмотреть идентификатор можно в консоли управления или с помощью команды CLIyc compute filesystem list
.
-
network_interface
— настройка сети. Укажите идентификаторы сети, подсети и групп безопасности. -
metadata
— в метаданных необходимо передать:- Имя пользователя ВМ и открытый ключ для SSH-доступа этого пользователя на ВМ.
- Точку монтирования файлового хранилища на ВМ — директорию на ВМ, в которую будет смонтировано подключенное файловое хранилище. Например:
/mnt/vfs0
. - Имя устройства на ВМ — имя устройства, под которым файловое хранилище будет подключено к ВМ. Значение должно соответствовать значению, указанному ранее в поле
device_name
секцииfilesystem
.
Подробнее см. в разделе Метаданные виртуальной машины.
-
- Политики:
deploy_policy
— политика развертывания ВМ в группе.scale_policy
— политика масштабирования ВМ в группе.allocation_policy
— политика распределения ВМ по зонам доступности и регионам.
- Общая информация о группе ВМ:
-
yandex_vpc_network
— описание облачной сети. -
yandex_vpc_subnet
— описание подсети, к которой будет подключена группа ВМ.Примечание
Если у вас уже есть подходящие ресурсы (сервисный аккаунт, облачная сеть и подсеть), описывать их повторно не нужно. Используйте их имена и идентификаторы в соответствующих параметрах.
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера
. -
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
.К каждой ВМ группы будет привязан публичный IP-адрес. Это сделано для удобства подключения по SSH к ВМ группы при проверке результата.
Если вы создадите группу ВМ без публичных IP-адресов, вы по-прежнему сможете подключаться по SSH к ВМ группы, указывая внутренний IP-адрес или FQDN виртуальной машины вместо публичного IP-адреса. Но такое подключение можно выполнить только с другой виртуальной машины, имеющей публичный IP-адрес и расположенной в той же облачной сети Yandex Cloud, что и ВМ группы.
-
Воспользуйтесь методом REST API create для ресурса InstanceGroup или вызовом gRPC API InstanceGroupService/Create.
-
Убедитесь, что файловое хранилище подключено к виртуальным машинам группы. Для этого подключитесь к ВМ по SSH и перейдите в директорию, которую вы указали в качестве точки монтирования.