Развертывание NVMeBox
В этой инструкции описано развертывание компонента NVMeBox в инсталляции VK Private Cloud 4.3 с бэкендом cinder-volume на Ceph.
В результате будет создан дополнительный тип дисков nvmebox-type1, использующий внешнюю СХД, имитируемую отдельной виртуальной машиной.
Убедитесь, что:
- Версия VK Private Cloud — 4.3.
- Бэкенд Cinder по умолчанию — Ceph (
cinder_default_volume_type: ceph). - (Опционально) Создана отдельная виртуальная машина для имитации СХД, у которой:
- 2 дополнительных диска:
locks— 4 ГБ,data— 300–500 ГБ.
- 2 сетевых интерфейса:
Management— для управления,Ceph External— для подключения к узлам.
- Отключены файервол (firewall) и SELinux.
- 2 дополнительных диска:
На ВМ, которая будет играть роль внешней СХД:
-
Установите
targetcli:# dnf install -y targetcli -
Запустите
targetcli:# systemctl enable target --now -
Проверьте наличие дисков:
# lsblkПример вывода:
sr0 11:0 1 478K 0 romvda 253:0 0 10G 0 disk└─vda1 253:1 0 10G 0 part /vdb 253:16 0 4G 0 diskvdc 253:32 0 500G 0 disk -
Создайте LUN и привяжите их к iSCSI-таргету:
targetcli << EOF/backstores/block create lun1 /dev/vdb/backstores/block create lun2 /dev/vdc/iscsi create iqn.2026-02.local.storage/iscsi/iqn.2026-02.local.storage/tpg1/portals delete 0.0.0.0 3260/iscsi/iqn.2026-02.local.storage/tpg1/portals create <IP-АДРЕС> 3260/iscsi/iqn.2026-02.local.storage/tpg1/luns create /backstores/block/lun1/iscsi/iqn.2026-02.local.storage/tpg1/luns create /backstores/block/lun2/iscsi/iqn.2026-02.local.storage/tpg1/acls create iqn.2026-02.local.cpn001:6/iscsi/iqn.2026-02.local.storage/tpg1/acls create iqn.2026-02.local.cpn002:7/iscsi/iqn.2026-02.local.storage/tpg1/acls create iqn.2026-02.local.cpn003:8/iscsi/iqn.2026-02.local.storage/tpg1/acls create iqn.2026-02.local.kcn001:50/iscsi/iqn.2026-02.local.storage/tpg1/acls create iqn.2026-02.local.kcn002:51saveconfigEOFЗдесь
<IP-АДРЕС>— IP-адрес интерфейсаCeph Externalна виртуальной машине, имитирующей СХД. -
Проверьте созданную конфигурацию:
# targetcli ls
Подключение iSCSI-таргета нужно выполнить на каждом узле, который будет использовать NVMeBox:
- на управляющих узлах (
cpn001,cpn002,cpn003); - на вычислительных узлах (
kcn001,kcn002).
Чтобы подключить iSCSI-таргет к узлу:
-
Установите пакет iSCSI-инициатора (iSCSI initiator):
# yum install -y iscsi-initiator-utils -
В файле
/etc/iscsi/initiatorname.iscsiзадайте имя iSCSI-инициатора, чтобы оно соответствовало имени, которое указано в ACL СХД. Примеры:-
Для узла
cpn001:InitiatorName=iqn.2026-02.local.cpn001:6. -
Для узла
cpn002:InitiatorName=iqn.2026-02.local.cpn002:7.
-
-
Перезапустите сервис
iscsid:# systemctl restart iscsid -
Выполните поиск (discovery) iSCSI-таргета:
# iscsiadm -m discovery -t sendtargets -p <IP-АДРЕС>Здесь
<IP-АДРЕС>— IP-адрес интерфейсаCeph Externalна виртуальной машине, имитирующей СХД.Пример вывода:
<IP-АДРЕС>:3260,1 iqn.2026-02.local.storage -
Подключитесь к найденному iSCSI-таргету:
# iscsiadm -m node -T iqn.2026-02.local.storage -p <IP-АДРЕС> -lЗдесь
<IP-АДРЕС>— IP-адрес интерфейсаCeph Externalна виртуальной машине, имитирующей СХД. -
Проверьте, что появились два новых диска объемом 4 ГБ и 500 ГБ:
# lsblkПример вывода:
...sda 8:0 0 4G 0 disksdb 8:16 0 500G 0 disk... -
Повторите действия на каждом узле, который будет использовать NVMeBox.
Для корректной работы с iSCSI-дисками настройте Multipath:
-
Создайте или отредактируйте файл
/etc/multipath.conf:# vim /etc/multipath.confБазовое содержимое файла (без указания WWID):
blacklist {devnode "^(ram|raw|loop|fd|md|nvme|sr|scd|st)[0-9]*"devnode "^vd[a][0-9]*$"}defaults {user_friendly_names nomax_fds maxflush_on_last_del yesqueue_without_daemon nodev_loss_tmo infinityfast_io_fail_tmo 5} -
Перезапустите Multipath:
# systemctl restart multipathd -
Узнайте WWID дисков:
# multipath -llПример вывода:
36001405a9eaf4349c694644889c18a2d dm-0 LIO-ORG,lun1size=4.0G features='0' hwhandler='1 alua' wp=rw`-+- policy='service-time 0' prio=50 status=active`- 2:0:0:0 sda 8:0 active ready running360014051aebbd3e9a4f4e05b20e0f630 dm-1 LIO-ORG,lun2size=500G features='0' hwhandler='1 alua' wp=rw`-+- policy='service-time 0' prio=50 status=active`- 2:0:0:1 sdb 8:16 active ready runningЗдесь:
36001405a9eaf4349c694644889c18a2d— WWID для диска объемом 4 ГБ.360014051aebbd3e9a4f4e05b20e0f630— WWID для диска объемом 500 ГБ.
-
Добавьте для дисков псевдонимы (alias) в конфигурацию Multipath. Для этого дополните файл
/etc/multipath.confсекциейmultipaths, используя полученные WWID:# vim /etc/multipath.confПример конфигурации:
blacklist {devnode "^(ram|raw|loop|fd|md|nvme|sr|scd|st)[0-9]*"devnode "^vd[a][0-9]*$"}defaults {user_friendly_names nomax_fds maxflush_on_last_del yesqueue_without_daemon nodev_loss_tmo infinityfast_io_fail_tmo 5}multipaths {multipath {wwid 360014051aebbd3e9a4f4e05b20e0f630alias vm-lun}multipath {wwid 36001405a9eaf4349c694644889c18a2dalias lock-lun}} -
Перезапустите Multipath:
# systemctl restart multipathd -
Проверьте результат:
# lsblkДиски должны отображаться с именами
lock-lunиvm-lun, которые были заданы в качестве псевдонимов.Пример вывода:
sda 8:0 0 4G 0 disk└─lock-lun 253:0 0 4G 0 mpathsdb 8:16 0 500G 0 disk└─vm-lun 253:1 0 500G 0 mpath
Для добавления поддержки NVMeBox отредактируйте файлы Ansible Inventory:
-
Добавьте новый бэкенд и устройства LVM для NVMeBox в файл
group_vars/vkcloud/common.yml. Пример:...cinder_backends_available_by_type:...nvmebox-type1: '{{ nvmebox_profile }}'cinder_default_volume_type: ceph...cinder_lvm_devices:...- '{{ nvmebox_shared_lun_device }}.*'- '{{ nvmebox_lock_lun_device }}.*'... -
Добавьте устройства LVM для NVMeBox в файл
group_vars/vkcloud/vars.yml. Пример:...nvmebox_shared_lun_device: /dev/mapper/vm-lunnvmebox_lock_lun_device: /dev/mapper/lock-lunnvmebox_announce_ip: 10.30.3.100nvmebox_number_of_types: 1... -
Создайте новый файл
group_vars/vkcloud/nvmebox.yml. Он содержит переменные для настройки кластера NVMeBox.Пример заполнения:
# Произвольное имя кластера NVMeBox.# Рекомендуется использовать имя, которое описывает конкретный LUN СХД.nvmebox_cluster_name: sharedlun0# Имя профиля службы NVMeBox.# Для каждого типа кластера используется свое имя профиля.# Нужно использовать имя, описывающее название СХД.# Примеры:# - sharedlun# - nvmecluster# - lvmlocalnvmebox_profile: sharedlun# Имя systemd сервиса NVMeBox.# Используется имя, описывающее название СХД.nvmebox_cluster_service_unit: '{{ nvmebox_profile }}-cluster'# Имя кластерной VG.# Будет создана автоматически при развертывании сервиса.nvmebox_cluster_vg_name: slvg-0# Порт для работы API NVMeBoxnvmebox_api_port: 6601nvmebox_fip_provider: exabgp# Пользователи для подключения к NVMeBox.nvmebox_user: nvmeboxnvmebox_ro_user: nvmeboxview -
Добавьте пакет
nvmeboxв файлgroup_vars/vkcloud/packages.yml:...pkg:...nvmebox:python3_nvmebox: python38-nvmebox-{{ pkg_version.nvmebox }}.cmpt.el7.noarchnvmebox: nvmebox-{{ pkg_version.nvmebox }}.cmpt.el7.noarch -
Добавьте квоты для нового типа дисков
nvmebox-type1в шаблоны и по умолчанию в файлgroup_vars/vkcloud/quotas.yml:openstack_default_quotas:...volume_quotas:...volumes_nvmebox-type1: 0gigabytes_nvmebox-type1: 0openstack_project_quotas:# OpenStack project listservice:...volume_quotas:...volumes_nvmebox-type1: -1gigabytes_nvmebox-type1: -1...admin:volume_quotas:volumes_nvmebox-type1: -1gigabytes_nvmebox-type1: -1...quota_templates:name: infraquotas:cinder:volumes_nvmebox-type1: 10gigabytes_nvmebox-type1: 200...name: infra+paasquotas:cinder:volumes_nvmebox-type1: 10gigabytes_nvmebox-type1: 200 -
Добавьте пароли для пользователей NVMeBox в файл
group_vars/vkcloud/vault.yml:...vault_nvmebox_admin: <ПАРОЛЬ>vault_nvmebox_view: <ПАРОЛЬ>... -
Добавьте версию пакета
nvmeboxв файлgroup_vars/vkcloud/versions.yml:...pkg_version:...nvmebox: 0.10.0-202510020900.gitc07fff8 -
Создайте новую директорию и файл
group_vars/vkcloud_cinder_nvmebox/vars.yml.Пример конфигурации бэкенда Cinder для NVMeBox:
host_placement: '{{ az }}'cinder_coordination_url: consul://127.0.0.1:8500volume_backends:- name: sharedlunvolume_driver: nvmeboxdescription: AZ={{ availability_zones.az1 | upper }}, cluster=sharedlunbackend_name: sharedlunnvmebox_url: http://{{ nvmebox_announce_ip }}:{{ nvmebox_api_port }}nvmebox_user: '{{ nvmebox_user }}'nvmebox_password: '{{ vault_nvmebox_admin | default('''') }}'nvmebox_ro_user: '{{ nvmebox_ro_user }}'nvmebox_support_direct_access: truestorage_availability_zone: '{{ availability_zones.az1 | upper }}'image_cache: falseplacement: '{{ availability_zones.az1 | upper }}'cluster_name: sharedlunclustered: truerbd_cluster_name: sharedlunrbd_pool: sharedlun-volumesrbd_user: sharedluncinder_bootstrap_types:- name: nvmebox-type1extra_specs:mcs:nova_availability_zone: '{{ availability_zones.az1 | upper }}'volume_backend_name: sharedlunmcs:disk_class: nvmebox_disk_type1qos:name: nvmebox-type1cache_mode: noneread_iops_sec_per_gb: "200"read_iops_sec_per_gb_max: "40000"read_iops_sec_per_gb_min: "2000"write_iops_sec_per_gb: "100"write_iops_sec_per_gb_max: "10000"write_iops_sec_per_gb_min: "1000"consumer: both -
Добавьте локализации для нового типа дисков в файле
group_vars/vkcloud_kube/mcs-admin-ui.yml:...helm_superadmin_configuration_tpl:en:...cinder_volumes_nvmebox-type1: External disk (DAS) 1cinder_gigabytes_nvmebox-type1: External disk (DAS) 1ru:...cinder_volumes_nvmebox-type1: Внешний диск (СХД) 1cinder_gigabytes_nvmebox-type1: Размер внешнего диска (СХД) 1... -
Добавьте новые сервисы для отслеживания квот в файле
group_vars/vkcloud_kube/quota-manager.yml:...helm_quota_manager_enabled_services_yaml:cinder:...- volumes_nvmebox-type1- gigabytes_nvmebox-type1 -
Создайте новую директорию и файл
group_vars/vkcloud_nvmebox_agent/vars.ymlи добавьте в файл переменную для IP-адреса агента NVMeBox на вычислительных узлах:nvmebox_agent_ip: '{{ ansible_facts[netname_to_iface.internal]["ipv4"]["address"] }}' -
Добавьте новые группы узлов и идентификаторы
sanlock_host_idдля узлов в файлеvkcloud.yml:all:...children:...vkcloud_cinder_nvmebox:hosts:cpn001:sanlock_host_id: 101cpn002:sanlock_host_id: 102cpn003:sanlock_host_id: 103vkcloud_nvmebox_agent:hosts:kcn001:sanlock_host_id: 201kcn002:sanlock_host_id: 202...
-
Подключитесь к деплой-ноде по SSH (подробнее — в разделе Подключение к деплой-ноде).
-
Разверните или обновите
cinder-volumeс новым бэкендом:# ansible-playbook -i vkcloud.yml -e env=vkcloud ../ansible-openstack/playbooks/cinder-volume-deploy.yml -D -
Разверните NVMeBox:
# ansible-playbook -i vkcloud.yml -e env=vkcloud -e bootstrap=true -e nvmebox_disks_autoconfigure=true -e lvm_use_lvmlockd=1 ../ansible-playbooks/nvmebox.yml -D -
Обновите конфигурацию интерфейса Портала администратора:
# ansible-playbook -i vkcloud.yml -e env=vkcloud ../ansible-openstack/playbooks/helm-mcs-admin-ui.yml -D -
Обновите менеджер квот:
# ansible-playbook -i vkcloud.yml -e env=vkcloud -e bootstrap=true ../ansible-openstack/playbooks/helm-quota-manager.yml -D
-
Подключитесь к управляющему узлу (подробнее — в разделе Подключение к управляющему узлу).
-
Проверьте статус сервисов Cinder:
# cinder service-listВ выводе должны присутствовать бэкенды
cpn001@sharedlun,cpn002@sharedlunиcpn003@sharedlunсо статусомenabledи состояниемup.Пример вывода:
+---------------+------------------+------+---------+-------+------------------------+| Binary | Host | Zone | Status | State | Updated_at |+---------------+------------------+------+---------+-------+------------------------+| cinder-volume | cpn001@sharedlun | AZ1 | enabled | up | 2026-03-03T18:25:35.00 || cinder-volume | cpn002@sharedlun | AZ1 | enabled | up | 2026-03-03T18:25:36.00 || cinder-volume | cpn003@sharedlun | AZ1 | enabled | up | 2026-03-03T18:25:39.00 |+---------------+------------------+------+---------+-------+------------------------+ -
Проверьте, что тип дисков
nvmebox-type1доступен:# openstack volume type list -
Получите подробную информацию о
nvmebox-type1:# openstack volume type show nvmebox-type1Пример вывода:
+--------------------+--------------------------------------+| Field | Value |+--------------------+--------------------------------------+| access_project_ids | None || description | nvmebox-type1 || id | 528ea720-8358-4ae6-a022-d2837ba49f9f || is_public | True || name | nvmebox-type1 || properties | mcs:disk_class='nvmebox_disk_type1', || | mcs:nova_availability_zone='AZ1', || | volume_backend_name='sharedlun' || qos_specs_id | 1456cae2-6479-4ace-a445-cf0ca86a5433 |+--------------------+--------------------------------------+ -
Проверьте состояние кластера NVMeBox:
# nvmebox-manage capacity sharedlun0 --password <ПАРОЛЬ>Здесь
<ПАРОЛЬ>— пароль из переменнойvault_nvmebox_adminв файлеgroup_vars/vkcloud/vault.yml.Пример вывода:
Cluster: sharedlun0Profile: sharedlunAPI address: 10.30.3.100Target address: 10.30.3.100NVMe/TCP port: 4420iSCSI port: 3261API port: 6601Lock VG name: slvg-0Data VG name: slvg-0Lock LV name: configCurrently master: cpn001 = cpn001Name: allSize: 1073599217664 (499.8GB)Reserved: 214719843532 (99.9GB)Used: 43251662848 (0.2GB)Available: 815627711284 (399.6GB)
После выполнения всех шагов появится поддержка создания дисков типа nvmebox-type1, использующих внешнее iSCSI-хранилище.