Облачная платформаAdvanced

Миграция из SFS Turbo на диск EVS в кластере ССE


EVS — блочное хранилище. Диск подключается к одной ноде и монтируется в один под, что является его главным отличием от SFS Turbo и OBS. Такой вариант миграции подходит, когда исходный инстанс SFS Turbo обслуживал единственного потребителя — в таком случае сетевое хранилище избыточно, а EVS дешевле и быстрее.

Критерий выбора EVS для миграции при анализе инфраструктуры — число одновременных клиентов инстанса:

  • Один потребитель — EVS подходит.

  • Несколько подов или ВМ с общим доступом — EVS не подойдет независимо от профиля данных.

EVS подходит, когда исходный инстанс SFS Turbo использовался единственным подом или каждой реплике StatefulSet нужен собственный том (БД, очереди, брокеры, Elasticsearch). В этом случае SFS Turbo избыточен, так как EVS дешевле, дает POSIX-семантику, локальную латентность и снапшоты.

EVS не подходит при любом RWX-сценарии. Если нужен общий доступ нескольких подов, Deployment с replicas > 1, общее использование между виртуальными машинами — подходит только SFS Turbo или OBS.

Особенности EVS:

  • Access mode — ReadWriteOnce, том монтируется только одной нодой.

  • Привязка — связан с AZ, под планируется только на ноды той же AZ.

  • Емкость — жесткая, задается в PVC, расширение поддерживается, уменьшение — нет.

  • Снапшоты — поддерживаются, в отличие от SFS Turbo.

Что меняется по сравнению с SFS Turbo:

  • Режим доступа становится ReadWriteOnce — главное и необратимое отличие. Том монтируется только одной нодой одновременно.

  • Появляется жесткая квота вместо разделяемой емкости инстанса.

  • Появляются снапшоты, которых в SFS Turbo нет.

  • Исчезает конкуренция за полосу с соседями — производительность диска индивидуальна и определяется его типом и размером.

  • Появляется привязка к AZ.

Примечания:

  • RWO исключает масштабирование: Deployment с replicas > 1 не запустится. Вторая реплика зависнет в статусе «ContainerCreating» с ошибкой Multi-Attach error. Если приложение запускается более чем в одном экземпляре — EVS не подходит, нужен SFS Turbo или OBS.

  • Обновление нагрузки требует значение strategy: Recreate. При RollingUpdate примонтирование тома закончится ошибкой Multi-Attach error — самая частая ошибка при переходе с RWX на RWO.

  • Для StatefulSet используется volumeClaimTemplates — каждая реплика получает собственный диск. Это штатный и рекомендуемый сценарий для БД и брокеров. Ограничение RWO не мешает, так как тома не разделяются.

  • AZ становится ограничением планировщика. Под запустится только на ноде в той же AZ, где создан диск EVS. При отказе AZ нагрузка не переедет, в отличие от SFS Turbo, доступного из всех AZ региона в пределах VPC.

  • Емкость расширяется, но не уменьшается. Требуется значение allowVolumeExpansion: true в StorageClass. Расширение файловой системы выполняется при перезапуске пода.

  • Минимальный размер тома — 10 ГиБ, шаг выделения кратен 1 ГиБ.

Риски и рекомендации

Риск

Рекомендация

Ошибка Multi-Attach error при обновлении нагрузки.

Используйте значение strategy: Recreate для Deployment, а для StatefulSet — volumeClaimTemplates.

Невозможность масштабирования после миграции на EVS.

Проверьте на этапе анализа инфраструктуры, что нагрузка с одной репликой и останется такой.

Выход нагрузки из строя из-за отказа AZ.

Используйте снапшоты EVS, план восстановления в другой AZ или использование SFS Turbo.

Создавать диск EVS для миграции можно динамически и статически:

Способ

Как задается

Квота на том

Особенности

dynamic EVS — динамическое создание диска под каждый PVC

С помощью PVC на классе csi-disk с аннотацией everest.io/disk-volume-type (значения SAS/SSD/GPSSD/ESSD). Диск создается автоматически

Есть жесткая квота: параметр resources.requests.storage задает реальную емкость. Расширение поддерживается, уменьшение — нет

Способ полностью динамический, но утилита pvmigrate для миграции не подходит из-за смены access mode

static EVS — подключение существующего диска через PV

Через манифест PersistentVolume с драйвером disk.csi.everest.io и volumeHandle со значением ID диска

Есть квота — равна фактической емкости диска

Требует заранее созданного диска в той же AZ, что и ноды

1. Создайте PVC для EVS

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-app-a-evs
namespace: <ns>
annotations:
everest.io/disk-volume-type: SSD # SAS | SSD | GPSSD | ESSD
failure-domain.beta.kubernetes.io/zone: <az> # AZ, где будут работать поды
spec:
accessModes:
- ReadWriteOnce # только RWO
resources:
requests:
storage: 100Gi # реальная емкость, минимум 10Gi
storageClassName: csi-disk

Для StatefulSet используйте volumeClaimTemplates, каждая реплика получает свой том:

volumeClaimTemplates:
- metadata:
name: data
annotations:
everest.io/disk-volume-type: SSD
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: csi-disk

2. Мигрируйте данные

Миграция возможна только с простоем, так как невозможно смонтировать два тома в один под, если EVS уже занят:

# rsync-под: RWX-источник + RWO-приемник монтируются одновременно,
# так как исходный SFS Turbo допускает многократное монтирование
kubectl exec -n <ns> rsync-pod -- rsync -a --numeric-ids /old/ /new/
kubectl scale deploy/<app> -n <ns> --replicas=0
kubectl wait --for=delete pod -l app=<app> -n <ns> --timeout=300s
kubectl exec -n <ns> rsync-pod -- rsync -a --delete /old/ /new/
kubectl delete pod rsync-pod -n <ns> # освободить том до старта нагрузки
# правка claimName --> запуск
kubectl scale deploy/<app> -n <ns> --replicas=1
Примечание

Порядок важен: rsync-под держит том, и пока он жив, нагрузка не запустится — под зависнет в статусе «ContainerCreating» с ошибкой Multi-Attach error.

При миграции учтите:

  • Значение strategy: Recreate для Deployment.

    При RollingUpdate новый под пытается примонтировать том до остановки старого и падает с ошибкой Multi-Attach error. Это самая частая ошибка при переезде с SFS Turbo на EVS.

  • Масштабирование больше одной реплики невозможно.

    Если приложение запускается в нескольких экземплярах, EVS не подходит.

  • AZ становится ограничением планировщика.

    При недоступности AZ под не переедет на другую, в отличие от SFS Turbo, доступного из всех AZ.

  • Если в вашем кластере нет класса csi-disk, а есть только устаревшие sas / sata / ssd на flexvolume — перед использованием проверьте kubectl get sc и при необходимости создайте его.