NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

评论

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

“云原生”的应用价值及关键属性解读

浪潮云

解决dyld: Library not loaded icu4c

一个大红包

brew icu4c

压力太大的话,就放点气儿吧

道伟

28天写作

这些面试题你会吗?连续四年百度Android岗必问面试题!深度好文

欢喜学安卓

android 程序员 面试 移动开发

透彻解析!在字节跳动我是如何当面试官的,讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

【进阶】面试官问我Chrome浏览器的渲染原理(6000字长文)

我是哪吒

学习 程序员 chorme 28天写作 2月春节不断更

关于GaussDB(DWS)的正则表达式知多少?人人都能看得懂的详解来了!

华为云开发者联盟

正则表达式 GaussDB

上天的源码要不要——GitHub 热点速览 v.21.08

HelloGitHub

Python GitHub 开源 Go 语言

基于matlab的控制系统与仿真2-传递函数模型

AXYZdong

matlab 2月春节不断更

如何解决深度推荐系统中的Embedding冷启动问题?

王喆

机器学习 深度学习 推荐系统 计算广告 Embedding

go get下载包失败问题

happlyfox

28天写作 2月春节不断更 Go 语言

产业实践推动科技创新,京东科技集团3篇论文入选ICASSP 2021

京东科技开发者

人工智能 机器学习 信号 语音识别

Mybatis【19】-- Mybatis自关联多对多查询

秦怀杂货店

Mybatis【20】-- Mybatis延迟加载怎么处理?

秦怀杂货店

数据库 缓存 mybatis 加载

Kafka.05 - 生产者与消费者介绍

insight

kafak 2月春节不断更

工业互联网助力数字中国建设(新论)

浪潮云

工业互联网

读书笔记-MySQL

yunCrush

MySQL

Fast AI人工智能审图平台-建筑图纸设计效率的倍增器

AI AI审图

什么容易被记住——造梦师指南

Justin

心理学 28天写作 游戏设计

透彻解析!如何快速的开发一个完整的直播app,薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

Selenium 常用方法与属性、鼠标悬停与 Select 操作

梦想橡皮擦

Python 28天写作 2月春节不断更

从磁盘读取成本分析两种 100% 遍历思路:按格子遍历 & 按线遍历

宫水三叶的刷题日记

面试 LeetCode 数据结构与算法

诊所数字化:最大的数据资产-患者数字档案内容

boshi

电子病历 数字化医疗 七日更 28天写作

Java lambda表达式人类使用指南

ES_her0

28天写作

(28DW-S8-Day3) 比特币、 区块链是什么?

mtfelix

比特币 区块链 28天写作

前端面试常考题:JS垃圾回收机制

华为云开发者联盟

JavaScript Vue 大前端 js 垃圾回收

线程池面试必考

叫练

面试 线程池 线程池工作原理

话题讨论 | 技术人员的职业发展困惑,你也有么?

架构精进之路

职业规划 话题讨论 28天写作 技术人员

我的配置中心知识整理

老白鹿

微服务 技术选型 配置中心 配置管理

西北大学研发猴脸识别技术,金丝猴可刷脸打卡;IJCAI 2020丨基于学习实例隐空间的文本风格转换

京东科技开发者

人脸识别 IT 量子通讯

产品经理训练营第四周总结

产品经理训练营

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