Развертывание NVMeBox
В этой инструкции описано развертывание компонента NVMeBox в инсталляции VK Private Cloud 4.2 с бэкендом cinder-volume на Ceph.
В результате будет создан дополнительный тип дисков nvmebox-type1, использующий внешнюю СХД, имитируемую отдельной виртуальной машиной.
Убедитесь, что:
- Версия VK Private Cloud — 4.2.
- Бэкенд 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_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_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-202501282011.git829d1b2 -
Создайте новую директорию и файл
group_vars/vkcloud_cinder_nvmebox/vars.yml.Пример конфигурации бэкенда Cinder для NVMeBox:
host_placement: '{{ availability_zone1 | upper }}'cinder_coordination_url: consul://127.0.0.1:8500volume_backends:- name: sharedlunvolume_driver: nvmeboxdescription: AZ={{ availability_zone1 | 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_zone1 | upper }}'image_cache: falseplacement: '{{ availability_zone1 | upper }}'cluster_name: sharedlunclustered: truerbd_cluster_name: sharedlunrbd_pool: sharedlun-volumesrbd_user: sharedluncinder_bootstrap_types:- name: nvmebox-type1extra_specs:mcs:nova_availability_zone: '{{ availability_zone1 | 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_json:regions:...- name: gov-cloud...volumeTypes:...cinder_volumes_nvmebox-type1:en: External disk (DAS) 1ru: Внешний диск (СХД) 1cinder_gigabytes_nvmebox-type1:en: External disk (DAS) 1ru: Размер внешнего диска (СХД) 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:...vkcloud_cinder:children:...vkcloud_cinder_nvmebox:hosts:cpn001:sanlock_host_id: 101cpn002:sanlock_host_id: 102cpn003:sanlock_host_id: 103......vkcloud_victoriametrics_cloudmonitoring:...vkcloud_nvmebox_agent:hosts:kcn001:sanlock_host_id: 201kcn002:sanlock_host_id: 202......
-
Подключитесь к деплой-ноде по SSH (подробнее — в разделе Вход на деплой-ноду по 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 ../ansible-openstack/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.Пример вывода:
[root@cpn003 centos]# cinder service-list+---------------+------------------+------+---------+-------+------------+| Binary | Host | Zone | Status | State | Updated_at |+---------------+------------------+------+---------+-------+------------+...| cinder-volume | cpn001@sharedlun | AZ1 | enabled | up | || cinder-volume | cpn002@sharedlun | AZ1 | enabled | up | || cinder-volume | cpn003@sharedlun | AZ1 | enabled | up | |...+---------------+------------------+------+---------+-------+------------+ -
Проверьте состояние кластера NVMeBox:
# nvmebox-manage capacity sharedlun0 --password <ПАРОЛЬ>Здесь
<ПАРОЛЬ>— пароль из файла/etc/nvmebox/auth-sharedlun0.Пример вывода:
Cluster: sharedlun0Profile: sharedlunTarget address: 10.30.3.100NVMe/TCP port: 4420iSCSI port: 3261API port: 6601Lock VG name: slvg-0Data VG name: slvg-0Lock LV name: configCurrently master: cpn003 = cpn003Name: allSize: 536732499968 (499.8GB)Reserved: 107346499993 (99.9GB)Used: 11039408128 (10.2GB)Available: 418346591847 (389.6GB) -
Проверьте возможности (capabilities) нового бэкенда:
# cinder get-capabilities <УЗЕЛ>@<НАЗВАНИЕ_БЭКЕНДА>Пример команды для проверки бэкенда
sharedlunна узлеcpn003:Пример вывода:
cinder get-capabilities cpn003@sharedlun+---------------------+------------------------------------------------+| Volume stats | Value |+---------------------+------------------------------------------------+| description | None || display_name | None || driver_version | 1.8.0 || namespace | OS::Storage::Capabilities::sharedlun@sharedlun || pool_name | None || replication_targets | [] || storage_protocol | clvm || vendor_name | NVMEBox || visibility | None || volume_backend_name | sharedlun |+---------------------+------------------------------------------------++---------------------+------------------------------------------------+| Backend properties | Value |+---------------------+------------------------------------------------+| compression | {'title': 'Compression', || | 'description': 'Enables compression.', || | 'type': 'boolean'} || qos | {'title': 'QoS', || | 'description': 'Enables QoS.', || | 'type': 'boolean'} || replication_enabled | {'title': 'Replication', || | 'description': 'Enables replication.', || | 'type': 'boolean'} || thin_provisioning | {'title': 'Thin Provisioning', || | 'description': 'Sets thin provisioning.', || | 'type': 'boolean'} |+---------------------+------------------------------------------------+
Чтобы появилась возможность в Портале самообслуживания выбирать СХД:
-
Определите название подов, отвечающих за конфигурацию Портала самообслуживания:
# kubectl get pods -n mcs-front-vkcloudПример вывода:
NAME READY STATUS RESTARTS AGE...mcs-app-configuration-app-69b596c46-f5ztx 1/1 Running 0 99mmcs-app-configuration-app-69b596c46-pszgl 1/1 Running 0 99m -
Скопируйте файл
configuration.jsonc одного из двух контейнеров:# kubectl -n mcs-front-vkcloud cp mcs-front-vkcloud/<НАЗВАНИЕ_ПОДА>:/usr/share/nginx/html/configuration/configuration.json /home/<ПОЛЬЗОВАТЕЛЬ>/mcs-app-configuration-app/configuration.json -
Создайте резервную копию файла
configuration.json:# cp /home/<ПОЛЬЗОВАТЕЛЬ>/mcs-app-configuration-app/configuration.json /home/centos/mcs-app-configuration-app/configuration.json.backupВ результате будут созданы файлы:
.└── mcs-app-configuration-app├── configuration.json└── configuration.json.backup -
Отредактируйте файл
configuration.json:..."volumeTypeGroups": {..."nvmebox": ["nvmebox-type1"],...},"volumeTypes": [...{"availabilityZoneChangingDisabled": false,"availabilityZones": [{"quantityQuotaName": "volumes_nvmebox-type1","totalSizeQuotaName": "gigabytes_nvmebox-type1","zoneName": "AZ1"}],"ephemeral": false,"geoReplication": false,"groupName": "nvmebox","isCreationDisabled": false,"localizedVolumeTypeName": {"en": "External disk (DAS) 1","kk": "Внешний диск (СХД) 1","ru": "Внешний диск (СХД) 1"},"maxVolumeSize": 1099511627776,"maxVolumeSizeForPayingClient": 5497558138880,"priceItemName": "nvmebox_disk_type1","sla": null,"unavailableServices": [],"volumeTypeName": "nvmebox-type1"}],... -
Проверьте, что в файле
configuration.jsonнет ошибок синтаксиса:# cat mcs-app-configuration-app/configuration.json | python -c "import sys,json;json.loads(sys.stdin.read());print('OK')" -
Создайте ConfigMap:
# kubectl create configmap cm-conf-app --from-file=/home/<user>/mcs-app-configuration-app/configuration.json -n mcs-front-vkcloud -
Исправьте Deployment для конфигурации Портала самообслуживания:
# kubectl edit deployment mcs-app-configuration-app -n mcs-front-vkcloudНеобходимые изменения:
...volumeMounts:...- mountPath: /usr/share/nginx/html/configuration/configuration.jsonname: cm-conf-appsubPath: configuration.json...volumes:...- configMap:items:- key: configuration.jsonpath: configuration.jsonname: cm-conf-appname: cm-conf-app...В результате поды будут перезапущены и появится возможность создавать диски внешней СХД.