VK Private Cloud logo
Помощь
Обновлена 17 июля 2026 г. в 15:55

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

Шаг 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_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_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-202501282011.git829d1b2
  8. Создайте новую директорию и файл 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: sharedlun    volume_driver: nvmebox    description: AZ={{ availability_zone1 | 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_zone1 | upper }}'    image_cache: false    placement: '{{ availability_zone1 | 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_zone1 | 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_json:   regions:      ...      - name: gov-cloud         ...         volumeTypes:            ...            cinder_volumes_nvmebox-type1:               en: External disk (DAS) 1               ru: Внешний диск (СХД) 1            cinder_gigabytes_nvmebox-type1:               en: External disk (DAS) 1               ru: Размер внешнего диска (СХД) 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:

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

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

  1. Подключитесь к деплой-ноде по SSH (подробнее — в разделе Вход на деплой-ноду по 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 ../ansible-openstack/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.

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

    [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    |            |...+---------------+------------------+------+---------+-------+------------+
  3. Проверьте состояние кластера NVMeBox:

    # nvmebox-manage capacity sharedlun0 --password <ПАРОЛЬ>

    Здесь <ПАРОЛЬ> — пароль из файла /etc/nvmebox/auth-sharedlun0.

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

    Cluster: sharedlun0    Profile: sharedlun    Target address: 10.30.3.100    NVMe/TCP port: 4420    iSCSI port: 3261    API port: 6601    Lock VG name: slvg-0    Data VG name: slvg-0    Lock LV name: configCurrently master: cpn003 = cpn003Name: all    Size: 536732499968 (499.8GB)    Reserved: 107346499993 (99.9GB)    Used: 11039408128 (10.2GB)    Available: 418346591847 (389.6GB)
  4. Проверьте возможности (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'}                             |+---------------------+------------------------------------------------+

Шаг 7. Добавление поддержки новой СХД в Портал самообслуживания

Чтобы появилась возможность в Портале самообслуживания выбирать СХД:

  1. Определите название подов, отвечающих за конфигурацию Портала самообслуживания:

    # 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
  2. Скопируйте файл configuration.json c одного из двух контейнеров:

    # kubectl -n mcs-front-vkcloud cp mcs-front-vkcloud/<НАЗВАНИЕ_ПОДА>:/usr/share/nginx/html/configuration/configuration.json /home/<ПОЛЬЗОВАТЕЛЬ>/mcs-app-configuration-app/configuration.json
  3. Создайте резервную копию файла 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
  4. Отредактируйте файл 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"                }            ],...
  5. Проверьте, что в файле configuration.json нет ошибок синтаксиса:

    # cat mcs-app-configuration-app/configuration.json | python -c "import sys,json;json.loads(sys.stdin.read());print('OK')"
  6. Создайте ConfigMap:

    # kubectl create configmap cm-conf-app --from-file=/home/<user>/mcs-app-configuration-app/configuration.json -n mcs-front-vkcloud
  7. Исправьте Deployment для конфигурации Портала самообслуживания:

    # kubectl edit  deployment mcs-app-configuration-app -n mcs-front-vkcloud

    Необходимые изменения:

    ...        volumeMounts:        ...        - mountPath: /usr/share/nginx/html/configuration/configuration.json          name: cm-conf-app          subPath: configuration.json      ...      volumes:      ...      - configMap:          items:          - key: configuration.json            path: configuration.json          name: cm-conf-app        name: cm-conf-app...

    В результате поды будут перезапущены и появится возможность создавать диски внешней СХД.