Kubernetes:管理上传的用户内容

时间:2018-04-05 15:59:36

标签: upload kubernetes image-uploading persistent-volumes

我有这个想法,我认为我的项目应该发生什么,但我想检查一下,看看它是否在理论层面上起作用。基本上我正在开发一个在Kubernetes上运行的Django站点,但是我正在努力设置我的replicationSet / statefulSet来管理上传的内容(图像)。

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

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

仅供参考 - 这是我的第一个可扩展项目lol。但我真的只是想找到管理上传的最佳方式......或者一般的方式。我会很感激任何关于这样的事情的解释,想法或幻想图表!

3 个答案:

答案 0 :(得分:1)

您好我认为您应该忘记kubernetes并考虑Django应用程序的体系结构和功能。我猜你已经构建了一个Web应用程序,它提供了一些“上传图像”功能,然后你就可以在某个地方“存储”这个图像。在非常简单的情况下,如果您在笔记本电脑上运行应用程序,您的Web应用程序配置为将此内容保存到本地文件夹,更高级的示例是您将应用程序部署到VM或云虚拟机,例如AWS EC2实例,您的应用程序将文件保存到此EC2实例的本地存储。问题是双重的 - 如果我们部署了2个Web应用程序实例会发生什么 - 可以配置和运行 - 以便他们“共享”相同的文件夹来保存图像吗?我想这就是你想要的,其他明智的你的应用程序不会横向扩展,每个用户都必须点击每个单独的实例 - 以便上传或检索特定的图像。因此,考虑到这是您的应用程序的设计决策,我相信您已经解决了,您需要思考 - 我如何共享文件夹?一个桶,以便我的所有Web应用程序实例都可以保存文件?如果在任何云上旋转3个不同的vms,则必须使用某种clour存储,以便所有三个实例指向相同的物理存储位置或NFS驱动器,或者您可以将数据保存到云存储服务S3!

考虑到上述所有因素,并清楚地了解您需要将应用程序与语言环境存储的概念分离,特别是如果您希望将其视为无状态(无论对您意味着什么),请使用您的Web应用程序,打包为docker容器并作为pod部署在kubernetes集群中 - 将文件保存到本地存储不会有任何进展,因为每个pod,每个docker容器将使用底层kubernetes worker(vm)存储保存文件,所以另一个实例将保存文件在其他vm等等。

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

简而言之,

1)您可以部署应用程序/ pod以及持久卷声明,假设您的kubernetes群集支持它。发生的事情是你可以在你的pod上安装某种文件夹/存储,它将由你的集群可用的任何东西备份 - 某种NFS存储。 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

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

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

答案 1 :(得分:0)

注意:Kubernetes 1.14现在(2019年3月)随附了“持久本地存储管理现在是GA”,

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

这可能有助于确保为您的案件提供真正的永久性存储。

答案 2 :(得分:0)

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

在您可以引用为“ localhost”的同一窗格中创建带有该图像https://hub.docker.com/r/ipfs/go-ipfs/的容器