4

对于我认为我的项目应该发生的事情,我有这个想法,但我想先检查一下,看看这是否在理论上有效。基本上,我正在开发一个在 Kubernetes 上运行的 Django 站点,但是对于我应该设置我的 replicationSet/statefulSet 以管理上传的内容(图像)的方式有点挣扎。

我最大的担忧是试图找出如何扩展和维护上传的内容。我的第一个想法是我需要有一个将这些文件写入其中的卷,但是我可以在扩展时让多个 pod 以这种方式写入同一个卷吗?

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

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

4

3 回答 3

4

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

牢记以上所有内容,并清楚地了解您需要将应用程序与区域设置存储的概念分离,特别是如果您想让它尽可能地无状态(无论这对您意味着什么),拥有您的 Web 应用程序,被打包为 docker 容器并作为 pod 部署在 kubernetes 集群中 - 将文件保存到本地存储不会有任何进展,因为每个 pod、每个 docker 容器都将使用底层的 kubernetes worker (vm) 存储来保存文件,因此另一个实例将在其他一些虚拟机等上保存文件等。

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

长话短说,

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

2)您可以“外包”这个需要共享一个公共本地存储给一些外部提供商,例如一个常见的案例使用一个 S3 存储桶,而不是解决 kubernetes 上的问题 - 只需在 kubernetes 中保留和配置应用程序。

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

于 2018-04-05T18:39:04.993 回答
1

注意:Kubernetes 1.14现在(2019 年 3 月)附带 Durable Local Storage Management 现在是 GA,其中:

  • 使本地连接(非网络连接)存储可用作持久卷源。
  • 允许用户利用持久性本地存储 kubernetes/kubernetes:#73525#74391#74769 kubernetes/enhancements:#121 ( kep )通常更便宜和改进的性能

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

正如x-yuri评论中指出的那样:
查看更多来自Michelle Au (Google)、Matt Schallert (Uber)、Celina Ward (Uber) 的“ Kubernetes 1.14: Local Persistent Volumes GA ” 。

于 2019-03-29T19:40:46.243 回答
0

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

在同一个 pod 中使用此图像https://hub.docker.com/r/ipfs/go-ipfs/创建一个容器,您可以将其引用为“localhost”

于 2019-09-23T23:29:37.880 回答