Kubernetes:管理上传的用户内容

Kubernetes: Managing uploaded user content

我对我认为我的项目应该发生的事情有这个想法,但我想先检查一下这是否在理论上可行。基本上,我在 Kubernetes 上 运行 的 Django 网站上工作,但我对应该以哪种方式设置 replicationSet/statefulSet 来管理上传的内容(图像)感到有些挣扎。

我最关心的是试图找出如何扩展和维护上传的内容。我的第一个想法是我需要一个单独的卷来写入这些文件,但是我可以在缩放时以这种方式将多个 pods 写入同一个卷吗?

根据我收集到的信息,它似乎不是那样工作的。听起来更像是每个 pod,或者至少每个节点,都有自己的卷。但是对图像的请求会达到存储它的卷吗?或者我应该创建一个自定义后端程序来移动内容,以便它像我的其他静态内容一样由 NGINX 服务器提供?

仅供参考 - 这是我的第一个可扩展项目大声笑。但我真的只是想找到管理上传的最佳方式……或者一般的方式。我将不胜感激任何关于这样的事情如何运作的解释、想法或精美的图表!

你好,我认为你应该稍微忘记 kubernetes,想想你的 Django 应用程序的架构和功能。我猜你已经构建了一个 Web 应用程序,它提供了一些 'upload image' 功能,然后你在某处编写了 'stores' 此图像的代码。在非常简单的情况下,如果您 运行 您笔记本电脑上的应用程序,即您的 Web 应用程序,配置为将此内容保存到本地文件夹,更高级的示例是您将应用程序部署到 VM 或云vm 例如 AWS EC2 实例,您的应用程序将文件保存到此 EC2 实例的本地存储中。问题是双重的——如果我们部署了你的 web 应用程序的 2 个实例会发生什么——可以配置和 运行 - 以便它们 'share' 相同的文件夹来保存图像吗?我想这就是你想要的,否则你的应用程序不会水平扩展,每个用户都必须点击每个单独的实例 - 以便上传或检索特定图像。因此,请记住这是您的应用程序的设计决定,我很确定您已经解决了,您需要思考 - 我如何共享文件夹?一个桶,以便我的网络应用程序的所有实例都可以保存文件?如果您在任何云上旋转 3 个不同的虚拟机,则必须使用某种类型的云存储,以便所有三个实例都指向相同的物理存储位置或 NFS 驱动器,或者您可以将数据保存到云存储服务S3!

牢记以上所有内容,并清楚地了解您需要将您的应用程序与语言环境存储的概念分离,尤其是如果您想让它尽可能地无状态(无论这对您意味着什么),具有您的 Web 应用程序被打包为 docker 容器并作为 pod 部署在 kubernetes 集群中 - 将文件保存到本地存储不会走得太远,因为每个 pod,每个 docker容器将使用底层 kubernetes worker (vm) 存储来保存文件,因此另一个实例将在其他一些 vm 等上保存文件。

Kubernetes 为想要在 kubernetes 集群中 'share' 的应用程序(pods)提供了这种抽象,一些本地存储,当然还有持久化。我没有在上面添加的是 pod 和 worker 存储(意味着如果你将文件保存在 kubernetes worker 或 pod 中)一旦这个虚拟机/实例重新启动,你将丢失你的数据。所以你想要耐用的东西。

长话短说,

1) 假设您的 kubernetes 集群支持它,您可以将您的应用程序/pod 与 Persistent Volume Claim 一起部署。正在发生的事情是,您可以将某种文件夹/存储挂载到您的 pod,这些文件夹/存储将由您的集群可用的任何内容(某种 NFS 存储)进行备份。 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

2) 您可以 'outsource' 这需要与某些外部提供商共享公共本地存储,例如,常见情况使用 S3 存储桶,而不是解决 kubernetes 上的问题 - 只需保留并配置应用程序在 kubernetes 中。

我希望我给了你一些基本的想法。

注意:Kubernetes 1.14现在(2019 年 3 月)随附持久本地存储管理现已正式发布,其中:

  • 使本地附加(非网络附加)存储可用作持久卷源。
  • 允许用户利用持久性本地存储通常更便宜且性能更高的优势kubernetes/kubernetes:#73525, #74391, #74769 kubernetes/enhancements: #121 (kep)

这可能有助于为您的案例确保真正持久的存储。

x-yuri in 所述:
使用“Kubernetes 1.14: Local Persistent Volumes GA", from Michelle Au (Google), Matt Schallert (Uber), Celina Ward(优步)查看更多信息。

你可以使用 ipfs https://pypi.org/project/django-ipfs-storage/

在您可以引用为 'localhost'

的同一个 pod 中使用此图像 https://hub.docker.com/r/ipfs/go-ipfs/ 创建一个容器