Как стать автором
Обновить

Как мигрировать данные между разными StorageClass в Kubernetes и зачем это делать

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров3.7K
Всего голосов 27: ↑27 и ↓0+34
Комментарии4

Комментарии 4

Спасибо большое за статью!
Открыл для себя такие отличные утилиты, как pv-migrate/pv-rename.

Добавил бы еще, что так как pv-migrate выполняет rsync, то для уменьшения времени простоя, для больших pvc можно выполнить несколько итераций.
Сначала "прогнать" pv-migrate несколько раз с ключами --ignore-mounted --source-mount-read-only=false --dest-delete-extraneous-files при рабочем исходном поде (первый проход может занять много времени, если данных сотни гигабайт). Потом сделать бэкап манифеста пода и удалить под. Прогнать pv-migrate еще раз, "начисто". После чего переименовать pvc и восстановить бэкап манифеста пода, он подключит новую pv.

Почему --source-mount-read-only=false ? Если опции монтирования исходного пода и пода-мигратора различаются (pv-migrate создает под, в который подключает 2 вольюма, и между ними копирует данные), то мультимаунт вольюма для некоторых CSI провайдеров не срабатывает и под мигратора не запускается.

Mounting arguments: -t ext4 -o _netdev,ro /dev/drbd1010 /var/lib/kubelet/pods/7894f1d9-cb3b-4caa-b5dd-94ed94363458/volumes/kubernetes.io~csi/pvc-8e6c39d5-30fd-4a01-9867-64d152abe597//dev/drbd1010 already mounted on /var/lib/kubelet/pods/ee7487b4-dc5c-4d40-b89d-df2396e8bff8/volumes/kubernetes.io~csi/pvc-8e6c39d5-30fd-4a01-9867-64d152abe597/mount.

Вам спасибо, что применили мой опыт из статьи и дополнили своим

Контроллер StatefulSet не будет поднимать удалённый под заново, и мы сможем изменить PVC. После этого вернём StatefulSet на место, не забыв изменить StorageClass или размер дисков в сохраненном манифесте StatefulSet.

В итоге на протяжении всего времени работ у нас были доступны две реплики из трёх. Таким образом удалось мигрировать без простоя сервиса.

Вы тут оставили за кадром, что происходит с PV, когда мы накатываем подредактированный манифест sts. Кластер видит что два пода из трёх есть, но те два что есть не с тем StorageClass что в манифесте sts, и 1) создаёт новый pv для всех троих в новом SC, отсутствующий под, ждёт когда он выйдет в ready 1/1, 2) перезапускает с новым pv один из других подов, ждёт от него ready 1/1, 3) перезапускает с новым pv последний под?

Контроллер смотрит наличие PVC - если она есть, монтирует её, не проверяя прочие условия. Если её нет - создает с тем StorageClass, что указан в манифесте

Зарегистрируйтесь на Хабре, чтобы оставить комментарий