【问题标题】:Kubernetes: Managing uploaded user contentKubernetes:管理上传的用户内容
【发布时间】:2018-09-15 12:49:11
【问题描述】:

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

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

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

仅供参考 - 这是我的第一个可扩展项目,哈哈。但我真的只是想找到管理上传的最佳方式......或者一般的方式。我会很感激任何解释、想法或花哨的图表来说明这样的事情是如何工作的!

【问题讨论】:

    标签: upload kubernetes image-uploading persistent-volumes


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!大声笑,我什至没有想到云存储服务。有趣的是,我什至还没有建立这种功能(经过深思熟虑)。那么你认为挂载一个临时卷来处理图像,然后在调整大小和修改后将它们推送到存储中是否可行?
    • 好吧,您总是可以使用pods 本地存储,它无论如何都是可用的 - 用于某种测试或早期版本......只是您始终需要记住,一旦重新启动 pod,或者新的版本已更新,存储将消失,您将从头开始 :)
    【解决方案2】:

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

    • 使本地连接(非网络连接)存储可用作持久卷源。
    • 允许用户利用持久性本地存储 kubernetes/kubernetes:#73525#74391#74769kubernetes/enhancements:#121 (kep)

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

    正如x-yurithe comments 中所指出的:
    使用“Kubernetes 1.14: Local Persistent Volumes GA”查看更多信息,来自Michelle Au (Google)、Matt Schallert (Uber)、Celina Ward (Uber)。

    【讨论】:

    • 我认为以下blog post 与此处相关。而且我不确定local 卷是否适合存储用户上传的内容。
    • @x-yuri 谢谢。我已将您的评论包含在答案中以提高知名度。
    【解决方案3】:

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

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

    【讨论】:

    • 欢迎来到 SO。虽然该链接可能会回答问题,但最好能在此处分享详细信息。
    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多