写点什么

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

  • 2019-11-14
  • 本文字数:3074 字

    阅读完需:约 10 分钟

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 路径来区分不同的应用,这里只需要创建一个任务定义

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/


2019-11-14 08:00705

评论

发布
暂无评论
发现更多内容

软件开发人员的软实力之一:精细度

boshi

职业 随笔

架构师训练营 3 期 第二周作业

ihiming

架构师训练营 2 期 - 第 7 周命题作业

Geek_no_one

极客大学架构师训练营

架构师训练营—第十一周作业

Geek_shu1988

第十一周作业

fmouse

极客大学架构师训练营

第十一周总结

fmouse

极客大学架构师训练营

架构师训练营 - 第十一周 - 作业一

行者

你真的理解什么是创新么?|技术人应知的创新思维模型 (1)

Alan

创新 思维模型 技术人应知的创新思维模型 28天写作

11周作业

橘子皮嚼着不脆

Week7总结

lggl

总结

架構師訓練營 week11 總結

ilake

架构师训练营 2 期 - 第六周总结

Geek_no_one

极客大学架构师训练营

架构师训练营 2 期 - 第 6 周命题作业

Geek_no_one

极客大学架构师训练营

架构2期-第七周作业(1)

浮生一梦

极客大学架构师训练营 第七周 2组

造车失败后投身机器人和AI,我笑戴森太疯癫,戴森笑我看不穿

脑极体

性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化

幸福小子

性能分析

架构师训练营第十一周作业

月殇

极客大学架构师训练营

回溯解决电话拨号字母组合,swift:Subscripts下标的花式玩法,swift5 Auto Layout入门,John 易筋 ARTS 打卡 Week 29

John(易筋)

ARTS 打卡计划 回溯算法 autolayout swift5 xcode 快捷键

软件设计的设计模式

简简单单

架构师训练营 2 期 - 第七周总结

Geek_no_one

极客大学架构师训练营

【第11周】安全稳定

云龙

架构师训练营1期 -- 第十一周作业

曾彪彪

极客大学架构师训练营

性能优化总结

幸福小子

性能优化

十一周总结

orchid9

Week7-作业

lggl

作业

Gson 中的一个坑

Rayjun

Gson

第七周学习总结

晴空万里

第二周学习总结

简简单单

架构师训练营 1 期第 11 周:安全稳定 - 总结

piercebn

极客大学架构师训练营

架構師訓練營 week11 作業

ilake

架构师训练营—第十一周学习总结

Geek_shu1988

Amazon EC2 Container Service打造容器化的SaaS应用_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章