在Amazon EC2容器服务的框架下

| | 评论( )

在我上一篇关于Amazon EC2容器服务(Amazon ECS)的文章中,我讨论了在集群上运行现代分布式应用程序的两个关键组件:可靠的状态管理和灵活的调度。Amazon ECS使构建和运行容器化应用程序变得简单,但亚马逊ECS的有趣之处在于它是如何做到这一点的。今天,我想探索Amazon ECS体系结构及其支持的功能。下面是Amazon ECS的基本组件图:

我们如何协调集群

让我们谈谈Amazon ECS实际上在做什么。Amazon ECS的核心是集群管理器,处理集群协调和状态管理任务的后端服务。在集群管理器之上是各种调度程序。集群管理和容器调度是相互分离的组件,允许客户使用和构建自己的调度程序。集群只是客户应用程序可用的计算资源池。资源池,在这个时候,中央处理器,内存,以及按容器分区的Amazon EC2实例的网络资源。Amazon ECS通过。协调集群亚马逊ECS集装箱代理在集群中的每个EC2实例上运行。代理允许Amazon ECS在启动时与集群中的EC2实例通信,停止,并根据用户或调度程序的请求监视容器。代理是用Go写的,占用空间最小,并且可以在GitHub上获得Apache许可。我们鼓励贡献和反馈是最受欢迎的。

我们如何管理国家

为了协调集群,我们需要对集群本身有一个真实的来源:集群中的EC2实例,在EC2实例上运行的任务,组成任务的容器,及可用或占用的资源(例如:网络端口,内存,CPU、等等)。如果不准确地了解集群的状态,就无法成功地启动和停止容器。为了解决这个问题,状态需要存储在某处,因此,任何现代集群管理器的核心都是键/值存储。

此键/值存储充当集群中所有信息的唯一真值源(状态为,状态转换的所有更改)都输入并存储在这里。为了健壮和可伸缩,为了持久性和可用性,这个键/值存储需要被分发,防止网络分区或硬件故障。但是因为键/值存储是分布式的,确保数据的一致性和处理并发更改变得更加困难,特别是在状态不断变化的环境中(例如,容器的停止和启动)。因此,必须采用某种形式的并发控制,以确保多个状态更改不会发生冲突。例如,如果两个开发人必威体育精装版app官网员从某个EC2实例为他们的容器请求所有剩余的内存资源,只有一个容器可以实际接收这些资源,而必须告诉另一个容器它们的请求无法完成。

为了实现并发控制,我们使用Amazon的一个核心分布式系统原语实现了Amazon ECS:一个基于paxoo的事务性日志数据存储,它记录对数据条目所做的每一个更改。对数据存储的任何写操作都将在日志中以具有特定的基于订单的ID的事务的形式提交。数据存储中的当前值是由日记账记录的所有事务的总和。从数据存储中读取的任何数据都只是日志的一个快照。要想写得成功,建议的写操作必须是上次读取之后的最新事务。这个原语允许Amazon ECS以乐观并发的方式存储集群状态信息,这在共享不断变化的数据的环境中是理想的(例如在表示共享的计算资源池(例如Amazon ECS)的状态时)。该架构提供了Amazon ECS的高可用性,低延时而且高吞吐量,因为数据存储从不被悲观地锁定。

通过API进行编程访问

现在我们有了键/值存储,我们可以成功地协调集群,并确保运行所需的容器数量,因为我们有可靠的方法来存储和检索集群的状态。正如前面所提到的,我们将容器调度与集群管理解耦,因为我们希望客户能够利用Amazon ECS的状态管理功能。我们通过一组API操作打开了Amazon ECS集群管理器,允许客户以结构化的方式访问存储在我们的键/值存储中的所有集群状态信息。

通过“列表”命令,客户可以检索管理下的集群,EC2实例运行在特定的集群中,运行的任务,以及组成任务的容器配置(例如,任务定义)。通过“描述”命令,客户可以检索特定EC2实例的详细信息以及每个实例上可用的资源。最后,客户可以在集群中的任何位置启动和停止任务。我们最近在Amazon ECS上运行了一系列负载测试,我们希望与客户分享在Amazon ECS上构建应用程序时应该期望的一些性能特征。

上面的图显示了一个负载测试,我们从Amazon ECS集群中添加和删除实例,并测量了API调用“description betask”在72小时内的第50和第99个百分位延迟。如你所见,尽管集群大小有很大的波动,延迟仍然相对稳定。Amazon ECS可以与您一起伸缩,无论您的集群大小有多大——所有这些都不需要您操作或伸缩集群管理器。

这组API操作构成了客户可以在Amazon ECS之上构建的解决方案的基础。调度程序只是提供了逻辑,的时候,以及从何处开始和停止容器。Amazon ECS的体系结构旨在共享集群的状态,并允许客户运行多种调度程序(例如,本包装,传播,等),以供申请时使用。该体系结构允许调度器查询集群的确切状态,并从公共池中分配资源。适当的乐观并发控制允许每个调度程序接收它请求的资源,而不存在资源冲突的可能性。客户已经在Amazon ECS上创建了各种有趣的解决方案,我们想分享一些引人注目的例子。

在弹性资源池之上的自定义调度

Hailo是一个免费的智能手机应用,,让市民可直接向其所在地点租用持牌的士。海洛拥有超过6万名司机和100多万名乘客的全球网络。Hailo成立于2011年,从第一天起就建立在AWS上。在过去的几年里,Hailo已经从在一个AWS区域中运行的单一应用程序发展到跨多个区域运行的基于微服务的体系结构。在此之前,每个微服务都运行在静态分区的实例集群之上。Hailo遇到的问题是每个分区的资源利用率很低。这个架构不是很容易扩展,Hailo不希望它的工程师担心基础设施的细节或者微服务的位置。

Hailo决定基于服务优先级和弹性资源池上的其他运行时指标调度容器。他们选择Amazon ECS作为集群管理器,因为它是一个托管服务,可以轻松地执行任务状态并通过API调用完全公开集群状态。这允许Hailo构建一个定制调度程序,该调度程序的逻辑可以满足特定应用程序的需求。

提醒-平台即服务

提醒是一个网络和移动应用程序,教师可以给学生发短信,并与家长保持联系。Remind在其平台上拥有2400万用户和150多万名教师。它每月发送1.5亿条消息。Remind最初使用Heroku从消息传递引擎运行其整个应用程序基础结构,前端API,和web客户端,后端聊天。这些基础设施中的大多数是作为一个大型的单片应用程序部署的。

随着用户的增长,提醒要有水平伸缩的能力。所以在2014年底,工程团队开始探索使用容器的微服务体系结构。该团队希望构建一个与AWS上的Heroku API兼容的平台即服务(PaaS)。起初,这个团队研究了一些开源的解决方案(例如,(CoreOS和Kubernetes)来处理集群管理和容器编排,但是工程团队很小,所以他们没有时间管理集群基础设施并保持集群的高可用性。

在简要评估了亚马逊ECS之后,团队决定在此服务之上构建PaaS。Amazon ECS是完全管理的,并提供了操作效率,允许工程资源只专注于开发和部署应用程序;必威体育精装版app官网没有集群需要管理或扩展。今年6月,在ECS上提醒开源的PaaS解决方案:帝国”。Remind看到了性能的大幅提高(例如,延迟和稳定)与帝国以及安全的好处。在接下来的几个月里,他们计划将超过90%的核心基础设施迁移到Empire上。

亚马逊ECS -一个完全托管的平台

这只是我们从客户那里看到的几个用例。Amazon ECS体系结构允许我们提供高度可伸缩的,高可用性,低延迟容器管理服务。通过API访问具有乐观并发性的共享集群状态的能力使客户能够创建他们需要的任何定制容器解决方案。我们一直致力于为客户消除无差异的沉重负担。与亚马逊ECS,不需要安装或操作集群管理器:客户可以而且应该只关注于开发出色的应用程序。必威体育精装版app官网

自去年11月预览版以来,我们已经发布了许多特性。去杰夫·巴尔的博客浏览我们在过去一年所增加的功能。阅读我们的文档和访问我们的控制台开始。我们的路线图上还有很多内容,我们重视您的反馈:请向我们提出问题和请求我们的论坛或在/ r / aws.

评论

博客评论Disqus