代码之家  ›  专栏  ›  技术社区  ›  ThatCampbellKid

Kubernetes:管理上载的用户内容

  •  4
  • ThatCampbellKid  · 技术社区  · 7 年前

    我对我的项目应该怎么做有这个想法,但我想先检查一下,看看这在理论层面上是否可行。基本上,我是在一个运行于Kubernetes上的Django站点上工作,但对于应该如何设置replicationSet/statefulSet来管理上传的内容(图像),我有点挣扎。

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

    据我所知,这似乎不是那么回事。听起来更像是每个pod,或者至少每个节点都有自己的卷。但是,对图像的请求是否会到达存储该图像的卷?或者我应该创建一个定制的后端程序来移动东西,以便像其他静态内容一样从NGINX服务器提供服务?

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

    3 回复  |  直到 7 年前
        1
  •  4
  •   javapapo    7 年前

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

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

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

    长话短说,

    1) 如果kubernetes集群支持,则可以部署应用程序/pod和持久卷声明。现在的情况是,您可以将某种文件夹/存储装载到pod中,这些文件夹/存储将由集群可用的任何东西(某种NFS存储)进行备份。 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

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

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

        2
  •  1
  •   VonC    3 年前

    注: Kubernetes 1.14 现在(2019年3月)提供了持久的本地存储管理,现在是GA,它:

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

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

    如所述 x-yuri 在里面 the comments :
    使用“查看更多信息” Kubernetes 1.14: Local Persistent Volumes GA “,发件人 Michelle Au (谷歌), Matt Schallert (优步), Celina Ward (优步)。

        3
  •  0
  •   Diego Alejandro Bermudez    5 年前

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

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