Создать группу виртуальных машин с подключением к Yandex Object Storage
Примечание
В регионе Казахстан доступна только зона доступности kz1-a
.
Одним из способов работы со Stateful-нагрузкой является сохранение состояния приложения в независимом от группы ВМ бакете Object Storage.
Чтобы создать группу ВМ, в которой к каждой ВМ будет автоматически подключаться общий бакет Object Storage:
-
По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, создайте его.
-
Если у вас нет бакета Object Storage, создайте его.
-
Операции с бакетом выполняются от имени сервисного аккаунта, созданного в том же каталоге, что, что и сам бакет. Если такого сервисного аккаунта нет, создайте его. Для работы с бакетом назначьте сервисному аккаунту роль
storage.editor
.Для работы с группой виртуальных машин и с бакетом можно использовать как один, так и два разных сервисных аккаунта.
-
Создайте группу ВМ:
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 | ... +----------------------+-------------------------------------+--------------------------+----------------------+--------+
Где:
-
ID
— идентификатор образа. -
NAME
— имя образа. -
FAMILY
— идентификатор семейства образов, к которому относится образ. -
PRODUCT IDS
— идентификаторы продуктов Yandex Cloud Marketplace, связанных с образом. -
STATUS
— текущий статус образа. Может принимать одно из значений:STATUS_UNSPECIFIED
— статус образа не определен.CREATING
— образ в процессе создания.READY
— образ готов к использованию.ERROR
— образ нельзя использовать из-за возникшей с ним проблемы.DELETING
— образ в процессе удаления.
-
-
Подготовьте файл с YAML-спецификацией группы ВМ с произвольным именем, например
specification.yaml
.Для того чтобы привязать бакет к виртуальным машинам группы, добавьте в спецификацию:
-
В поле
instance_template
— вложенное полеservice_account_id
, содержащее идентификатор сервисного аккаунта с назначенной рольюstorage.editor
:instance_template: ... service_account_id: <идентификатор_сервисного_аккаунта>
Чтобы добиться более гранулярного управления правами доступа, привязывайте к группе ВМ и к виртуальным машинам группы разные сервисные аккаунты с разными наборами разрешений.
-
В секцию
#cloud-config
поляinstance_template.metadata.user-data
— набор команд для монтирования бакета на ВМ:instance_template: ... metadata: user-data: |- #cloud-config ... runcmd: - apt-get install fuse - wget https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-linux-amd64 - chmod a+x geesefs-linux-amd64 - cp geesefs-linux-amd64 /usr/bin/geesefs - mkdir <точка_монтирования_на_ВМ> - echo "user_allow_other" | tee -a /etc/fuse.conf - echo "<имя_бакета> <точка_монтирования_на_ВМ> fuse.geesefs _netdev,allow_other,--iam 0 0" | tee -a /etc/fstab - mount -a
Где:
- apt-get install fuse
— команда для установки модуля FUSE . Подходит для операционных систем Ubuntu и Debian. Для ОС на основе Red Hat, таких как CentOS и Fedora, используйте команду- yum install fuse
, для ОС OpenSUSE —- zypper install fuse
, и т.п.<точка_монтирования_на_ВМ>
— директория на ВМ, в которую будет смонтирован подключенный бакет. Например:/mnt/gfs0
.<имя_бакета>
— имя бакета, который требуется подключить к ВМ.
Пример YAML-спецификации:
name: vm-group-with-object-storage 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******** service_account_id: aje1ki4ae68u******** 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: - apt-get install fuse - wget https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-linux-amd64 - chmod a+x geesefs-linux-amd64 - cp geesefs-linux-amd64 /usr/bin/geesefs - mkdir /mnt/gfs0 - echo "user_allow_other" | tee -a /etc/fuse.conf - echo "my-bucket-for-vm-group /mnt/gfs0 fuse.geesefs _netdev,allow_other,--iam 0 0" | tee -a /etc/fstab - mount -a 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
В данном примере приведена спецификация для создания группы ВМ фиксированного размера с подключенным к виртуальным машинам бакетом Object Storage.
Подробнее о параметрах спецификации группы ВМ см. в разделе Спецификация группы виртуальных машин в формате YAML.
-
-
Создайте группу ВМ в каталоге по умолчанию:
yc compute instance-group create --file specification.yaml
Данная команда создаст группу из двух однотипных ВМ со следующими характеристиками:
- С именем
my-vm-group-with-object-storage
. - С OC
Ubuntu 22.04 LTS
. - В зоне доступности
ru-central1-a
. - С 2 vCPU и 2 ГБ RAM.
- С сетевым HDD-диском объемом 32 ГБ.
- С подключенным бакетом Object Storage. Бакет будет смонтирован в директорию
/mnt/gfs0
виртуальных машин группы. -
К каждой ВМ группы будет привязан публичный 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_iam_service_account" "storage-sa" { name = "storage-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_resourcemanager_folder_iam_member" "storage_editor" { folder_id = "<идентификатор_каталога>" role = "storage.editor" member = "serviceAccount:${yandex_iam_service_account.storage-sa.id}" depends_on = [ yandex_iam_service_account.storage-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 = "<идентификатор_образа>" } } service_account_id = "${yandex_iam_service_account.storage-sa.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 - apt-get install fuse\n - wget https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-linux-amd64\n - chmod a+x geesefs-linux-amd64\n - cp geesefs-linux-amd64 /usr/bin/geesefs\n - mkdir <точка_монтирования_на_ВМ>\n - echo \"user_allow_other\" | tee -a /etc/fuse.conf\n - echo \"<имя_бакета> <точка_монтирования_на_ВМ> fuse.geesefs _netdev,allow_other,--iam 0 0\" | tee -a /etc/fstab\n - mount -a" } } 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
— идентификатор выбранного образа. Вы можете получить идентификатор образа из списка публичных образов.
-
service_account_id
— идентификатор сервисного аккаунта для бакета. -
network_interface
— настройка сети. Укажите идентификаторы сети, подсети и групп безопасности. -
metadata
— в метаданных необходимо передать:- Имя пользователя ВМ и открытый ключ для SSH-доступа этого пользователя на ВМ.
- apt-get install fuse
— команда для установки модуля FUSE . Подходит для операционных систем Ubuntu и Debian. Для ОС на основе Red Hat, таких как CentOS и Fedora, используйте команду- yum install fuse
, для ОС OpenSUSE —- zypper install fuse
, и т.п.<точка_монтирования_на_ВМ>
— директория на ВМ, в которую будет смонтирован подключенный бакет. Например:/mnt/gfs0
.<имя_бакета>
— имя бакета, который требуется подключить к ВМ.
Подробнее см. в разделе Метаданные виртуальной машины.
-
- Политики:
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 и перейдите в директорию, которую вы указали в качестве точки монтирования.