在Amazon EC2容器服务中运行Docker可以达到更好的云移植性并降低成本。这里将解释如何做到这一点。
云计算开发者常常要同配置问题作斗争。各种服务在实验室环境里都是好的,但在生产环境中却无法以预期的方式运行。亚马逊EC2容器服务提供了托管、可管理和完全可编程的API来从EC2内部直接运行Docker 容器。开发者只需要选择Docker fleet中所需的服务器大小和数目,然后Amazon就会将这些容器放入实例中。
亚马逊Web服务(AWS)的弹性计算云(EC2)允许用户根据配置来运行虚拟机,以编程方式或者自动方式皆可。EC2用户要先定义虚拟机将要存在的实例类型,区域和可用区(AZ)。EC2的实例数是可以扩展的,但EC2的真正强大之处体现在当你加上扩散功能的时候,它可以将服务分割到多个位于不同AZ和区域的服务器中。
但EC2的计费方式使得它在少数几个大型的实例中运行是比较经济的。那些想要完全隔离特定的服务,让这些服务彼此之间不会互相影响的企业们,便转向使用Docker。
Docker是为了微服务和云移植性设计的。
微服务可以预防那些由服务互相影响所产生的问题。比如说,如果你的PDF归档进程失去控制并占用了大量的CPU,你就不会想要它也顺便消灭你的搜寻索引器。传统的解决方法是在独立的EC2实例上运行这两个服务,但是,两个m3.large实例可是比一个m3.large实例贵。Amazon鼓励你使用更大的实例而不是更多的实例。
但Docker不是专属于AWS或云的,IT团队可以在任何东西上运行Docker,从公有云到裸机都行。这个软件是以抽象层的方式建立在虚拟机之上的,并不会移除另一个完整虚拟层的开销。这代表了那些想用其他公有云供应商来试验的企业不需要重写任何代码。如果你的基础功能是随着时间在Amazon 机械实例(AMI)上慢慢累积起来的话,你不但要为了新的安全补丁修改代码来更新AMI,你还必须要为了例如Google计算引擎之类的新云供应商重建整个系统。
以下是当你要建立及运行Amazon EC2容器服务时要遵守的几个步骤。
Amazon ECS入门
EC2容器服务里有个控制台,里面包含了所有你需要的工具,帮助你设立Docker和AWS。第一步是先建立一个集群并将实例加入你的Docker池子里。这些实例可以被加入一个Auto Scaling组(ASG)里,这样可以确保总是存在健康的实例,从而确保Docker系统背后有足够的额外能力来运行你的容器。
一开始,首先进入Amazon ECS 控制台并建立一个集群,也就是Docker实例的最高级别上的分组。你可以使用分离的集群让测试和开发环境相互独立开来,在同一个AWS帐号里。
当你创建好一个集群之后,启动其中的一个实例。我推荐使用Auto Scaling Group,即便你只想在这个集群里运行固定数量的实例。设置一个Auto Scaling Group能提供一个防护措施,如果某个服务器宕机,将会被自动替换掉。
在控制台中,创建一个新的启动配置,然后在AWS Marketplace中选择最新的ECS优化实例。
点击继续然后选择一个要启动的实例类型。我建议使用一个C4或M3的实例类型,大的或者更高。不要选择T2或T1的实例类型,这些针对突增容量设计的,对于长期运行的进程可能会有些问题。
填完剩余的信息然后依照出现的提示设定好ASG。你也许想将你的ASG设定成在虚拟私有云(VPC)中运行,但要确保设置成运行在至少两个不同可用区中的两个不同的子网里。
当你的ASG建立好这个群集的EC2实例后,就会看到他们出现在你的ECS控制台中(图1)。
创建任务定义
任务是一个或多个Docker容一起为了一个服务或微服务而运行。任务可以用于类似Redis服务器这样的简单工作负载或复杂工作负载如整个 Wordpress栈,连着用于数据库,memcached和一个Web服务器的容器。将容器连接起来有助于他们能够一起紧密的协作。
当为你的任务定义配置一个容器时,你必须定义一个容器名、镜像、CPU、内存,可选的端口映射,可选的环境变量,一个可选的覆盖命令和连接等。你必须指定你想要为每个容器预留多少的内存(以MB为单位),以及预留多少个CPU单元(每个2.8GHz的处理器总共有大约1024个CPU单元)。这样能确保服务器不会因为有太多容器而过载,防止某个容器使用太多的资源而使得其他容器变慢。集群的首页会显示可用的CPU单元和内存。如果任何一个可用资源显示不足的话,请先在你的集群里启动额外的服务器再启动更多的容器。
创建服务
一旦你创建了任务定义,接下来是创建服务,也就是ECS版本的一个简化的Auto Scaling Group。这确保了一定数量的任务实例运行,并且允许开发者将他们绑定到一个弹性负载均衡器中。为服务设定角色有助于分类;独立的Docker容器有他们自己的身份和访问管理角色。这给与EC2几乎和一个独立的Docker容器一样的能力。
你也许想从私有的Docker Registry开始,可以创建Docker镜像的私有库来抓取镜像到系统中。私有Docker库会显示为一个可配置的Docker容器支持将镜像库存储到简单存储服务中。
图2是我使用的一个任务定义的例子,用来托管我自己的Docker Registry。
图3显示了相关的服务。
我的Docker集线器的内部负载均衡器代理端口从80到5000。因为只在我的VPC里允许,我不需要任何自定义的认证或者SSL的支持。我可以设置从Docker库里抓取镜像,并且我有一个特殊的Docker实例用来构建和推送镜像到Docker库。
运行蓝绿更新
与弹性Beanstalk相似,Amazon EC2 容器服务通过运行额外任务来处理更新,通过负载均衡器切换并在新容器就绪后终止旧的容器。这典型的消除了宕机时间,这样IT团队可以在正常的业务时间内推出更新而不会影响客户。
要进行一个蓝绿部署,创建一个新版本的任务,可能指向一个镜象的新版本,然后更新服务来使用该版本。在ECS中,所有的任务版本都会保存,这样你可以轻松的回复到一个旧的版本如果部署出现任何问题的话。
Docker容器:ECS对比Beanstalk
在亚马逊实例上运行Docker不是一个新的概念。如果你需要一个基于Web的应用来定期使用新的部署,Beanstalk加Docker是最好的选择。但这对于在一个应用后台运行几个微服务来说不一定是理想的。如果你有一个Web应用会驱动其他的后台系统,比如视频转录提取,自动图像人脸检测或游戏分析,你也许需要同时使用ECS和弹性Beanstalk加Docker。
最好是指导ECS上的微服务从SQS队列中读取,然后扩展服务横跨你的整个fleet来运行这些服务的多个拷贝。举个例子,我的一个fleet拥有4个 m3.xlarge实例运行10个PDF提取工具的拷贝,2个全文索引系统的拷贝,4份交付系统和一些杂项任务,如更新我们的Geckoboard仪表盘和同步数据到RDS以便在Tableau中进行分析。
要增加更多的PDF提取进程,我可以进到那个服务然后增加运行任务的数目。如果我需要更多的空间,我可以瞬间提高服务器的大小或者增加我的任务池大小。如果我是在Beanstalk上这么做的话,我至少需要10个不同的实例来运行10个我的PDF提取工具拷贝。用ECS我可以利用与运行几个小实例相比更低的成本来运行更大的实例。
如果你正在AWS上使用Docker的话,那么ECS是最合理的选择。让Amazon完成主要的工作,你只需轻松的使用熟悉的元素如弹性负载均衡,自动扩展及固定容器实例数目的类似服务来管理这些实例即可。