VK Private Cloud logo
Помощь
Обновлена 5 июня 2026 г. в 11:57

Развертывание 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.

Шаг 1. Создание имитации внешней СХД (iSCSI target)

На ВМ, которая будет играть роль внешней СХД:

  1. Установите targetcli:

    # dnf install -y targetcli
  2. Запустите targetcli:

    # systemctl enable target --now
  3. Проверьте наличие дисков:

    # 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
  4. Создайте 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 на виртуальной машине, имитирующей СХД.

  5. Проверьте созданную конфигурацию:

    # targetcli ls

Шаг 2. Подключение iSCSI-таргета к узлам VK Private Cloud

Подключение iSCSI-таргета нужно выполнить на каждом узле, который будет использовать NVMeBox:

  • на управляющих узлах (cpn001cpn002cpn003);
  • на вычислительных узлах (kcn001kcn002).

Чтобы подключить iSCSI-таргет к узлу:

  1. Установите пакет iSCSI-инициатора (iSCSI initiator):

    # yum install -y iscsi-initiator-utils
  2. В файле /etc/iscsi/initiatorname.iscsi задайте имя iSCSI-инициатора, чтобы оно соответствовало имени, которое указано в ACL СХД. Примеры:

    • Для узла cpn001InitiatorName=iqn.2026-02.local.cpn001:6.

    • Для узла cpn002InitiatorName=iqn.2026-02.local.cpn002:7.

  3. Перезапустите сервис iscsid:

    # systemctl restart iscsid
  4. Выполните поиск (discovery) iSCSI-таргета:

    # iscsiadm -m discovery -t sendtargets -p <IP-АДРЕС>

    Здесь <IP-АДРЕС> — IP-адрес интерфейса Ceph External на виртуальной машине, имитирующей СХД.

    Пример вывода:

    <IP-АДРЕС>:3260,1 iqn.2026-02.local.storage
  5. Подключитесь к найденному iSCSI-таргету:

    # iscsiadm -m node -T iqn.2026-02.local.storage -p <IP-АДРЕС> -l

    Здесь <IP-АДРЕС> — IP-адрес интерфейса Ceph External на виртуальной машине, имитирующей СХД.

  6. Проверьте, что появились два новых диска объемом 4 ГБ и 500 ГБ:

    # lsblk

    Пример вывода:

    ...sda   8:0    0   4G  0 disksdb   8:16   0 500G  0 disk...
  7. Повторите действия на каждом узле, который будет использовать NVMeBox.

Шаг 3. Настройка Multipath на узлах

Для корректной работы с iSCSI-дисками настройте Multipath:

  1. Создайте или отредактируйте файл /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 no    max_fds max    flush_on_last_del yes    queue_without_daemon no    dev_loss_tmo infinity    fast_io_fail_tmo 5}
  2. Перезапустите Multipath:

    # systemctl restart multipathd
  3. Узнайте 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 ГБ.
  4. Добавьте для дисков псевдонимы (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 no    max_fds max    flush_on_last_del yes    queue_without_daemon no    dev_loss_tmo infinity    fast_io_fail_tmo 5}multipaths {    multipath {        wwid 360014051aebbd3e9a4f4e05b20e0f630        alias vm-lun    }    multipath {        wwid 36001405a9eaf4349c694644889c18a2d        alias lock-lun    }}
  5. Перезапустите Multipath:

    # systemctl restart multipathd
  6. Проверьте результат:

    # 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

Шаг 4. Внесение изменений в Ansible Inventory

Для добавления поддержки NVMeBox отредактируйте файлы Ansible Inventory:

  1. Добавьте новый бэкенд и устройства 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 }}.*'...
  2. Добавьте устройства 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...
  3. Создайте новый файл 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
  4. Добавьте пакет nvmebox в файл group_vars/vkcloud/packages.yml:

    ...pkg:  ...  nvmebox:    python3_nvmebox: python38-nvmebox-{{ pkg_version.nvmebox }}.cmpt.el7.noarch    nvmebox: nvmebox-{{ pkg_version.nvmebox }}.cmpt.el7.noarch
  5. Добавьте квоты для нового типа дисков nvmebox-type1 в шаблоны и по умолчанию в файл group_vars/vkcloud/quotas.yml:

    openstack_default_quotas:...  volume_quotas:  ...    volumes_nvmebox-type1: 0    gigabytes_nvmebox-type1: 0  openstack_project_quotas:  # OpenStack project list  service:  ...    volume_quotas:    ...      volumes_nvmebox-type1: -1      gigabytes_nvmebox-type1: -1  ...  admin:    volume_quotas:      volumes_nvmebox-type1: -1      gigabytes_nvmebox-type1: -1...quota_templates:    name: infra    quotas:      cinder:        volumes_nvmebox-type1: 10        gigabytes_nvmebox-type1: 200...    name: infra+paas    quotas:      cinder:        volumes_nvmebox-type1: 10        gigabytes_nvmebox-type1: 200
  6. Добавьте пароли для пользователей NVMeBox в файл group_vars/vkcloud/vault.yml:

    ...vault_nvmebox_admin: <ПАРОЛЬ>vault_nvmebox_view: <ПАРОЛЬ>...
  7. Добавьте версию пакета nvmebox в файл group_vars/vkcloud/versions.yml:

    ...pkg_version:  ...  nvmebox: 0.10.0-202510020900.gitc07fff8
  8. Создайте новую директорию и файл group_vars/vkcloud_cinder_nvmebox/vars.yml.

    Пример конфигурации бэкенда Cinder для NVMeBox:

    host_placement: '{{ az }}'cinder_coordination_url: consul://127.0.0.1:8500volume_backends:  - name: sharedlun    volume_driver: nvmebox    description: AZ={{ availability_zones.az1 | upper }}, cluster=sharedlun    backend_name: sharedlun    nvmebox_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: true    storage_availability_zone: '{{ availability_zones.az1 | upper }}'    image_cache: false    placement: '{{ availability_zones.az1 | upper }}'    cluster_name: sharedlun    clustered: true    rbd_cluster_name: sharedlun    rbd_pool: sharedlun-volumes    rbd_user: sharedluncinder_bootstrap_types:  - name: nvmebox-type1    extra_specs:      mcs:nova_availability_zone: '{{ availability_zones.az1 | upper }}'      volume_backend_name: sharedlun      mcs:disk_class: nvmebox_disk_type1    qos:      name: nvmebox-type1      cache_mode: none      read_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
  9. Добавьте локализации для нового типа дисков в файле group_vars/vkcloud_kube/mcs-admin-ui.yml:

    ...helm_superadmin_configuration_tpl:  en:    ...    cinder_volumes_nvmebox-type1: External disk (DAS) 1    cinder_gigabytes_nvmebox-type1: External disk (DAS) 1  ru:    ...    cinder_volumes_nvmebox-type1: Внешний диск (СХД) 1    cinder_gigabytes_nvmebox-type1: Размер внешнего диска (СХД) 1...
  10. Добавьте новые сервисы для отслеживания квот в файле group_vars/vkcloud_kube/quota-manager.yml:

    ...helm_quota_manager_enabled_services_yaml:  cinder:    ...    - volumes_nvmebox-type1    - gigabytes_nvmebox-type1
  11. Создайте новую директорию и файл group_vars/vkcloud_nvmebox_agent/vars.yml и добавьте в файл переменную для IP-адреса агента NVMeBox на вычислительных узлах:

    nvmebox_agent_ip: '{{ ansible_facts[netname_to_iface.internal]["ipv4"]["address"] }}'
  12. Добавьте новые группы узлов и идентификаторы sanlock_host_id для узлов в файле vkcloud.yml:

    all:  ...  children:    ...    vkcloud_cinder_nvmebox:      hosts:        cpn001:          sanlock_host_id: 101        cpn002:          sanlock_host_id: 102        cpn003:          sanlock_host_id: 103    vkcloud_nvmebox_agent:      hosts:        kcn001:          sanlock_host_id: 201        kcn002:          sanlock_host_id: 202    ...

Шаг 5. Запуск плейбуков Ansible

  1. Подключитесь к деплой-ноде по SSH (подробнее — в разделе Подключение к деплой-ноде).

  2. Разверните или обновите cinder-volume с новым бэкендом:

    # ansible-playbook -i vkcloud.yml -e env=vkcloud ../ansible-openstack/playbooks/cinder-volume-deploy.yml -D
  3. Разверните 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
  4. Обновите конфигурацию интерфейса Портала администратора:

    # ansible-playbook -i vkcloud.yml -e env=vkcloud ../ansible-openstack/playbooks/helm-mcs-admin-ui.yml -D
  5. Обновите менеджер квот:

    # ansible-playbook -i vkcloud.yml -e env=vkcloud -e bootstrap=true ../ansible-openstack/playbooks/helm-quota-manager.yml -D

Шаг 6. Проверка работоспособности

  1. Подключитесь к управляющему узлу (подробнее — в разделе Подключение к управляющему узлу).

  2. Проверьте статус сервисов Cinder:

    # cinder service-list

    В выводе должны присутствовать бэкенды cpn001@sharedluncpn002@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 |+---------------+------------------+------+---------+-------+------------------------+
  3. Проверьте, что тип дисков nvmebox-type1 доступен:

    # openstack volume type list
  4. Получите подробную информацию о 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 |+--------------------+--------------------------------------+
  5. Проверьте состояние кластера 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-хранилище.