在 Amazon ECS 上的 Docker 中运行节点 API 的最佳方式是啥?
Posted
技术标签:
【中文标题】在 Amazon ECS 上的 Docker 中运行节点 API 的最佳方式是啥?【英文标题】:What is the optimal way to run a Node API in Docker on Amazon ECS?在 Amazon ECS 上的 Docker 中运行节点 API 的最佳方式是什么? 【发布时间】:2015-02-19 12:26:05 【问题描述】:随着 docker 以及 Amazon ECS 等调度和编排服务的出现,我正在尝试确定部署 Node API 的最佳方式。除了 Docker 和 ECS,我想利用 Node 集群库,通过创建一个主进程和多个工作处理器来优雅地处理在发生异步错误时节点应用程序崩溃的问题,如 documentation 中所建议的那样。
除了优雅地处理错误之外,集群方法的一个好处是为每个可用的 CPU 创建一个工作处理器。但这在 docker 世界中有意义吗?在一个 Docker 容器中运行多个节点进程是否有意义,该容器将被扩展到 ECS 上的 EC2 实例集群中?
如果没有 Node 集群方法,我将失去优雅处理错误的能力,因此我认为至少应该为每个 docker 容器运行一个主进程和一个工作进程。我仍然对在 ECS 的任务定义中定义多少 CPU 感到困惑。 ECS documentation 说明了每个容器实例每个 CPU 有 1024 个单元;但这与 EC2 计算单元不同,是吗?话虽如此,我需要选择具有适当数量的 vCPU 的 EC2 实例类型来实现这一点?
我知道,实现最佳配置可能需要对我的特定 Node API 应用程序进行某种程度的基准测试,但如果能更好地了解从哪里开始,那就太棒了。也许我需要做一些学习/研究?任何指导我的路径或建议的指针将不胜感激!
编辑:回顾一下我的具体问题:
在 docker 容器内运行 here 所述的主/从集群以实现正常崩溃是否有意义?
使用集群文档中描述的几乎相同的代码通过require('os').cpus().length
“扩展”到可用的 CPU 是否有意义?
Amazon 在 ECS 任务定义的文档中表示cpus
设置是什么意思,container instance has 1024 units per CPU
?这个设置的一个好的起点是什么?
在 ECS 集群中使用实例类型以提供基于上述内容的节点 API 的良好起点是什么?可用的 vCPU 对前面的问题有何影响?
【问题讨论】:
【参考方案1】:所有这些技术都是新的,最佳实践仍在建立中,所以这些只是我的经验提示。
每个容器一个进程与其说是硬性规定,不如说是一种建议。当你使用它时,在一个容器中运行多个进程是很好的,特别是在这种情况下,主进程分叉了工作人员。正如您在问题中所建议的那样,只需使用一个容器并允许它为每个核心分叉一个进程。
在 EC2 上,实例类型具有多个 vCPU,它们将作为操作系统的核心出现。对于 ECS 集群,使用 EC2 实例类型,例如具有四个 vCPU 的 c3.xlarge。在 ECS 中,这转换为 4096 个 CPU 单元。如果您希望应用使用所有 4 个 vCPU,请创建一个需要 4096 个 cpu 单元的任务定义。
但是,如果您这样做只是为了阻止应用程序崩溃,您也可以在容器崩溃时使用重启策略来重启容器。不过,ECS 似乎还不支持重启策略。
【讨论】:
感谢您的回复,绝对有帮助。那么每个 EC2 实例一个 docker 容器?这绝对是我脑海中闪过的一种方式,它让它变得更简单。我只是不确定在 EC2 实例上堆叠 docker 容器是否有优势,但我想如果我在应用程序级别(容器内部)为每个 vCPU 分叉,堆叠容器没有多大意义。至于我为什么要这么做,其实不是让应用不崩溃,而是优雅地崩溃(停止监听http请求,记录错误,然后结束进程)。 让主进程定期杀死工作人员也很有用,以防止内存泄漏。 很高兴它有帮助。我理解故障安全的目标,但似乎通过自动重启机制隐藏应用程序中的错误应该是最后的手段。当然,如果您使用所有内核,每个实例只运行一个容器就可以了。 完全同意。这绝对是最后的手段。好消息是节点生态系统中有一些很棒的工具可以发现和解决内存泄漏问题,并且在开发和暂存期间肯定会付出很大的努力。但是,在生产中,我宁愿内存泄漏也不会意外蔓延。在空闲时重新启动进程没有害处。【参考方案2】:这似乎是一个非常好的模式。它类似于使用 Erlang/OTP 所做的事情,我认为没有人会争辩说它是地球上最强大的系统之一。现在的问题是如何实现。
我会利用 Heroku 或其他更成熟的类似 PaaS 系统的模式。我并不是说亚马逊是做这件事的错误地方,只是说在你可以翻译的其他领域已经做了很多工作。例如,这篇文章中有一个食谱: https://devcenter.heroku.com/articles/node-cluster
就 vCPU 和计算单元之间的关系而言,它看起来只是 1/1024 的直接比率。这是一种基于 CPU 利用率的微收费。他们通过 lambda 工作将这些更进一步。他们会根据您使用的几分之一秒向您收费。
【讨论】:
感谢您的回复。我同意 Heroku 和其他人开发了一些非常棒的系统。在 docker-sphere 中,甚至还有一个名为 Deis 的项目,它是一个基于 Docker 和 CoreOS 的受 Heroku 启发的开源自定义 PaaS。也就是说,我想尝试继续使用 AWS 的新容器服务 ECS。也就是说,在 AWS EC2 中,计算单位代表了他们提出的一个指标,并“提供了对 Amazon EC2 实例的整数处理能力的相对衡量”。这与 ECS 任务定义中的 cpus 设置不同。 对于在 EC2 实例上运行的理想进程数,我想我仍然有些困惑。也许我需要对虚拟机管理程序的工作方式进行更多研究,但是.. 如果我有一个 docker 容器,其中有 2 个进程,我试图找出每个 EC2 运行多少个容器,这取决于EC2 实例类型和理想设置取决于任务定义的配置。这些是我试图理解的事情。【参考方案3】:在 docker 世界中,您将为每个 docker 容器运行 1 个 nodejs,但您将在每个 ec2 实例上运行许多这样的容器。如果你使用fig 之类的东西,你可以使用fig scale <n>
来运行许多冗余容器和一个实例。这样,您不必提前定义 nodejs 计数,并且您的每个 nodejs 进程都与其他进程隔离。
【讨论】:
是的,我不会在生产中使用像 fig 这样的东西;正如我在问题中提到的,我的计划是使用亚马逊的容器服务来处理编排和调度。也就是说,即使在 fig 环境中,如果没有在应用程序级别运行多个进程,您也无法像我引用的集群模块文档中所述那样优雅地捕获和处理错误。在单个容器中运行多个进程也很常见。文档和许多解决方案都提出了这种模式。 总而言之,我仍在寻找有关 ECS 任务定义中 cpu 单元选择的答案,以及 EC2、vCPU 和计算单元。以上是关于在 Amazon ECS 上的 Docker 中运行节点 API 的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 docker compose 在 Amazon ECS 上部署应用程序
如何在 Amazon EC2 容器服务 (ECS) 中使用不安全的 docker 注册表?