从 GCP 存储桶到 Kubernetes 持久卷的 gsutil rsync 使用的磁盘 space 超出了应有的数量
gsutil rsync from GCP bucket to Kubernetes Persistent Volume uses more disk space than it should
我在 Google Cloud 中有一个存储桶文件夹,其中包含大约 47GB
的数据。我启动了一个新的 Kubernetes StatefulSet
(在我的 Google Cloud Kubernetes 集群中)。 StatefulSet
中的容器所做的第一件事是使用 gsutil -m rsync -r gs://<BUCKET_PATH> <LOCAL_MOUNT_PATH>
将存储桶文件夹内容同步到本地安装的文件夹,该文件夹对应于 Kubernetes Persistent Volume。此 StatefulSet
的持久卷声明请求 125Gi
存储,并且仅用于此 rsync
。但是 gsutil
同步最终会遇到瓶颈,其中 pod 运行s out of disk space(space in the Persistent Volume)并且 gsutil
抛出错误: [Errno 28] No space left on device
。这很奇怪,因为我只需要从存储桶中复制 47GB
数据,但持久卷应该有 125Gi
可用存储空间。
我可以确认持久卷声明,并且已使用 kubectl get pvc
和 kubectl get pv
为持久卷配置了适当的大小。如果我 运行 df -h
在 pod (kubectl exec -it <POD_NAME> -- df -h
) 内,我可以看到安装的路径存在并且它具有预期的大小 (125Gi
)。在同步期间使用 df -h
我可以看到当它最终达到 No space left on device
.
时它确实占用了 Persistent Volume 中所有可用的 space
此外,如果我提供 200Gi
的持久卷并重试同步,它会成功完成并且 df -h
显示持久卷中使用的 space 是 47GB
,符合预期(这是在 gsutil rsync
完成后)。
因此 gsutil rsync
在同步 时使用的 space 似乎比我预期的要多得多。为什么是这样?有没有办法改变 gsutil rsync
的完成方式,以便它不需要比必要更大的持久卷?
需要注意的是个别文件较多,同步过程中pod重启了8次左右
rsync
会先将内容转移到目标文件夹中的一个临时文件中。如果成功,它将重命名该文件以成为目标文件。如果传输失败,临时文件将被删除。根据 link,您可以尝试在命令中添加 --inplace
标志:“此选项会更改 rsync 在需要更新文件时传输文件的方式:而不是创建新副本的默认方法文件并在完成后将其移动到位,rsync 而是将更新后的数据直接写入目标文件。”
我在 Google Cloud 中有一个存储桶文件夹,其中包含大约 47GB
的数据。我启动了一个新的 Kubernetes StatefulSet
(在我的 Google Cloud Kubernetes 集群中)。 StatefulSet
中的容器所做的第一件事是使用 gsutil -m rsync -r gs://<BUCKET_PATH> <LOCAL_MOUNT_PATH>
将存储桶文件夹内容同步到本地安装的文件夹,该文件夹对应于 Kubernetes Persistent Volume。此 StatefulSet
的持久卷声明请求 125Gi
存储,并且仅用于此 rsync
。但是 gsutil
同步最终会遇到瓶颈,其中 pod 运行s out of disk space(space in the Persistent Volume)并且 gsutil
抛出错误: [Errno 28] No space left on device
。这很奇怪,因为我只需要从存储桶中复制 47GB
数据,但持久卷应该有 125Gi
可用存储空间。
我可以确认持久卷声明,并且已使用 kubectl get pvc
和 kubectl get pv
为持久卷配置了适当的大小。如果我 运行 df -h
在 pod (kubectl exec -it <POD_NAME> -- df -h
) 内,我可以看到安装的路径存在并且它具有预期的大小 (125Gi
)。在同步期间使用 df -h
我可以看到当它最终达到 No space left on device
.
此外,如果我提供 200Gi
的持久卷并重试同步,它会成功完成并且 df -h
显示持久卷中使用的 space 是 47GB
,符合预期(这是在 gsutil rsync
完成后)。
因此 gsutil rsync
在同步 时使用的 space 似乎比我预期的要多得多。为什么是这样?有没有办法改变 gsutil rsync
的完成方式,以便它不需要比必要更大的持久卷?
需要注意的是个别文件较多,同步过程中pod重启了8次左右
rsync
会先将内容转移到目标文件夹中的一个临时文件中。如果成功,它将重命名该文件以成为目标文件。如果传输失败,临时文件将被删除。根据 link,您可以尝试在命令中添加 --inplace
标志:“此选项会更改 rsync 在需要更新文件时传输文件的方式:而不是创建新副本的默认方法文件并在完成后将其移动到位,rsync 而是将更新后的数据直接写入目标文件。”