写点什么

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:00726

评论

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

vivo 商城架构升级-SSR 实战篇

vivo互联网技术

大前端 服务端 Node SSR

文件写入的6种方法,这种方法性能最好

王磊

Java io 文件读写 文件操作 文件写入

FGC青蛙钱包系统开发|FGC青蛙钱包软件APP开发

系统开发

区块链钱包软件系统开发及费用

TypeScript | 第一章:环境搭建及基础数据类型

梁龙先森

typescript 大前端 七日更

十日谈:我的 2020

escray

2020 七日更 十日谈

第十三周 作业

熊桂平

极客大学架构师训练营

今天发的被删了,不是我没写

lidaobing

28天写作

生产环境全链路压测建设历程 16:淘宝网高可用历程的总结

数列科技杨德华

全链路压测 七日更

突破某度云盘下载限速,提速30倍!想学?我教你啊

Silently9527

百度云 HTTP

Flutter动态创建UI实现方案

FisherJoe

架构的业务属性

soolaugust

架构 设计 架构师 七日更

数字货币交易所币币OTC交易系统开发

量化交易模式系统开发app案例

什么是定点数?

Kaito

计算机基础

我们该如何正确的中断一个线程的执行??

冰河

并发编程 多线程 高并发 中断线程 签约计划第二季

和 lvgo 一起学习设计模式.PDF

米凤君

Java 设计模式 23种设计模式

架构师 3 期 3 班 -week5- 总结

zbest

总结 week5

数字货币持币生息钱包系统开发案例

数字资产交易所系统开发交易平台APP

创业感悟 | 2021是继续打工还是选择创业?

黑马腾云

创业

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

文智

极客大学架构师训练营

全球第一个 Serverless Redis 服务:Lambda Store 免费用

donghui

redis Serverless Lambda Store

不讲码德!坏味道偷袭我这个老码农

爱笑的架构师

Java 代码审查 代码坏味道 代码规范 七日更

Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)

刘悦的技术博客

django Vue 微信支付 python3 请求数据 扫码

数字货币量化交易所系统开发案例

架构师 3 期 3 班 -week5- 作业

zbest

作业 week5

【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

herongwei

c++ 后端 迭代器模式 源码剖析 stl

阿里不允许使用 Executors 创建线程池!那怎么使用,怎么监控?

小傅哥

Java JVMTI 线程池 七日更 Executors

Linux安装MySQL标准教程

Simon

MySQL centos 安装 七日更

甲方日常 71

句子

工作 随笔杂谈 日常

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