gsutil rsync из корзины GCP в постоянный том Kubernetes использует больше дискового пространства, чем следовало бы

У меня есть папка корзины в Google Cloud с примерно 47GB данными. Я запускаю новый Kubernetes StatefulSet (в моем кластере Google Cloud Kubernetes). Первое, что делает контейнер внутри StatefulSet, - это использует gsutil -m rsync -r gs://<BUCKET_PATH> <LOCAL_MOUNT_PATH> для синхронизации содержимого папки корзины с локально смонтированной папкой, которая соответствует постоянному тому Kubernetes. Заявление о постоянном томе для этого StatefulSet запрашивает 125Gi хранилища и используется только для этого rsync. Но синхронизация gsutil в конечном итоге задевает стену, когда на модуле заканчивается дисковое пространство (пространство в постоянном томе), и gsutil выдает ошибку: [Errno 28] No space left on device. Это странно, потому что мне нужно только скопировать 47GB данных из корзины, но постоянный том должен иметь 125Gi доступного хранилища.

Я могу подтвердить, что заявка на постоянный том и постоянный том были предоставлены с соответствующими размерами, используя kubectl get pvc и kubectl get pv. Если я запустил df -h внутри модуля (kubectl exec -it <POD_NAME> -- df -h), я смогу увидеть, что смонтированный путь существует и имеет ожидаемый размер (125Gi). Используя df -h во время синхронизации, я вижу, что он действительно занимает все доступное пространство в постоянном томе, когда наконец достигает No space left on device.

Кроме того, если я инициализирую постоянный том 200Gi и повторяю попытку синхронизации, она завершается успешно, и df -h показывает, что использованное пространство в постоянном томе составляет 47GB, как и ожидалось (это происходит после завершения gsutil rsync).

Похоже, что gsutil rsync использует гораздо больше места при синхронизации, чем я ожидал. Почему это? Есть ли способ изменить способ gsutil rsync, чтобы не требовался постоянный том большего размера, чем необходимо?

Следует отметить, что существует много отдельных файлов, и что модуль перезапускается примерно 8 раз во время синхронизации.


person Spencer    schedule 14.08.2020    source источник


Ответы (1)


rsync сначала перенесет содержимое во временный файл в целевой папке. Если это удастся, он переименует файл, чтобы он стал целевым файлом. Если передача не удалась, временный файл будет удален. Вы можете попробовать добавить к команде флаг --inplace согласно ссылке: « Этот параметр изменяет способ передачи файла с помощью rsync, когда его данные необходимо обновить: вместо метода по умолчанию для создания новой копии файла и перемещения ее на место, когда она будет завершена, rsync вместо этого записывает обновленные данные непосредственно в файл назначения. . »

person Yanan C    schedule 25.08.2020
comment
Спасибо! Это очень помогает мне понять, что происходит. - person Spencer; 27.08.2020