亚马逊AWS官方博客

Amazon EC2 Container Service打造容器化的SaaS应用

概述

在SaaS化应用的改造中,容器技术的应用越来越广泛。相对于传统的虚拟机模式,容器化模式的隔离技术“更轻量”,“ 更快速”,“ 更便捷”. 目前业界越来越广的使用“容器”技术用于应用的微服务化改造,将自己产品的一些服务“微服务”化,构建基于云平台的SaaS化应用。

容器技术改造的难点

1. 技术的复杂性

容器技术应用的难点在于生产环境的实施及部署, 一般需要解决

  • 容器资源编排调度
  • 服务的自动发现及注册
  • 容器的监控及报警
  • 容器的扩展及收缩

这只是解决的部分问题,用户还必须去解决生产环境部署中怎样实现高可用部署及与公有云平台的集成问题。这使得Docker的生产化部署变得困难。

2. Docker编排框架的选型

许多人认为容器技术的价值在编排层,目前在容器的编排框架上主要的流派正在上演 “三国演义”包括,Google Kubernetes、Apache Mesos、Docker  DockerSwarm. Kubernetes,Mesos是目前市场上比较成熟的解决方案,占有较大的市场份额。DockerSwarm的优点是与Docker平台中的许多功能的集成,因为它平滑地内置于Docker平台中。上述三个编排框架都开放源代码,用户只需为技术支持服务付费。除了这些标准外还有许多初创公司也推出了自有的编排框架, 如Rancher使用Java语言开发了Cattle,它是Rancher实现的自有的一套基于Docker的编排引擎。众多的开源或自有的编排框架在不断发展,演进。这给客户的技术平台选型也带来极大的挑战。

Amazon EC2 Container Service(ECS)

为了降低容器平台生产部署的复杂性,Amazon ECS提供了一个平台来管理Docker容器。Amazon ECS是一项高度可扩展的高性能容器管理服务,您将不再需要安装、运维、扩展自己的群集管理基础设施。只需进行简单的 API 调用,您便可以启动和停止支持 Docker 应用程序,查询群集的完整状态,使用各种熟悉的功能,包括安全组、Elastic Load Balancing、EBS 卷和 IAM 角色。您可以使用 Amazon ECS 根据您的资源需求和可用性要求在您的群集中安排容器的置放。您还可以集成自己的或第三方的计划程序,以满足业务或应用程序的特定要求。Amazon EC2 Container Service 没有任何附加费用。您只需为您创建的用于存储和运行应用程序的 AWS 资源 (例如 EC2 实例或 EBS 卷) 付费。Amazon ECS的介绍,请参阅:https://aws.amazon.com/cn/documentation/ecs/

让我们来先看一个简单的Docker应用场景

客户有多套应用系统部署在云端,采用虚拟机隔离的方式,每套系统独占虚拟机资源,造成资源利用率不高。希望通过微服务化改造来提高云资源的利用效率及应用部署的敏捷性。改造的方法是从系统架构上分离应用层,使用Docker来封装应用层工作负载。采用Docker封装是微服务化改造最便捷的一种方式,因为对原有系统的代码修改少。降低了改造,迁移的成本。

将WEB,APP层直接封装成Docker容器运行。前端通过负载均衡传入流量,并负载均衡到Docker集群上。 需要实现服务的自动发现及注册,两级(Docker, EC2)自动扩展/收缩及容器的监控及报警。

下面我们就来介绍一下基于Amazon ECS的实现方法。

1. 应用层的封装

ECS提供了ECR(存储库),具有与Docker HUB一样的镜像存储管理功能.我们准备一个镜像来演示我们的应用层封装,这是一个Apache服务器的镜像,Dockerfile定义如下:

为了模拟三个不同的应用,我们对Apache服务器的配置做小小的更改:

在配置文件中新加了两个目录: app1, app2.并更改目录的初始页面的标题为目录名,这样当访问

提交更改

将镜像Push到ECR存储库,就得到了我们封装的应用层镜像

2. 创建服务

ECS有几个比较重要的概念。 任务服务集群

  • 任务就是您的应用程序的蓝图,是一个最基本的功能单元,包括构成应用程序的一个或多个容器,比如我们的案例中,封装的Apache镜像就是一个任务只包含了一个容器,但在实际案例中任务可能会有一个或多个容器,比如WEB容器,APP容器,它们共同组成一个任务。
  • 多个在一个容器实例或跨主机容器实例运行的任务就构成了服务,服务更像是一个应用的集群,ECS可以与ALB集成实现服务的自动注册及发现。通过使用动态端口映射选项,我们可以简单地注册一个服务到负载均衡器,而 ECS透明地管理Docker容器的注册和注销。我们还得到了传统负载平衡器的所有特性,如健康检查、连接保持和访问日志等。
  • 集群是EC2 实例的逻辑分组。Amazon ECS 从您指定的注册表中下载容器映像,并在集群内的容器实例上运行这些映像。

我们首先创建任务:

由于我们通过不同的URL路径来区分不同的应用,这里只需要创建一个任务定义

任务定义名称: taskweb

任务角色:

网络模式:        桥接

约束:

容器定义:

容器名称: dockerweb

映像: 772041933387.dkr.ecr.us-east-1.amazonaws.com/web-app:v1

内存限制:512M

端口映射:    主机端口:0  容器端口:80  协议:tcp

命令:    /usr/sbin/apache2,-D,FOREGROUND

然后创建集群:

集群名称: erp

实例配置:

预配置模型: 按需实例

EC2 实例类型: m4.large

实例的数量: 4

EC2 Ami Id: amzn-ami-2016.09.g-amazon-ecs-optimized [ami-275ffe31]

EBS 存储: 22

密钥对: martin

联网:

VPC: martin

子网: Pub1

Pub2

安全组: ECSSG

容器实例IAM 角色: ecsInstanceRole

创建负载均衡的ALB

名称: albdocker

模式: 面向internet

IP 地址类型: ipv4

侦听器: http:80

可用区

VPC: martin

AZ: pub1

pub2

分配安全组: ecssg
目标组名称: targetweb

协议: HTTP

端口: 80

运行状况检查

协议: HTTP

路径: /index.php
目标组名称: targetapp1

协议: HTTP

端口: 80

运行状况检查

协议: HTTP

路径: /index.php
目标组名称: targetapp2

协议: HTTP

端口: 80

运行状况检查

协议: HTTP

路径: /index.php

在集群中创建代表不同应用的服务:

服务名称:srvweb

任务定义: taskweb:8

集群: erp

任务数: 2

任务放置模板: AZ均衡放置

可选配置: Elastic Load Balancing

ELB 名称: albdocker

目标组名称: targetweb

路径模式: /

运行状况检查路径: /index.php
服务名称:srvapp1

任务定义: taskweb:8

集群: erp

任务数: 2

任务放置模板: AZ均衡放置

可选配置: Elastic Load Balancing

ELB 名称: albdocker

目标组名称: targetapp1

路径模式: /

运行状况检查路径: /index.php
服务名称: srvapp2

任务定义: taskweb:8

集群: erp

任务数: 2

任务放置模板: AZ均衡放置

可选配置: Elastic Load Balancing

ELB 名称: albdocker

目标组名称: targetapp1

路径模式: /

运行状况检查路径: /index.php

创建完服务后,srvapp1, srvapp1, srvweb已经自动完成在ALB的注册

实现了如下的架构:

集群的状态如下:

现在我们已经实现了微服务化的改造,通过不同的URL就可以访问运行在Docker集群上不同的应用程序。

3. 自动扩展/收缩及监控,报警

还有两级(Docker,EC2)自动扩展/收缩及容器的监控及报警的功能怎么实现呢?  ECS集成了Auto Scaling, Cloudwatch。在集群和服务中都有Autoscaling组,只需要简单配置就可以了,如下图:

看看是不是很简单呢?除了我们可以通过Portal来实现外,ECS还提供了API接口。那还等什么,赶紧去试试吧!

 

作者介绍

杨历,AWS解决方案架构师负责AWS中国合作伙伴生态系统的技术支持工作,致力于为合作伙伴提供AWS云计算方案架构的咨询和设计,上云迁移, 应用优化,培训等服务。在高可用,灾备解决方案,大规模并发应用架构,自动化运维,RDBMS,数据仓库,数据集成等方面有着广泛的设计和实践经验。在加入AWS之前曾在Oracle研发中心,Oracle中国,微软中国担任研发工程师,资深技术顾问等工作。