Kubernetes 共享临时存储来异步上传文件

Posted

技术标签:

【中文标题】Kubernetes 共享临时存储来异步上传文件【英文标题】:Kubernetes share temporary storage to upload file async 【发布时间】:2021-08-11 04:21:53 【问题描述】:

在this post 和this 之后,这是我的情况: 用户将图像上传到我的后端,设置如下:LB -> nginx Ingress Controller -> Django (Uwsgi)。图像最终将被上传到对象存储。因此,Django 将临时将图像写入磁盘,然后将上传任务委托给异步服务 (DjangoQ),因为上传到对象存储可能会很耗时。这里有一个问题:由于我的 Django 副本和 DjangoQ 副本都是独立的 pod,因此该文件在 DjangoQ pod 中不可用。像往常一样,任务队列由 redis 代理管理,任何随机的 DjangoQ pod 都可以使用该任务。我需要一种方法来与 DjangoQ 共享 Django 创建的磁盘文件。

上面提到的帖子基本上提到了两个解决方案: - 解决方案 1:NFS 将磁盘挂载到所有 pod 上。这似乎有点过头了,因为共享卷只存储文件几秒钟,直到上传到对象存储完成。 - 解决方案 2:Django 服务应该通过 API 使文件可用,DjangoQ 将使用该 API 从另一个 pod 访问文件。这看起来不错,但我不知道如何继续......我是否应该创建第二个 Django/uwsgi 应用程序作为侧容器,它会监听另一个端口并发送带有文件的 HTTPResponse?文件可以流式传输吗?

【问题讨论】:

【参考方案1】:

第三种选择:根本不通过您的应用移动文件数据。让用户将其直接上传到对象存储。这通常意味着创建一个 API,该 API 返回一个在几分钟内有效的预签名上传 URL,用户上传文件,然后再次调用以通知您上传已完成。然后你的异步任务可以下载它并做任何事情。

否则你有两个正确的选择。对于选项 2,内部 Minio 服务器很常见,因为再次,Django 为大文件 blob 提供服务非常慢。

【讨论】:

哇不知道。您的第三个选项常见吗?这实际上非常棒,因为我将后端完全从这一步中卸载,因为它实际上是一个冗余的中间体。我已经将所有文件处理移至客户端。 是的,很常见。几乎所有对象存储工具都支持预签名的上传 URL 正是因为这个原因:)

以上是关于Kubernetes 共享临时存储来异步上传文件的主要内容,如果未能解决你的问题,请参考以下文章

Java异步调用实现并发上传下载SMB共享文件

[K8s]Kubernetes-存储(上)

Kubernetes存储

2.2.2解决方案压缩文件异机备份到PC2(局域网共享与FTP上传下载)

kubernetes之K8s核心原理--第二篇

云原生 | Kubernetes篇Kubernetes(k8s)临时存储