docker - Docker 作为“功能”(根据请求创建一个 Docker)
问题描述
有没有一种简单的方法可以为每个请求创建一个 docker 容器的 istance?
我有一个 Docker 容器,它需要很长时间来计算数学算法。运行时,不能并行处理其他请求。Lambda Functions 会是最好的解决方案,但是容器需要下载超过 1GB 的数据,并且需要至少 10 个内核和 5GB 内存才能执行,因此 Lambda 成本太高。
我们有一个大集群(1000 个内核,0.5TB RAM),我正在考虑使用 NGINX 负载均衡器或 Kubernetes 裸机。是否可以按照每个请求创建一个实例的方式进行配置(类似于 Lambda 函数)?
解决方案
您可能需要将 HTTP 服务与后端处理分离。如果作业需要几分钟或更长时间才能运行,大多数浏览器和其他 HTTP 客户端将在它完成之前超时,因此它的 HTTP 端需要以某种方式启动作业并立即返回某种成功消息。
完成此操作后,您可能会发现像 RabbitMQ 这样的作业队列是一种有用的基础设施技术。同样,这将作业队列与实际运行它们的机制分离。在 Docker/Kubernetes 空间中,您将启动一些持久的工作人员,这些工作人员都听队列并按照它出现在那里的方式工作。您不一定会为每个工作启动一名工人;或者您可能只有一个启动其他 Docker 容器或 Kubernetes 作业的工作人员;但是如果工作积压的时间太长,您可以启动额外的工作人员。
在纯 Docker 空间中,理论上可以使用 Docker API 来启动其他容器。但是,这样做可以让您的进程无限地访问主机的根级别;如果你在 HTTP 服务器的上下文中运行它,你需要非常小心安全考虑。Kubernetes 也有一个 API,从安全的角度来看,这可能更好:您可以设置一个服务帐户,该帐户仅具有启动作业的权限,并为每个到达的入站作业启动一个作业。(安全性仍然很重要,但恶意输入要 root 主机要困难得多。)
推荐阅读
- jquery - 我试图让导航栏背景在使用 Ruby on Rails 6 从透明向下滚动到 Forestgreen 时发生变化
- python - 在多个日期范围内对 netcdf 文件进行时间切片
- javascript - 如果在 Promise 链中的某个点抛出错误,它是否会自动沿链向下传播?
- amazon-web-services - 您可以使用 aws/gsutil cli 多阶段构建 docker 映像吗?
- azure-cosmosdb - 使用特定于区域的 Gremlin API 端点时 Cosmos Graph DB 自动故障转移?
- android - Android 中的线程和并行性
- javascript - 为什么 x 不是函数?
- r - eval(model$call$data) 中的错误:找不到对象 data1
- python - Pandas Multiindex Groupby 聚合 - 多层
- python - 从 AWS 的 Lambda 正确导入 Python 包中的 JSON 文件