我对云开发有点陌生,所以请放轻松。我什至不确定我要问的事情是可能的。

我试图弄清楚如何安排一个工作(可能每个小时或两个小时)以执行将打包在自定义Docker镜像中的工作进程。工作进程将通过连接到应用程序的数据存储来检查它是否需要执行(根据应用程序用户的请求)执行的任何“计划工作”,然后执行所有未完成的工作。完成后,我希望一切都拆除,直到下一个计划间隔,因此在停机期间我不会承担任何费用。

一种复杂的情况是计划的工作将是不同的类型。理想情况下,我想为每种类型增加一个图像实例,并将该类型传递到工作进程中,以便它知道它正在处理哪种类型的计划工作。一旦完成了预定的工作类型,即使其他容器仍在运行其预定的工作,它也可以退出。

要求摘要

  • 完全控制Docker镜像。我有一些自定义工具和代码,需要在图片中放入。
  • 基于时间的计划,以鼓励执行Docker镜像中的代码。
  • 计划的工作执行可能需要一些时间(最多可能需要10或15分钟)才能完成。
  • 以编程方式控制的自定义缩放和分区,创建了x个Docker容器,每个容器都有自己的预定工作类型。 x的确定将基于应用程序数据存储中的数据。
  • 在停机期间,绝对不会产生任何费用。

  • 我尝试过/考虑过的事情

    K8s

    似乎要求集群始终运行。我也不清楚在集群中如何有不同的节点来负责不同类型的计划工作。

    AppEngine和Cloud Scheduler

    由于我定制的Docker镜像,我需要使用Flexible环境。根据this的说法,这意味着我必须始终保持至少一个实例运行。

    同样,我不确定如何缩放它,以使不同的实例处理不同类型的计划工作。

    问题

    因此,我对所有这些都有一些疑问:
  • 首先,对于GCP,这是否可能?到目前为止,我的研究表明事实并非如此。
  • 什么是尽可能满足我的要求的最佳方法?
  • 最佳答案

    原则上,工作量非常适合Kubernetes。您可以设置一个Kubernetes CronJob每小时运行一次各种 worker 。您将为每种工作负载创建一个具有单独的环境变量或命令行参数的单独的CronJob;如果您具有Docker镜像注册表(例如GCR),则可以运行任何自定义构建的Docker镜像。

    这里的一个技巧是,您正在谈论上下扩展容器,但是在GKE上,您需要为节点付费。在GKE中,cluster autoscaler将自动为您创建和删除节点。 The FAQ听起来像快速扩展比扩展更重要,因为a target具有足够的容量以在60秒内启动所有内容。 It will scale down nodes that are less than 50% in use for 10 minutes

    如果计划的作业占总工作量的很大一部分,那么这可能会导致节点的旋转和旋转(平均利用率约为50%),并且每小时都有新的增长。事实证明,这也可以满足您的计费要求(或者至少比始终保持整个集群运行更好)。 GKE pricing documentation说:



    如果成本是主要驱动因素,那么最佳的情况就是您永远不会有空闲节点。解决此问题的最直接方法是为每个任务启动专用的GCE实例,然后在任务完成时销毁它。 GCE对indirectly running containers on instances的支持很适合您的任务;您必须提供自己的工作计划程序,并使其能够购买和终止GCE实例。然后,这就是您要花多少钱来开发定制解决方案,以及要花多少钱在云资源上的折衷方案。

    09-04 16:03
    查看更多