【问题标题】:Docker as "Function" (Create a Docker per request)Docker 作为“功能”(根据请求创建一个 Docker)
【发布时间】:2019-03-13 21:34:29
【问题描述】:

有没有一种简单的方法可以为每个请求创建一个 docker 容器的 istance?

我有一个 Docker 容器,它需要很长时间来计算数学算法。运行时,不能并行处理其他请求。 Lambda Functions 会是最好的解决方案,但容器需要下载超过 1GB 的数据,并且需要至少 10 个内核和 5GB 内存才能执行,因此 Lambda 成本太高。

我们有一个大型集群(1000 个内核,0.5TB RAM),我正在考虑使用 NGINX 负载均衡器或 Kubernetes 裸机。 是否可以配置为每个请求创建一个实例(类似于 Lambda 函数)?

【问题讨论】:

    标签: docker nginx docker-swarm


    【解决方案1】:

    Airflow 或 Argo 等工具专为这些事情而设计。

    基本上,您可以创建一个 DAG,它将非常像作为服务的函数运行,但可以在您想要的任何自定义 docker 容器上运行。

    【讨论】:

    • 我的 docker 容器公开了一个公共 API。我仍然可以使用单个容器使用 DAG,还是需要创建一种 API 网关,然后使用 DAG 为每个请求创建一个容器?
    • 如果您通过 kubernetes 运行它,您可以启动 pod 而不仅仅是单个容器,因此您可以将 apl 作为 sidecar 运行
    【解决方案2】:

    您可能需要将 HTTP 服务与后端处理分离。如果作业需要几分钟或更长时间才能运行,大多数浏览器和其他 HTTP 客户端将在它完成之前超时,因此它的 HTTP 端需要以某种方式启动作业并立即返回某种成功消息。

    完成此操作后,您可能会发现像 RabbitMQ 这样的作业队列是一项有用的基础架构技术。同样,这将作业队列与实际运行它们的机制分离。在 Docker/Kubernetes 空间中,你会启动一些持久的工作人员,它们都在听队列并按照它出现在那里的方式工作。您不一定会为每个工作启动一名工人;或者您可能只有一个启动其他 Docker 容器或 Kubernetes 作业的工作人员;但如果工作积压的时间太长,您可以启动额外的工作人员。

    在纯 Docker 空间中,理论上可以使用 Docker API 来启动其他容器。但是,这样做会使您的进程对主机具有无限的根级别访问权限;如果您在 HTTP 服务器的上下文中运行它,则需要非常小心安全注意事项。 Kubernetes 也有一个 API,从安全的角度来看,这可能更好:您可以设置一个服务帐户,该帐户仅具有启动作业的权限,并为每个到达的入站作业启动一个作业。 (安全性仍然很重要,但恶意输入要 root 主机要困难得多。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多