【发布时间】:2017-03-28 04:39:22
【问题描述】:
我正在开发一个将在 Google Container Engine (Kubernetes) 上运行的计算框架。
期望的行为是用户将提供一个要执行的容器(这是用户有效负载,我们可以这样做,因为用户很少且受信任)。用户容器会预先上传到注册表。
当框架运行时,它将启动许多工作人员(每个工作人员在一个 pod 上,监听一个 celery 队列),一个主节点将加载一堆参数以传递给工作人员(通过 celery/rabbitmq)。
当工作人员运行时,它将执行 3 件事(针对每个工作项):
-
SET UP:worker 会从谷歌云存储和其他地方复制文件和配置。这些文件将被放置在 pod 的卷中。 -
EXECUTION:worker 应该从注册表中下载用户容器并运行它。我还想从容器的进程中捕获stdout和stderr,如果可能的话,添加一个截止日期(如果容器在 X 秒内没有完成执行,则停止)。用户容器会将其结果生成为卷目录中的文件。 -
CLEAN UP and REPORTING:宿主 pod 会将用户容器生成的一些工件复制回谷歌云。其他结果将报告给专有应用程序。
我希望框架对用户不可见(因为我们不想与他们共享凭据并阻止他们拥有任何任务管理逻辑)。
由于主机本身就是一个容器,因此还没有找到实现此目的的好方法(在另一个容器中运行的脚本中拉取并运行一个容器)。
这可以在 Kubernetes 中实现吗?是否有任何文档或项目做类似的事情?而且,这种方法有什么缺陷吗?
谢谢!
【问题讨论】:
-
我的理解是,您想让一个 pod 启动另一个 pod?
-
@Frap 不是 pod,而是从原始 pod 中运行容器(使用用户提供的代码)并等待它退出。在 pod 中的容器(框架)内运行的容器(用户)。
-
这对我来说似乎是一个完全的反模式。 Kubernetes 旨在抽象出单个容器的概念。您可能可以使用 init 容器和新的 cron 作业资源做您想做的事情,或者可能在 docker 的东西中做一些 docker,但我认为您可能需要重新考虑您正在尝试做的事情。
标签: docker kubernetes google-kubernetes-engine