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, что и ноды |
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: pvc-app-a-evsnamespace: <ns>annotations:everest.io/disk-volume-type: SSD # SAS | SSD | GPSSD | ESSDfailure-domain.beta.kubernetes.io/zone: <az> # AZ, где будут работать подыspec:accessModes:- ReadWriteOnce # только RWOresources:requests:storage: 100Gi # реальная емкость, минимум 10GistorageClassName: csi-disk
Для StatefulSet используйте volumeClaimTemplates, каждая реплика получает свой том:
volumeClaimTemplates:- metadata:name: dataannotations:everest.io/disk-volume-type: SSDspec:accessModes:- ReadWriteOnceresources:requests:storage: 100GistorageClassName: csi-disk
Миграция возможна только с простоем, так как невозможно смонтировать два тома в один под, если 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=0kubectl wait --for=delete pod -l app=<app> -n <ns> --timeout=300skubectl 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 и при необходимости создайте его.