Создать группу виртуальных машин с подключением к файловому хранилищу
Одним из способов работы со Stateful-нагрузкой является сохранение состояния приложения в независимом от группы ВМ файловом хранилище.
Чтобы создать группу ВМ, в которой к каждой ВМ будет автоматически подключаться общее файловое хранилище:
-
По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, создайте его.
-
Если у вас нет файлового хранилища, создайте его.
-
Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе назначьте сервисному аккаунту роль compute.editor.
-
Создайте группу ВМ:
CLITerraformAPIЕсли у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду
yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров--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 | ... +----------------------+-------------------------------------+--------------------------+----------------------+--------+Где:
-
ID— идентификатор образа. -
NAME— имя образа. -
FAMILY— идентификатор семейства образов, к которому относится образ. -
PRODUCT IDS— идентификаторы продуктов Yandex Cloud Marketplace, связанных с образом. -
STATUS— текущий статус образа. Может принимать одно из значений:STATUS_UNSPECIFIED— статус образа не определен.CREATING— образ в процессе создания.READY— образ готов к использованию.ERROR— образ нельзя использовать из-за возникшей с ним проблемы.DELETING— образ в процессе удаления.
-
-
Подготовьте файл с 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: <идентификатор_сервисного_аккаунта> 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" "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_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.compute_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— описание прав доступа к каталогу, которому принадлежит сервисный аккаунт. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль compute.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 и перейдите в директорию, которую вы указали в качестве точки монтирования.