Комментарии 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 последний под?
Как мигрировать данные между разными StorageClass в Kubernetes и зачем это делать