VK Private Cloud logo
Помощь
Обновлена 21 августа 2026 г. в 11:12

Подключение второй СХД

Здесь описана интеграция второй СХД в инсталляции VK Private Cloud 4.3, к которой уже подключена одна СХД. Новая СХД будет подключена по iSCSI с использованием сети Ceph External.

В результате выполнения инструкции будет создан новый бэкенд Cinder (в примерах — sharedlun2) для работы с дисками на второй СХД.

Перед началом работы

Убедитесь, что:

  • Версия VK Private Cloud — 4.3.
  • Бэкенд Cinder по умолчанию — Ceph (cinder_default_volume_type: ceph).
  • К VK Private Cloud через NVMeBox подключена 1 внешняя СХД.
  • (Опционально) Создана отдельная виртуальная машина для имитации внешней СХД, у которой:
    • 1 дополнительный диск data объемом 300–500 ГБ.
    • 2 сетевых интерфейса:
      • Management — для управления;
      • Ceph External — для подключения к узлам VK Private Cloud.
    • Отключены файервол (firewall) и SELinux.

Шаг 1. (Опционально) Имитация внешней СХД (iSCSI target)

На виртуальной машине, которая будет выполнять роль внешней СХД:

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

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

    # systemctl enable target --now
  3. Определите имя диска, который будет использоваться как LUN:

    # lsblk

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

    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTvda    253:0    0   10G  0 disk└─vda1 253:1    0   10G  0 part /vdb    253:16   0  500G  0 disk

    Здесь vdb — диск, который будет использоваться как LUN.

  4. Создайте LUN и iSCSI-таргет в соответствии с примером:

    # targetcli << EOF/backstores/block create lun1 /dev/vdb/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/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.

    Имена iSCSI-инициаторов (ACL) для каждого узла вашего кластера (cpn00X и kcn00X) должны совпадать с теми, которые использовались при подключении первой СХД к VK Private Cloud.

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

    # targetcli ls

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

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

  • на управляющих узлах (cpn001, cpn002, cpn003);
  • на вычислительных узлах (kcn001, kcn002).

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

  1. Подключитесь к нужному узлу.

  2. Выполните поиск (discovery) iSCSI-таргета на новой СХД:

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

    Здесь <IP-АДРЕС> — IP-адрес iSCSI-таргета.

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

    <IP-АДРЕС>:3260,1 iqn.2026-02.local.storage

    Здесь iqn.2026-02.local.storage — имя iSCSI-таргета.

  3. Подключитесь к найденному iSCSI-таргету:

    # iscsiadm -m node -T <iSCSI-ТАРГЕТ> -p <IP-АДРЕС> -l

    Здесь:

    • <iSCSI-ТАРГЕТ> — имя iSCSI-таргета.
    • <IP-АДРЕС> — IP-адрес iSCSI-таргета.

    Пример команды подключения:

    # iscsiadm -m node -T iqn.2026-02.local.storage -p <IP-АДРЕС> -l
  4. Проверьте, что появился новый диск, и скопируйте его WWID:

    # lsblk

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

    sdi               8:16   0  500G  0 disk└─36001405b121a79 253:17 0  500G  0 mpath

    Здесь 36001405b121a79 — WWID диска.

  5. Добавьте новый LUN в конфигурацию Multipath. Для этого в файле /etc/multipath.conf добавьте блок с уникальным псевдонимом (alias).

    Пример добавления псевдонима диска:

    multipath {    wwid 36001405b121a79    alias vm-lun2}

    Здесь vm-lun2 — псевдоним диска с идентификатором 36001405b121a79.

  6. Перезапустите Multipath:

    # systemctl restart multipathd
  7. Проверьте, что диск появился с правильным псевдонимом:

    # lsblk

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

    ...sdi               8:16   0  500G  0 disk└─vm-lun2        253:1   0  500G  0 mpath...

Шаг 3. Создание и настройка нового кластера NVMeBox

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

  2. Перейдите в директорию /etc/nvmebox.

  3. Создайте копии конфигурационных файлов существующего кластера NVMeBox:

    cp auth-<СУЩЕСТВУЮЩИЙ_КЛАСТЕР> auth-<НОВЫЙ_КЛАСТЕР> && \cp config-<СУЩЕСТВУЮЩИЙ_КЛАСТЕР>.json config-<НОВЫЙ_КЛАСТЕР>.json && \cp runtime-<СУЩЕСТВУЮЩИЙ_КЛАСТЕР> runtime-<НОВЫЙ_КЛАСТЕР>

    Здесь:

    • <СУЩЕСТВУЮЩИЙ_КЛАСТЕР> — имя существующего кластера.
    • <НОВЫЙ_КЛАСТЕР> — имя нового кластера.

    Пример копирования файлов существующего кластера sharedlun0 для нового sharedlun2:

    cp auth-sharedlun0 auth-sharedlun2 && \cp config-sharedlun0.json config-sharedlun2.json && \cp runtime-sharedlun0 runtime-sharedlun2
  4. Отредактируйте параметры в конфигурационном файле нового кластера config-<ИМЯ_КЛАСТЕРА>.json. Пример:

    {      "version": 1,      "cluster_name": "sharedlun2",      "profile": "sharedlun",      "vg_name": "slvg-2",      "api_addr": "10.30.3.101",      "target_addr": "10.30.3.101",      "target_port": 4420,      "lock_lv": "config",      "api_port": 6601,      "data_vg_name": "slvg-2",      "iscsi_port": 3261,      "clustered_data_vg": true,      "fip_provider": "exabgp",      "extra_opts": {},      "ignore_auth": false,      "login": "nvmebox",      "password": "$sha256$axxxxxxxxxxxxxxxxxxxxxxxxxxxx",      "readonly_login": "nvmeboxview",      "readonly_password": "$sha256xxxxxxxxxxxxxxxxxxxxxxxxxxx"    }

    Основные параметры:

    • cluster_name — уникальное имя кластера.

    • api_addr — уникальный Floating IP-адрес для API нового кластера.

    • target_addr — значение должно совпадать с api_addr.

    • data_vg_name — имя группы дисков (Volume Group), которая будет создана на новом диске.

  5. Подготовьте новый диск с помощью утилиты nvmebox-manage:

    # nvmebox-manage format <НОВЫЙ_КЛАСТЕР> --cluster_pv_device /dev/mapper/<ИМЯ_ДИСКА>

    Пример подготовки диска vm-lun2:

    # nvmebox-manage format sharedlun2 --cluster_pv_device /dev/mapper/vm-lun2
  6. Запустите сервис нового кластера на управляющих узлах. Для этого на каждом из управляющих узлов выполните команду:

    # systemctl start sharedlun-cluster@<НОВЫЙ_КЛАСТЕР>

    Пример для кластера sharedlun2:

    # systemctl start sharedlun-cluster@sharedlun2
  7. Проверьте статус и доступное пространство нового кластера:

    # nvmebox-manage capacity <НОВЫЙ_КЛАСТЕР> --password <ПАРОЛЬ>

    Здесь:

    • <НОВЫЙ_КЛАСТЕР> — название нового кластера NVMeBox.
    • <ПАРОЛЬ> — пароль из файла /etc/nvmebox/auth-<НОВЫЙ_КЛАСТЕР>.

    Пример для кластера sharedlun2:

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

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

    Cluster: sharedlun2    Profile: sharedlun    API address: 10.30.3.101    Target address: 10.30.3.101    NVMe/TCP port: 4420    iSCSI port: 3261    API port: 6601    Lock VG name: slvg-2    Data VG name: slvg-2    Lock LV name: configCurrently master: cpn001 = cpn001Name: all    Size: 1073599217664 (499.8GB)    Reserved: 214719843532 (99.9GB)    Used: 43251662848 (0.2GB)    Available: 815627711284 (399.6GB)
  8. Убедитесь, что в логах отсутствуют ошибки:

    # tail -f /var/log/infra-latest/nvmebox-sharedlun.<УЗЕЛ>.all.log

    Здесь <УЗЕЛ> — название управляющего узла.

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

  1. Перейдите в директорию /opt/vkcloud/inventory/vkcloud.

  2. Откройте файл group_vars/vkcloud_kube/solar-helium.yml.

  3. Найдите переменную helm_mcs_app_cfg_name и скопируйте ее значение.

    Пример переменной со значением:

    helm_mcs_app_cfg_name: commonBox_4.3v5
  4. В соответствии со значением переменной откройте для редактирования файл:

    files/front_config/<ЗНАЧЕНИЕ_ПЕРЕМЕННОЙ>.config.json.j2
  5. Измените название каждой СХД, чтобы они отличались в интерфейсе портала самообслуживания, так как по умолчанию они идентичны. Для этого найдите в открытом файле нужные параметры каждой из СХД по фразе nvmebox_disk_type и отредактируйте их.

    Пример параметров, которые нужно отредактировать:

    "en": "External disk (DAS)","kk": "Внешний диск (СХД)","ru": "Внешний диск (СХД)"
  6. Отредактируйте файлы Inventory, добавив в них конфигурацию для нового кластера sharedlun2. Точное расположение переменных зависит от структуры Inventory. Обычно файлы находятся в директории inventory/vkcloud/group_vars/.

    • vkcloud/quotas.yml:

      openstack_default_quotas:...  volume_quotas:  ...    volumes_nvmebox-type2: 0    gigabytes_nvmebox-type2: 0  openstack_project_quotas:  # OpenStack project list  service:  ...    volume_quotas:    ...      volumes_nvmebox-type2: -1      gigabytes_nvmebox-type2: -1  ...  admin:    volume_quotas:      volumes_nvmebox-type2: -1      gigabytes_nvmebox-type2: -1...quota_templates:    name: infra    quotas:      cinder:        volumes_nvmebox-type2: 10        gigabytes_nvmebox-type2: 200...    name: infra+paas    quotas:      cinder:        volumes_nvmebox-type2: 10        gigabytes_nvmebox-type2: 200
    • group_vars/vkcloud_cinder_nvmebox/vars.yml:

      volume_backends:  ...  - name: sharedlun2    volume_driver: nvmebox    description: AZ={{ availability_zones.az1 | upper }}, cluster=sharedlun2    backend_name: sharedlun2    nvmebox_url: http://{{ nvmebox_announce_ip_2 }}:{{ 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: sharedlun2 # Очень важно: Имя кластера nvmebox должно быть таким же что и название бэкенда!    clustered: true    rbd_cluster_name: sharedlun2    rbd_pool: sharedlun2-volumes    rbd_user: sharedlun2cinder_bootstrap_types:  ...  - name: nvmebox-type2    extra_specs:      mcs:nova_availability_zone: '{{ availability_zones.az1 | upper }}'      volume_backend_name: sharedlun2      mcs:disk_class: nvmebox_disk_type2    qos:      name: nvmebox-type2      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
    • group_vars/vkcloud_kube/mcs-admin-ui.yml:

      ...helm_superadmin_configuration_tpl:  en:    ...    cinder_volumes_nvmebox-type2: External disk (DAS) 2    cinder_gigabytes_nvmebox-type2: External disk (DAS) 2  ru:    ...    cinder_volumes_nvmebox-type2: Внешний диск (СХД) 2    cinder_gigabytes_nvmebox-type2: Размер внешнего диска (СХД) 2...
    • group_vars/vkcloud_kube/quota-manager.yml:

      ...helm_quota_manager_enabled_services_yaml:  cinder:    ...    - volumes_nvmebox-type2    - gigabytes_nvmebox-type2
    • group_vars/vkcloud/vars.yml:

      nvmebox_announce_ip_2: 10.30.3.101

      Для каждой СХД название переменной должно отличаться. Пример: для первой СХД — nvmebox_announce_ip, для второй СХД — nvmebox_announce_ip_2 и т.д.

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

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

  2. Запустите плейбук cinder-volume-deploy.yml:

    # ansible-playbook -i vkcloud.yml -e env=vkcloud -e bootstrap=true -e lvm_use_lvmlockd=1 ../ansible-openstack/playbooks/cinder-volume-deploy.yml -D
  3. Обновите конфигурацию интерфейса Портала администратора:

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

    # ansible-playbook -i vkcloud.yml -e env=vkcloud -e bootstrap=true ../ansible-openstack/playbooks/helm-quota-manager.yml -D
  5. Запустите плейбук helm-solar-helium.yml:

    # ansible-playbook -i vkcloud.yml -e env=vkcloud ../ansible-openstack/playbooks/helm-solar-helium.yml -e bootstrap=true

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

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

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

    # cinder service-list

    В выводе должны присутствовать бэкенды cpn001@sharedlun2cpn002@sharedlun2 и cpn003@sharedlun2 со статусом enabled и состоянием up.

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

    +---------------+-------------------+------+---------+-------+| Binary        | Host              | Zone | Status  | State |+---------------+-------------------+------+---------+-------+| cinder-volume | cpn001@sharedlun2 | AZ1  | enabled | up    || cinder-volume | cpn002@sharedlun2 | AZ1  | enabled | up    || cinder-volume | cpn003@sharedlun2 | AZ1  | enabled | up    |+---------------+-------------------+------+---------+-------+
  3. Проверьте логи сервиса cinder-volume для нового бэкенда на наличие ошибок.

    Пример запроса:

    # journalctl -fu mcs-cinder-volume@sharedlun2
  4. Убедитесь, что появился новый тип диска:

    # openstack volume type list

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

    +--------------------------------------+---------------+-----------+| ID                                   | Name          | Is Public |+--------------------------------------+---------------+-----------+...| 3e21c050-735b-45c8-8275-ee3c905c3668 | nvmebox-type2 | True      |...+--------------------------------------+---------------------------+
  5. Запросите детальную информацию о новом типе диска:

    # openstack volume type show <ТИП_ДИСКА>

    Здесь <ТИП_ДИСКА> — идентификатор типа диска, полученный на предыдущем шаге.

  6. Убедитесь, что в поле properties в переменной volume_backend_name указан корректный бэкенд Cinder.

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

    +--------------------+--------------------------------------+| Field              | Value                                |+--------------------+--------------------------------------+| access_project_ids | None                                 || description        | nvmebox-type2                        || id                 | 3e21c050-735b-45c8-8275-ee3c905c3668 || is_public          | True                                 || name               | nvmebox-type2                        || properties         | mcs:disk_class='nvmebox_disk_type2', ||                    | mcs:nova_availability_zone='AZ1',    ||                    | volume_backend_name='sharedlun2'     || qos_specs_id       | 7da7aa02-764a-474e-846e-8826b918c04a |+--------------------+--------------------------------------|
  7. Проверьте возможности (capabilities) нового бэкенда:

    # cinder get-capabilities <УЗЕЛ>@<НАЗВАНИЕ_БЭКЕНДА>

    Пример команды для проверки бэкенда sharedlun2 на узле cpn002:

    # cinder get-capabilities cpn002@sharedlun2

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

    +---------------------+--------------------------------------------------+| Volume stats        | Value                                            |+---------------------+--------------------------------------------------+| description         | None                                             || display_name        | None                                             || driver_version      | 1.9.1                                            || namespace           | OS::Storage::Capabilities::sharedlun2@sharedlun2 || pool_name           | None                                             || replication_targets | []                                               || storage_protocol    | clvm                                             || vendor_name         | NVMEBox                                          || visibility          | None                                             || volume_backend_name | sharedlun2                                       |+---------------------+--------------------------------------------------++---------------------+--------------------------------------------------+| 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'}                               |+---------------------+--------------------------------------------------+

Если все проверки пройдены успешно и в логах нет ошибок, новый бэкенд (в примере — sharedlun2) полностью готов к использованию: можно создавать диски и виртуальные машины с указанием типа диска, соответствующего новой СХД.

Была ли статья полезна?