Kubernetes:管理上传的用户内容

4
我有一个想法,关于我认为应该在我的项目中发生的事情,但是我想先在理论层面上检查一下这是否可行。基本上,我正在开发一个运行在Kubernetes上的Django网站,但是我对如何设置我的复制集/有状态集来管理上传的内容(图片)感到有些困惑。
我最大的担忧是如何扩展和维护上传的内容。我的第一个想法是我需要有一个单独的卷来存储这些文件,但是在扩展时,多个Pod能否同时写入同一个卷?
根据我所了解的,似乎不是这样工作的。听起来更像是每个Pod,或至少每个节点,都会有自己的卷。但是请求图像时,图像是否可以从存储它的卷中获取?或者我应该创建一个自定义后端程序来移动文件,以便像我的其他静态内容一样通过NGINX服务器提供服务?
FYI-这是我的第一个可扩展项目lol。但我真的只是试图找到管理上传的最佳方式...或者总之一种方法。我将非常感激任何关于如何使这样的东西工作的解释、想法或花哨的图表!
3个回答

4

你好,我认为你应该暂时放下 Kubernetes,考虑一下你的 Django 应用程序的架构和能力。我猜你已经构建了一个 Web 应用程序,提供了一些“上传图像”的功能,然后你编写了代码来“存储”这些图像。在非常简单的情况下,如果你在笔记本电脑上运行你的应用程序,那么你的 Web 应用程序被配置为将这些内容保存到本地文件夹中,更高级的例子是,你将你的应用程序部署到虚拟机或云虚拟机(例如 AWS EC2 实例),你的应用程序将文件保存到该 EC2 实例的本地存储中。问题有两个方面——如果我们部署了 2 个实例的 Web 应用程序,它们可以被配置和运行,以便它们“共享”相同的文件夹来保存图像吗?我想这就是你想要的,否则你的应用程序就无法横向扩展,每个用户都必须访问每个单独的实例,以上传或检索特定的图像。因此,在考虑到这一点的基础上,这是你的应用程序的设计决策,我相信你已经解决了这个问题,那么你需要考虑——如何共享一个文件夹?一个存储桶,以便我 Web 应用程序的所有实例都可以保存文件?如果你在任何云上启动了 3 个不同的虚拟机,你将不得不使用某种云存储,以便所有三个实例指向相同的物理存储位置,或者使用 NFS 驱动器,或者你可以将数据保存到云存储服务 S3!
考虑到以上所有因素,并清楚地了解到,如果您想使应用程序尽可能无状态(无论这对您意味着什么),则需要将应用程序与本地存储的概念分离。如果您的Web应用程序已打包为Docker容器并在Kubernetes集群中部署为Pod,则保存文件到本地存储将无法推进任何进展,因为每个Pod、每个Docker容器都将使用基础Kubernetes工作程序(VM)存储来保存文件,因此另一个实例将在其他VM上保存文件等等。
Kubernetes为希望在Kubernetes集群内“共享”某些本地存储并当然要持久化的应用程序(Pod)提供了这种抽象。我没有在上面添加的一些内容是,Pod和工作程序存储(即如果您在Kubernetes工作程序或Pod中保存文件)一旦重启此VM /实例,您将丢失数据。所以你需要一些持久性。
长话短说,

1) 您可以选择在 Kubernetes 集群支持的情况下,将您的应用程序 / Pod 与 Persistent Volume Claim 一起部署。这样做的作用是,您可以将某种文件夹 / 存储挂载到您的 Pod 上,该存储将由集群中可用的任何内容支持 - 某种 NFS 存储。https://kubernetes.io/docs/concepts/storage/persistent-volumes/

2) 您可以将共享公共本地存储的需求外包给某个外部提供商,例如常见的情况使用 S3 存储桶,并不涉及 Kubernetes 中的问题 - 只需在 Kubernetes 中保留并配置应用程序。

我希望我给您提供了一些基本的想法。


谢谢!哈哈,我甚至没有想过使用云存储服务。有趣的是,我甚至还没有构建那个功能(事后想法)。所以你认为挂载一个临时卷来处理图像,然后在调整大小和修改后将它们推送到存储中会起作用吗? - ThatCampbellKid
你可以随时使用 pods 的本地存储,这对于某些测试或早期版本是可用的。但是请记住,一旦 pod 重新启动或新版本上线,存储将被清除,你需要重新开始 :) - javapapo

1
注意:Kubernetes 1.14现在(2019年3月)已经支持耐用本地存储管理,现在是GA版本,它可以:
  • 将本地附加(非网络附加)存储作为持久卷源可用。
  • 允许用户利用通常更便宜和性能更好的持久本地存储kubernetes/kubernetes: #73525, #74391, #74769 kubernetes/enhancements: #121 (kep)
这可能有助于为您的情况提供真正持久的存储。

x-yuri评论中所述:
请查看Kubernetes 1.14:本地持久卷GA,来自Michelle Au(Google),Matt Schallert(Uber),Celina Ward(Uber)。


我认为以下这篇博客文章与这里相关。但我不确定local卷是否适合存储用户上传的文件。 - x-yuri
@x-yuri 谢谢。我已经将您的评论包含在答案中,以增加其可见性。 - VonC

0

1
欢迎来到SO。虽然链接可能回答了问题,但如果您能在这里分享详细信息会更好。 - Karthick Ramesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接