0 added
0 removed
Original
2026-01-01
Modified
2026-02-19
1
Мы перевели<a>пост из блога финского веб-разработчика Vito Botta,</a>который работает над платформой Brella.В <a>предыдущем посте</a> я поделился комментариями и результатами бенчмарков по нескольким бесплатным и платным решениям для хранения в Kubernetes. Еще я сказал, что распрощался с Kubernetes из-за разных проблем с хранилищами. Один читатель предложил попробовать <a>Linstor</a> - еще одно опенсорс-решение с возможностью платной поддержки, о котором я раньше не слышал.<p>У меня было столько проблем с другими вариантами, что настроен я был скептически. Но попробовал, и мне понравилось. Быстрая репликация на основе DRBD работает отлично. Пока у меня возникла только одна проблема с томами, которые неправильно отсоединяются с версией 0.6.4 плагина CSI, но разработчики быстро выпустили новую версию (0.7.0), и там это, вроде, исправлено. Хорошо бы в Linstor были off site бэкапы на основе снапшотов… В остальном неплохое решение. Может, у Kubernetes еще есть шанс. Буду тестить дальше. Очень надеюсь, что других проблем не будет, и я смогу использовать его, забыв про Heroku!</p>
1
Мы перевели<a>пост из блога финского веб-разработчика Vito Botta,</a>который работает над платформой Brella.В <a>предыдущем посте</a> я поделился комментариями и результатами бенчмарков по нескольким бесплатным и платным решениям для хранения в Kubernetes. Еще я сказал, что распрощался с Kubernetes из-за разных проблем с хранилищами. Один читатель предложил попробовать <a>Linstor</a> - еще одно опенсорс-решение с возможностью платной поддержки, о котором я раньше не слышал.<p>У меня было столько проблем с другими вариантами, что настроен я был скептически. Но попробовал, и мне понравилось. Быстрая репликация на основе DRBD работает отлично. Пока у меня возникла только одна проблема с томами, которые неправильно отсоединяются с версией 0.6.4 плагина CSI, но разработчики быстро выпустили новую версию (0.7.0), и там это, вроде, исправлено. Хорошо бы в Linstor были off site бэкапы на основе снапшотов… В остальном неплохое решение. Может, у Kubernetes еще есть шанс. Буду тестить дальше. Очень надеюсь, что других проблем не будет, и я смогу использовать его, забыв про Heroku!</p>
2
<p>Как бы там ни было, документация обширная и хорошая, но кое-что устарело, и я решил сам написать, как быстро установить и использовать Linstor в Kubernetes. Предполагаю, что вы хотите просто установить хранилище и поддержку CSI в Kubernetes, чтобы динамически подготавливать тома с классом хранилища. Это инструкции для Ubuntu. Я пытался что-то сделать в CentOS, но, судя по всему, модуль ядра DRBD для этого дистрибутива доступен, а другие пакеты - нет. Linbit (компания, которая делает Linstor) предоставляет эти пакеты с репозиторием ppa, так что я использовал Ubuntu.</p>
2
<p>Как бы там ни было, документация обширная и хорошая, но кое-что устарело, и я решил сам написать, как быстро установить и использовать Linstor в Kubernetes. Предполагаю, что вы хотите просто установить хранилище и поддержку CSI в Kubernetes, чтобы динамически подготавливать тома с классом хранилища. Это инструкции для Ubuntu. Я пытался что-то сделать в CentOS, но, судя по всему, модуль ядра DRBD для этого дистрибутива доступен, а другие пакеты - нет. Linbit (компания, которая делает Linstor) предоставляет эти пакеты с репозиторием ppa, так что я использовал Ubuntu.</p>
3
<p>Подробно вся технология описана в <a>документации к Linstor</a>. Есть открытые <a>контакты</a>, куда можно задавать вопросы.</p>
3
<p>Подробно вся технология описана в <a>документации к Linstor</a>. Есть открытые <a>контакты</a>, куда можно задавать вопросы.</p>
4
<h2>Установка в Ubuntu</h2>
4
<h2>Установка в Ubuntu</h2>
5
У меня был тестовый кластер с тремя нодами, по 100 ГБ дискового пространства каждый, с подключением через <a>Wireguard VPN</a>, так что весь трафик между нодами зашифрован. Это немного влияет на производительность, но хотя мой облачный провайдер (<a>Hetzner Cloud</a>) теперь предлагает частные сети, он все равно рекомендует шифровать трафик для конфиденциальных данных. В VPN ноды настроены как linstor-master1, linstor-master2 и linstor-master3 с IP 192.168.37.1, 192.168.37.2 и 192.168.37.3 соответственно. Инструкции, понятное дело, нужно адаптировать к вашей системе.<p>Сначала установим заголовки ядра, потому что репликация DRBD основана на модуле ядра, который должен быть создан на всех нодах:</p>
5
У меня был тестовый кластер с тремя нодами, по 100 ГБ дискового пространства каждый, с подключением через <a>Wireguard VPN</a>, так что весь трафик между нодами зашифрован. Это немного влияет на производительность, но хотя мой облачный провайдер (<a>Hetzner Cloud</a>) теперь предлагает частные сети, он все равно рекомендует шифровать трафик для конфиденциальных данных. В VPN ноды настроены как linstor-master1, linstor-master2 и linstor-master3 с IP 192.168.37.1, 192.168.37.2 и 192.168.37.3 соответственно. Инструкции, понятное дело, нужно адаптировать к вашей системе.<p>Сначала установим заголовки ядра, потому что репликация DRBD основана на модуле ядра, который должен быть создан на всех нодах:</p>
6
<blockquote><em>apt-get install linux-headers-$(uname -r)</em></blockquote>Потом добавим репозиторий ppa:<blockquote><em>add-apt-repository ppa:linbit/linbit-drbd9-stack</em></blockquote><blockquote><em>apt-get update</em></blockquote>На всех нодах установим эти пакеты:<blockquote><em>apt install drbd-utils drbd-dkms lvm2</em></blockquote>Загрузим модуль ядра DRBD:<blockquote><em>modprobe drbd</em></blockquote>Проверим, что он точно загрузился:<blockquote><em>lsmod | grep -i drbd</em></blockquote>Убедимся, что он автоматически загружается при запуске:<blockquote><em>echo drbd > /etc/modules-load.d/drbd.conf</em></blockquote>Кластер Linstor состоит из одного активного <em>контроллера</em>, который управляет всей информацией о кластере, и <em>спутников</em> - нод, которые предоставляют хранилище. На ноде, которая будет контроллером, выполним команду:<blockquote><em>apt install linstor-controller linstor-satellite linstor-client</em></blockquote>Эта команда делает контроллер еще и спутником. В моем случае контроллером был linstor-master1. Чтобы сразу запустить контроллер и включить его автоматический запуск при загрузке, выполним команду:<blockquote><em>systemctl enable --now linstor-controller</em></blockquote><blockquote><em>systemctl start linstor-controller</em></blockquote>На оставшихся нодах-спутниках установим следующие пакеты:<blockquote><em>apt install linstor-satellite linstor-client</em></blockquote>Запустим спутник и сделаем так, чтобы он запускался при загрузке:<blockquote><em>systemctl enable --now linstor-satellite</em></blockquote><blockquote><em>systemctl start linstor-satellite</em></blockquote>Теперь можно добавить к контролеру спутники, включая саму эту ноду:<blockquote><em>linstor node create linstor-master1 192.168.37.1</em></blockquote><blockquote><em>linstor node create linstor-master2 192.168.37.2</em></blockquote><blockquote><em>linstor node create linstor-master3 192.168.37.3</em></blockquote>Подождем пять секунд и убедимся, что ноды онлайн:<blockquote><em>linstor node list</em></blockquote>Получится что-то вроде этого:Теперь нужно настроить хранилище. Linstor работает с LVM или ZFS, чтобы управлять хранилищем. Не знаю, в чем разница, но я больше знаком с LVM, его и возьму.<p>Сначала подготовим физический диск или диски на каждом узле. В моем случае это /dev/sdb:</p>
6
<blockquote><em>apt-get install linux-headers-$(uname -r)</em></blockquote>Потом добавим репозиторий ppa:<blockquote><em>add-apt-repository ppa:linbit/linbit-drbd9-stack</em></blockquote><blockquote><em>apt-get update</em></blockquote>На всех нодах установим эти пакеты:<blockquote><em>apt install drbd-utils drbd-dkms lvm2</em></blockquote>Загрузим модуль ядра DRBD:<blockquote><em>modprobe drbd</em></blockquote>Проверим, что он точно загрузился:<blockquote><em>lsmod | grep -i drbd</em></blockquote>Убедимся, что он автоматически загружается при запуске:<blockquote><em>echo drbd > /etc/modules-load.d/drbd.conf</em></blockquote>Кластер Linstor состоит из одного активного <em>контроллера</em>, который управляет всей информацией о кластере, и <em>спутников</em> - нод, которые предоставляют хранилище. На ноде, которая будет контроллером, выполним команду:<blockquote><em>apt install linstor-controller linstor-satellite linstor-client</em></blockquote>Эта команда делает контроллер еще и спутником. В моем случае контроллером был linstor-master1. Чтобы сразу запустить контроллер и включить его автоматический запуск при загрузке, выполним команду:<blockquote><em>systemctl enable --now linstor-controller</em></blockquote><blockquote><em>systemctl start linstor-controller</em></blockquote>На оставшихся нодах-спутниках установим следующие пакеты:<blockquote><em>apt install linstor-satellite linstor-client</em></blockquote>Запустим спутник и сделаем так, чтобы он запускался при загрузке:<blockquote><em>systemctl enable --now linstor-satellite</em></blockquote><blockquote><em>systemctl start linstor-satellite</em></blockquote>Теперь можно добавить к контролеру спутники, включая саму эту ноду:<blockquote><em>linstor node create linstor-master1 192.168.37.1</em></blockquote><blockquote><em>linstor node create linstor-master2 192.168.37.2</em></blockquote><blockquote><em>linstor node create linstor-master3 192.168.37.3</em></blockquote>Подождем пять секунд и убедимся, что ноды онлайн:<blockquote><em>linstor node list</em></blockquote>Получится что-то вроде этого:Теперь нужно настроить хранилище. Linstor работает с LVM или ZFS, чтобы управлять хранилищем. Не знаю, в чем разница, но я больше знаком с LVM, его и возьму.<p>Сначала подготовим физический диск или диски на каждом узле. В моем случае это /dev/sdb:</p>
7
<blockquote><em>pvcreate /dev/sdb</em></blockquote>Создадим группу томов:<blockquote><em>vgcreate vg /dev/sdb</em></blockquote>Я назову группу "vg", а вы - как хотите.<p>Теперь создадим "тонкий" пул для thin provisioning (то есть возможности создавать тома больше доступного места, чтобы потом расширять хранилище по необходимости) и снапшотов:</p>
7
<blockquote><em>pvcreate /dev/sdb</em></blockquote>Создадим группу томов:<blockquote><em>vgcreate vg /dev/sdb</em></blockquote>Я назову группу "vg", а вы - как хотите.<p>Теперь создадим "тонкий" пул для thin provisioning (то есть возможности создавать тома больше доступного места, чтобы потом расширять хранилище по необходимости) и снапшотов:</p>
8
<blockquote><em>lvcreate -l 100%FREE --thinpool vg/lvmthinpool</em></blockquote>Эта команда создает логический том, который занимает весь диск.<p>Пора создать пул хранилища на каждой ноде, так что на контроллере выполняем команду:</p>
8
<blockquote><em>lvcreate -l 100%FREE --thinpool vg/lvmthinpool</em></blockquote>Эта команда создает логический том, который занимает весь диск.<p>Пора создать пул хранилища на каждой ноде, так что на контроллере выполняем команду:</p>
9
<blockquote><em>linstor storage-pool create lvmthin linstor-master1 linstor-pool vg/lvmthinpool</em></blockquote><blockquote><em>linstor storage-pool create lvmthin linstor-master2 linstor-pool vg/lvmthinpool</em></blockquote><blockquote><em>linstor storage-pool create lvmthin linstor-master3 linstor-pool vg/lvmthinpool</em></blockquote>Я назову пул "linstor-pool". Убедимся, что пул создан:<blockquote><em>linstor storage-pool list</em></blockquote>Получится что-то вроде этого:Основная настройка Linstor готова.<h2>Kubernetes</h2>
9
<blockquote><em>linstor storage-pool create lvmthin linstor-master1 linstor-pool vg/lvmthinpool</em></blockquote><blockquote><em>linstor storage-pool create lvmthin linstor-master2 linstor-pool vg/lvmthinpool</em></blockquote><blockquote><em>linstor storage-pool create lvmthin linstor-master3 linstor-pool vg/lvmthinpool</em></blockquote>Я назову пул "linstor-pool". Убедимся, что пул создан:<blockquote><em>linstor storage-pool list</em></blockquote>Получится что-то вроде этого:Основная настройка Linstor готова.<h2>Kubernetes</h2>
10
Чтобы Kubernetes динамически подготавливал тома, нужно установить плагин CSI и создать класс хранилища. На момент написания поста последняя версия была 0.7.0. <a>Узнайте</a>, не появилось ли новых.<p>Выполняем установку этой командой:</p>
10
Чтобы Kubernetes динамически подготавливал тома, нужно установить плагин CSI и создать класс хранилища. На момент написания поста последняя версия была 0.7.0. <a>Узнайте</a>, не появилось ли новых.<p>Выполняем установку этой командой:</p>
11
<blockquote><em>TAG=v0.7.0</em></blockquote><blockquote><em>CONTROLLER_IP=192.168.37.1</em></blockquote><blockquote><em>curl https://raw.githubusercontent.com/LINBIT/linstor-csi/$TAG/examples/k8s/deploy/linstor-csi-1.14.yaml | sed "s/linstor-controller.example.com/$CONTROLLER_IP/g" | kubectl apply -f -</em></blockquote>Вместо TAG и CONTROLLER_IP укажите свои значения. Ждем, пока поды не заработают:<blockquote><em>watch kubectl -n kube-system get all</em></blockquote>Наконец, устанавливаем класс хранилища:<blockquote><em>REPLICAS=3</em></blockquote><blockquote><em>cat <<EOF | kubectl apply -f -</em></blockquote><blockquote><em>apiVersion: storage.k8s.io/v1</em></blockquote><blockquote><em>kind: StorageClass</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: linstor</em></blockquote><blockquote><em>provisioner: linstor.csi.linbit.com</em></blockquote><blockquote><em>parameters:</em></blockquote><blockquote><em> autoPlace: "$REPLICAS"</em></blockquote><blockquote><em> storagePool: "linstor-pool"</em></blockquote><blockquote><em>EOF</em></blockquote>Указываем число реплик по числу нод. autoPlace гарантирует, что тома будут автоматически размещаться и распределяться по нодам/пулам.<p>Наконец, делаем pvc и проверяем, что подготовка работает:</p>
11
<blockquote><em>TAG=v0.7.0</em></blockquote><blockquote><em>CONTROLLER_IP=192.168.37.1</em></blockquote><blockquote><em>curl https://raw.githubusercontent.com/LINBIT/linstor-csi/$TAG/examples/k8s/deploy/linstor-csi-1.14.yaml | sed "s/linstor-controller.example.com/$CONTROLLER_IP/g" | kubectl apply -f -</em></blockquote>Вместо TAG и CONTROLLER_IP укажите свои значения. Ждем, пока поды не заработают:<blockquote><em>watch kubectl -n kube-system get all</em></blockquote>Наконец, устанавливаем класс хранилища:<blockquote><em>REPLICAS=3</em></blockquote><blockquote><em>cat <<EOF | kubectl apply -f -</em></blockquote><blockquote><em>apiVersion: storage.k8s.io/v1</em></blockquote><blockquote><em>kind: StorageClass</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: linstor</em></blockquote><blockquote><em>provisioner: linstor.csi.linbit.com</em></blockquote><blockquote><em>parameters:</em></blockquote><blockquote><em> autoPlace: "$REPLICAS"</em></blockquote><blockquote><em> storagePool: "linstor-pool"</em></blockquote><blockquote><em>EOF</em></blockquote>Указываем число реплик по числу нод. autoPlace гарантирует, что тома будут автоматически размещаться и распределяться по нодам/пулам.<p>Наконец, делаем pvc и проверяем, что подготовка работает:</p>
12
<blockquote><em>cat <<EOF | kubectl apply -f -</em></blockquote><blockquote><em>apiVersion: v1</em></blockquote><blockquote><em>kind: PersistentVolumeClaim</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: test-pvc</em></blockquote><blockquote><em>spec:</em></blockquote><blockquote><em> storageClassName: linstor</em></blockquote><blockquote><em> accessModes:</em></blockquote><blockquote><em> - ReadWriteOnce</em></blockquote><blockquote><em> resources:</em></blockquote><blockquote><em> requests:</em></blockquote><blockquote><em> storage: 1Gi</em></blockquote><blockquote><em>EOF</em></blockquote><blockquote><em>kubectl get pvc</em></blockquote>Если все нормально, через несколько секунд мы увидим, что pvc привязан (bound):<blockquote><em>NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE</em></blockquote><blockquote><em>test-pvc Bound pvc-af6991ee-b922-11e9-bbca-9600002d2434 1Gi RWO linstor 10s</em></blockquote>Проверим, как дела на контроллере в Linstor:<blockquote><em>linstor volume list</em></blockquote>Получится что-то вроде этого:Заодно уже прогоним простой бенчмарк и посмотрим на производительность, создав pvc и задание:<blockquote><em>cat <<EOF | kubectl apply -f -</em></blockquote><blockquote><em>kind: PersistentVolumeClaim</em></blockquote><blockquote><em>apiVersion: v1</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: dbench-linstor</em></blockquote><blockquote><em>spec:</em></blockquote><blockquote><em> storageClassName: linstor</em></blockquote><blockquote><em> accessModes:</em></blockquote><blockquote><em> - ReadWriteOnce</em></blockquote><blockquote><em> resources:</em></blockquote><blockquote><em> requests:</em></blockquote><blockquote><em> storage: 5Gi</em></blockquote><blockquote><em>---</em></blockquote><blockquote><em>apiVersion: batch/v1</em></blockquote><blockquote><em>kind: Job</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: dbench-linstor</em></blockquote><blockquote><em>spec:</em></blockquote><blockquote><em> template:</em></blockquote><blockquote><em> spec:</em></blockquote><blockquote><em> containers:</em></blockquote><blockquote><em> - name: dbench</em></blockquote><blockquote><em> image: sotoaster/dbench:latest</em></blockquote><blockquote><em> imagePullPolicy: IfNotPresent</em></blockquote><blockquote><em> env:</em></blockquote><blockquote><em> - name: DBENCH_MOUNTPOINT</em></blockquote><blockquote><em> value: /data</em></blockquote><blockquote><em> - name: FIO_SIZE</em></blockquote><blockquote><em> value: 1G</em></blockquote><blockquote><em> volumeMounts:</em></blockquote><blockquote><em> - name: dbench-pv</em></blockquote><blockquote><em> mountPath: /data</em></blockquote><blockquote><em> restartPolicy: Never</em></blockquote><blockquote><em> volumes:</em></blockquote><blockquote><em> - name: dbench-pv</em></blockquote><blockquote><em> persistentVolumeClaim:</em></blockquote><blockquote><em> claimName: dbench-linstor</em></blockquote><blockquote><em> backoffLimit: 4</em></blockquote><blockquote><em>EOF</em></blockquote>Подождем готовности пода задания, а потом проверим логи:<blockquote><em>kubectl logs -f $(kubectl get pods | awk '/dbench/ {print $1;exit}')</em></blockquote>В итоге получится что-то вроде этого:<blockquote><em>==================</em></blockquote><blockquote><em>= Dbench Summary =</em></blockquote><blockquote><em>==================</em></blockquote><blockquote><em>Random Read/Write IOPS: 7495/4468. BW: 300MiB/s / 68.4MiB/s</em></blockquote><blockquote><em>Average Latency (usec) Read/Write: 945.99/</em></blockquote><blockquote><em>Sequential Read/Write: 301MiB/s / 62.6MiB/s</em></blockquote><blockquote><em>Mixed Random Read/Write IOPS: 7214/2401</em></blockquote>В моем случае все показатели идентичны тестированию диска напрямую, кроме скорости записи - она ниже из-за репликации и VPN-шифрования. Иначе бы и эти цифры совпали. У Linstor и правда нет издержек, и это круто.<h2>Заключение</h2>
12
<blockquote><em>cat <<EOF | kubectl apply -f -</em></blockquote><blockquote><em>apiVersion: v1</em></blockquote><blockquote><em>kind: PersistentVolumeClaim</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: test-pvc</em></blockquote><blockquote><em>spec:</em></blockquote><blockquote><em> storageClassName: linstor</em></blockquote><blockquote><em> accessModes:</em></blockquote><blockquote><em> - ReadWriteOnce</em></blockquote><blockquote><em> resources:</em></blockquote><blockquote><em> requests:</em></blockquote><blockquote><em> storage: 1Gi</em></blockquote><blockquote><em>EOF</em></blockquote><blockquote><em>kubectl get pvc</em></blockquote>Если все нормально, через несколько секунд мы увидим, что pvc привязан (bound):<blockquote><em>NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE</em></blockquote><blockquote><em>test-pvc Bound pvc-af6991ee-b922-11e9-bbca-9600002d2434 1Gi RWO linstor 10s</em></blockquote>Проверим, как дела на контроллере в Linstor:<blockquote><em>linstor volume list</em></blockquote>Получится что-то вроде этого:Заодно уже прогоним простой бенчмарк и посмотрим на производительность, создав pvc и задание:<blockquote><em>cat <<EOF | kubectl apply -f -</em></blockquote><blockquote><em>kind: PersistentVolumeClaim</em></blockquote><blockquote><em>apiVersion: v1</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: dbench-linstor</em></blockquote><blockquote><em>spec:</em></blockquote><blockquote><em> storageClassName: linstor</em></blockquote><blockquote><em> accessModes:</em></blockquote><blockquote><em> - ReadWriteOnce</em></blockquote><blockquote><em> resources:</em></blockquote><blockquote><em> requests:</em></blockquote><blockquote><em> storage: 5Gi</em></blockquote><blockquote><em>---</em></blockquote><blockquote><em>apiVersion: batch/v1</em></blockquote><blockquote><em>kind: Job</em></blockquote><blockquote><em>metadata:</em></blockquote><blockquote><em> name: dbench-linstor</em></blockquote><blockquote><em>spec:</em></blockquote><blockquote><em> template:</em></blockquote><blockquote><em> spec:</em></blockquote><blockquote><em> containers:</em></blockquote><blockquote><em> - name: dbench</em></blockquote><blockquote><em> image: sotoaster/dbench:latest</em></blockquote><blockquote><em> imagePullPolicy: IfNotPresent</em></blockquote><blockquote><em> env:</em></blockquote><blockquote><em> - name: DBENCH_MOUNTPOINT</em></blockquote><blockquote><em> value: /data</em></blockquote><blockquote><em> - name: FIO_SIZE</em></blockquote><blockquote><em> value: 1G</em></blockquote><blockquote><em> volumeMounts:</em></blockquote><blockquote><em> - name: dbench-pv</em></blockquote><blockquote><em> mountPath: /data</em></blockquote><blockquote><em> restartPolicy: Never</em></blockquote><blockquote><em> volumes:</em></blockquote><blockquote><em> - name: dbench-pv</em></blockquote><blockquote><em> persistentVolumeClaim:</em></blockquote><blockquote><em> claimName: dbench-linstor</em></blockquote><blockquote><em> backoffLimit: 4</em></blockquote><blockquote><em>EOF</em></blockquote>Подождем готовности пода задания, а потом проверим логи:<blockquote><em>kubectl logs -f $(kubectl get pods | awk '/dbench/ {print $1;exit}')</em></blockquote>В итоге получится что-то вроде этого:<blockquote><em>==================</em></blockquote><blockquote><em>= Dbench Summary =</em></blockquote><blockquote><em>==================</em></blockquote><blockquote><em>Random Read/Write IOPS: 7495/4468. BW: 300MiB/s / 68.4MiB/s</em></blockquote><blockquote><em>Average Latency (usec) Read/Write: 945.99/</em></blockquote><blockquote><em>Sequential Read/Write: 301MiB/s / 62.6MiB/s</em></blockquote><blockquote><em>Mixed Random Read/Write IOPS: 7214/2401</em></blockquote>В моем случае все показатели идентичны тестированию диска напрямую, кроме скорости записи - она ниже из-за репликации и VPN-шифрования. Иначе бы и эти цифры совпали. У Linstor и правда нет издержек, и это круто.<h2>Заключение</h2>
13
Настраивать Linstor, может, и посложнее, чем применить пару yaml, как у конкурентов, зато это совсем не сложно и можно автоматизировать с помощью Ansible или чего-то похожего. Пока увидел только одну проблему, но и она исправлена. Надеюсь, других не найду. Я по-прежнему мечтаю использовать самоуправляемый Kubernetes вместо Heroku. Надеюсь, этот пост показался вам полезным и сэкономил время.
13
Настраивать Linstor, может, и посложнее, чем применить пару yaml, как у конкурентов, зато это совсем не сложно и можно автоматизировать с помощью Ansible или чего-то похожего. Пока увидел только одну проблему, но и она исправлена. Надеюсь, других не найду. Я по-прежнему мечтаю использовать самоуправляемый Kubernetes вместо Heroku. Надеюсь, этот пост показался вам полезным и сэкономил время.