概述
在 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 路径来区分不同的应用,这里只需要创建一个任务定义
col 1
任务定义名称: taskweb
任务角色:
网络模式: 桥接
约束:
容器定义:
容器名称: dockerweb
映像: 772041933387.dkr.ecr.us-east-1.amazonaws.com/web-app:v1
内存限制:512M
端口映射: 主机端口:0 容器端口:80 协议:tcp
命令: /usr/sbin/apache2,-D,FOREGROUND
然后创建集群:
col 1
集群名称: 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
col 1
名称: 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
在集群中创建代表不同应用的服务:
col 1
服务名称: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 中国,微软中国担任研发工程师,资深技术顾问等工作。
本文转载自 AWS 技术博客。
原文链接:
https://amazonaws-china.com/cn/blogs/china/amazon-ecs-build-saas-application/
评论