Доступно с ограничениями в редакциях: CE
Доступно без ограничений в редакциях: SE, SE+, EE
Предварительная версия. Функциональность может измениться, но основные возможности сохранятся. Совместимость с будущими версиями может потребовать ручных действий по миграции.
Работоспособность модуля гарантируется только при соблюдении системных требований. Использование в других условиях возможно, но стабильная работа в таких случаях не гарантируется.
Модуль управляет реплицируемым блочным хранилищем на базе DRBD. В качестве control-plane/бэкенда используется LINSTOR (без возможности непосредственной настройки пользователем).
Модуль позволяет создавать Storage Pool и StorageClass через создание пользовательских ресурсов Kubernetes.
Для создания Storage Pool потребуются настроенные на узлах кластера LVMVolumeGroup. Настройка LVM осуществляется модулем sds-node-configurator.
Внимание. Перед включением модуля
sds-replicated-volumeнеобходимо включить модульsds-node-configurator.Внимание. Синхронизация данных при репликации томов происходит только в синхронном режиме, асинхронный режим не поддерживается.
Внимание. Если в кластере используется только одна нода, то вместо
sds-replicated-volumeрекомендуется использоватьsds-local-volume. Для использованияsds-replicated-volumeнеобходимо иметь минимально 3 ноды. Рекомендуется использовать 4 и более на случай выхода нод из строя.
После включения модуля sds-replicated-volume в конфигурации Deckhouse, останется только создать ReplicatedStoragePool и ReplicatedStorageClass.
Для корректной работы модуля sds-replicated-volume выполните следующие шаги:
- 
Включите модуль sds-node-configurator.
Убедитесь, что модуль
sds-node-configuratorвключен до включения модуляsds-replicated-volume. 
Непосредственная конфигурация бэкенда LINSTOR пользователем запрещена.
Синхронизация данных при репликации томов происходит только в синхронном режиме, асинхронный режим не поддерживается.
Для работы с снапшотами требуется подключенный модуль snapshot-controller.
- 
Настройте LVMVolumeGroup.
Перед созданием StorageClass необходимо создать ресурс LVMVolumeGroup модуля
sds-node-configuratorна узлах кластера. - 
Создайте пулы хранения и соответствующие StorageClass’ы.
Создание StorageClass для CSI-драйвера
replicated.csi.storage.deckhouse.ioпользователем запрещено.После активации модуля
sds-replicated-volumeв конфигурации Deckhouse кластер автоматически настроится на работу с бэкендом LINSTOR. Вам останется лишь выполнить создание пулов хранения и StorageClass’ов. 
Модуль поддерживает два режима работы: LVM и LVMThin. У каждого из них есть свои особенности, преимущества и ограничения. Подробнее о различиях можно узнать в FAQ.
Быстрый старт
Все команды выполняются на машине с доступом к API Kubernetes и правами администратора.
Включение модулей
Включение модуля sds-node-configurator:
- 
Создайте ресурс ModuleConfig для включения модуля:
kubectl apply -f - <<EOF apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: sds-node-configurator spec: enabled: true version: 1 EOF - 
Дождитесь, пока модуль
sds-node-configuratorперейдёт в состояниеReady:kubectl get module sds-node-configurator -w - 
Активируйте модуль
sds-replicated-volume. Перед включением рекомендуется ознакомиться с доступными настройками. 
Пример ниже запускает модуль с настройками по умолчанию, что приведет к созданию служебных подов компонента sds-replicated-volume на всех узлах кластера, установит модуль ядра DRBD и зарегестрирует CSI драйвер:
kubectl apply -f - <<EOF
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: sds-replicated-volume
spec:
  enabled: true
  version: 1
EOF
- 
Дождитесь пока модуль
sds-replicated-volumeперейдёт в состояниеReady:kubectl get module sds-replicated-volume -w - 
Убедитесь, что в пространствах имен
d8-sds-replicated-volumeиd8-sds-node-configuratorвсе поды находятся в статусеRunningилиCompletedи запущены на всех узлах, где планируется использовать ресурсы DRBD.kubectl -n d8-sds-replicated-volume get pod -o wide -w kubectl -n d8-sds-node-configurator get pod -o wide -w 
Настройка хранилища на узлах
Необходимо на этих узлах создать группы томов LVM с помощью пользовательских ресурсов LVMVolumeGroup. В быстром старте будем создавать обычное Thick хранилище. Подробнее про пользовательские ресурсы и примеры их использования можно прочитать в примерах использования.
Приступим к настройке хранилища:
- Получить все ресурсы BlockDevice, которые доступны в вашем кластере:
 
kubectl get bd
NAME                                           NODE       CONSUMABLE   SIZE      PATH
dev-0a29d20f9640f3098934bca7325f3080d9b6ef74   worker-0   true         30Gi      /dev/vdd
dev-457ab28d75c6e9c0dfd50febaac785c838f9bf97   worker-0   false        20Gi      /dev/vde
dev-49ff548dfacba65d951d2886c6ffc25d345bb548   worker-1   true         35Gi      /dev/vde
dev-75d455a9c59858cf2b571d196ffd9883f1349d2e   worker-2   true         35Gi      /dev/vdd
dev-ecf886f85638ee6af563e5f848d2878abae1dcfd   worker-0   true         5Gi       /dev/vdb
- Создать ресурс LVMVolumeGroup для узла 
worker-0: 
kubectl apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: LVMVolumeGroup
metadata:
  name: "vg-1-on-worker-0" # Имя может быть любым подходящим для имен ресурсов в Kubernetes. Именно это имя ресурса LVMVolumeGroup будет в дальнейшем использоваться для создания ReplicatedStoragePool
spec:
  type: Local
  local:
    nodeName: "worker-0"
  blockDeviceSelector:
    matchExpressions:
      - key: kubernetes.io/metadata.name
        operator: In
        values:
          - dev-0a29d20f9640f3098934bca7325f3080d9b6ef74
          - dev-ecf886f85638ee6af563e5f848d2878abae1dcfd
  actualVGNameOnTheNode: "vg-1" # имя LVM VG, которая будет создана на узле из указанных выше блочных устройств
EOF
- Дождаться, когда созданный ресурс 
LVMVolumeGroupперейдет в состояниеReady: 
kubectl get lvg vg-1-on-worker-0 -w
- 
Если ресурс перешел в состояние
Ready, то это значит, что на узлеworker-0из блочных устройств/dev/vddи/dev/vdbбыла создана LVM VG с именемvg-1. - 
Далее создать ресурс LVMVolumeGroup для узла
worker-1: 
kubectl apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: LVMVolumeGroup
metadata:
  name: "vg-1-on-worker-1"
spec:
  type: Local
  local:
    nodeName: "worker-1"
  blockDeviceSelector:
    matchExpressions:
      - key: kubernetes.io/metadata.name
        operator: In
        values:
          - dev-49ff548dfacba65d951d2886c6ffc25d345bb548
  actualVGNameOnTheNode: "vg-1"
EOF
- Дождаться, когда созданный ресурс 
LVMVolumeGroupперейдет в состояниеReady: 
kubectl get lvg vg-1-on-worker-1 -w
- 
Если ресурс перешел в состояние
Ready, то это значит, что на узлеworker-1из блочного устройства/dev/vdeбыла создана LVM VG с именемvg-1. - 
Далее создать ресурс LVMVolumeGroup для узла
worker-2: 
kubectl apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: LVMVolumeGroup
metadata:
  name: "vg-1-on-worker-2"
spec:
  type: Local
  local:
    nodeName: "worker-2"
  blockDeviceSelector:
    matchExpressions:
      - key: kubernetes.io/metadata.name
        operator: In
        values:
          - dev-75d455a9c59858cf2b571d196ffd9883f1349d2e
  actualVGNameOnTheNode: "vg-1"
EOF
- Дождаться, когда созданный ресурс 
LVMVolumeGroupперейдет в состояниеReady: 
kubectl get lvg vg-1-on-worker-2 -w
- 
Если ресурс перешел в состояние
Ready, то это значит, что на узлеworker-2из блочного устройства/dev/vddбыла создана LVM VG с именемvg-1. - 
Теперь, когда у нас на узлах созданы нужные LVM VG, мы можем создать из них ReplicatedStoragePool:
 
kubectl apply -f -<<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: ReplicatedStoragePool
metadata:
  name: data
spec:
  type: LVM
  lvmVolumeGroups: # Здесь указываем имена ресурсов LVMVolumeGroup, которые мы создавали ранее
    - name: vg-1-on-worker-0
    - name: vg-1-on-worker-1
    - name: vg-1-on-worker-2
EOF
- Дождаться, когда созданный ресурс 
ReplicatedStoragePoolперейдет в состояниеCompleted: 
kubectl get rsp data -w
- Проверить, что Storage Pool 
dataсоздался на узлахworker-0,worker-1иworker-2: 
alias linstor='kubectl -n d8-sds-replicated-volume exec -ti deploy/linstor-controller -- linstor'
linstor sp l
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool          ┊ Node     ┊ Driver   ┊ PoolName ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊ SharedName                    ┊
╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ DfltDisklessStorPool ┊ worker-0 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊ worker-0;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ worker-1 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊ worker-1;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ worker-2 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊ worker-2;DfltDisklessStorPool ┊
┊ data                 ┊ worker-0 ┊ LVM      ┊ vg-1     ┊    35.00 GiB ┊     35.00 GiB ┊ False        ┊ Ok    ┊ worker-0;data                 ┊
┊ data                 ┊ worker-1 ┊ LVM      ┊ vg-1     ┊    35.00 GiB ┊     35.00 GiB ┊ False        ┊ Ok    ┊ worker-1;data                 ┊
┊ data                 ┊ worker-2 ┊ LVM      ┊ vg-1     ┊    35.00 GiB ┊     35.00 GiB ┊ False        ┊ Ok    ┊ worker-2;data                 ┊
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
- Создать ресурс ReplicatedStorageClass для кластера, в котором нет зон (работа зональных ReplicatedStorageClass подробнее описана в сценариях использования):
 
kubectl apply -f -<<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: ReplicatedStorageClass
metadata:
  name: replicated-storage-class
spec:
  storagePool: data # Указываем имя ReplicatedStoragePool, созданного ранее
  reclaimPolicy: Delete
  topology: Ignored # - если указываем такую топологию, то в кластере не должно быть зон (узлов с метками topology.kubernetes.io/zone).
EOF
- Дождаться, когда созданный ресурс 
ReplicatedStorageClassперейдет в состояниеCreated: 
kubectl get rsc replicated-storage-class -w
- Проверить, что соответствующий 
StorageClassсоздался: 
kubectl get sc replicated-storage-class
- Если 
StorageClassс именемreplicated-storage-classпоявился, значит настройка модуляsds-replicated-volumeзавершена. Теперь пользователи могут создавать PV, указываяStorageClassс именемreplicated-storage-class. При указанных выше настройках будет создаваться том с 3мя репликами на разных узлах. 
Системные требования и рекомендации
Требования
Применительно как к однозональным кластерам, так и к кластерам с использованием нескольких зон доступности.
- Используйте стоковые ядра, поставляемые вместе с поддерживаемыми дистрибутивами.
 - Для сетевого соединения необходимо использовать инфраструктуру с пропускной способностью 10 Gbps или выше.
 - Чтобы достичь максимальной производительности, сетевая задержка между узлами должна находиться в пределах 0,5–1 мс. При задержках более 5 мс будут возникать серьезные проблемы с производительностью.
 - Не используйте другой SDS (Software defined storage) для предоставления дисков SDS Deckhouse.