一、微服务诞生与容器的结合

单体架构与微服务架构的区别

传统软件架构特性是单体应用,开发周期至少以月为单位进行发布和升级,代码一般使用一种语言开发,不同的组件紧耦合,经常依赖于公共的库,从开发到运维的工作流程中,由于基础环境的不一致造成了诸多问题,部署周期以月为单位,部署依赖人工操作,组件版本复杂,不利于持续性开发,操作风险高。

面对传统单体软件架构的劣势,微服务架构(MSA)架构概念应运而生,通过将功能分解到各个离散的服务中以实现对解决方案的解耦。即业务系统本身的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用,这些小应用之间通过服务完成交互和集成。

微服务架构相比于单体应用解决了很多问题,但也带来了一系列的复杂性难题。微服务架构的强的依赖关系管理、资源分配的难题、部署复杂及其监管和协作方面的难题等也成为一些公司将其拒之门外的原因。

作为近年来云计算领域最火热的技术,Docker 容器技术的 DevOps 优势有效提升了微服务的架构能力,为微服务架构的应用提供了“天然”的载体。

微服务架构与容器架构的结合

Docker 容器技术使用镜像方式将应用程序和它依赖的操作系统、类库以及运行时环境整体打包,将镜像作为标准的交付物,提供了交付环境一致性。重新定义了开发测试、交付和部署过程,可以做到「Build once,Run anywhere」,缩短了企业应用从开发、构建到发布、运行的整个生命周期,实现了对线上项目的灰度升级,提升产品交付迭代速度,使得项目可持续集成,大大降低开发、测试、部署和运维的压力。

二、容器服务简介

品高云早在 2014 年,4.0 版本时,品高云已支持对 Linux 底层容器 LXC 的纳管,并做到了虚拟化与容器的单机双模结构,用以支撑低损耗需求的大数据和 HPC 计算。在最近的品高云 7.0 版本中又隆重推出可以对 Docker 容器进行自动化编排和管理的弹性容器服务(ECS)。

弹性容器服务(ECS)是一项高度可扩展的容器管理服务,通过在品高云 VM 实例中自动化部署 Docker 镜像,搭建容器集群,并在集群中执行预定义好的服务或任务,为应用软件的开发、测试、运维提供一套统一的运行环境。并全面支持品高云自带的计算、存储、网络、负载均衡和安全能力,并且提供了容器级 HA 机制保障。

三、特色

开发测试运维一体化 解决了开发测试运维一体化的问题,可以对项目进行持续集成、持续交付和持续部署。线上项目无需停机维护,可进行在线的灰度升级。

图形化容器管理器 品高云提供向导式的图形化容器管理器界面,用户只需要提交容器运行的环境参数、容器数据,完成任务定义,云平台就可以自动完成集群构建、任务运行等过程。

减少系统部署的重复工作量 品高云弹性容器服务提供容器编排工具,资源编排模板可以保存为文本文件,用户可以将其保存在本地或云平台存储路径中,后期有类似系统上线时,可以直接使用该模板或者作适当修改即可,大大减少了系统上线的重复工作。

容器级 HA 机制保障 在容器集群内执行多个服务时,当某个 ECS 实例出现故障宕机时,容器集群调度器会根据定义,自动启用其他 ECS 实例运行原 docker 容器的服务,从而保障服务的高可用性。

可与品高云其他服务协同使用 品高云容器服务可与多种品高云已有服务进行配合,包括:云网络、网络安全组、虚拟防火墙、负载均衡、资源伸缩、监控告警、简单通知服务等等,满足用户构建灵活应用系统的要求。

四、技术架构

弹性容器服务技术架构

容器服务基于品高云设施构建(在客户已有虚拟化、存储和网络资源能力之上)。同时容器服务属于 IaaS+服务,因此提供了业务所需的容器编排、管理和自动化部署能力。

云平台提供预制有 Docker 管理器的 EC2 镜像,通过此镜像生成的 ECS 实例可供创建容器集群使用。用户可自定义微服务任务模板,并且通过调度器向 ECS 实例中的 Docker 代理发送指令,来创建任务所需的容器。

容器服务同时支持 REST API 和图形化的控制台进行管理。而平台底层利用容器集群管理引擎进行的统一的调度和监控。

容器服务还可以和负载均衡服务进行联动,微服务创建的容器可以直接通过负载均衡进行访问负载。当容器数量发生变化时,也可以自动加入到负载均衡负载中。

一些相关名词

任务定义 :定义任务使用的 Docker 容器,包括容器的名字和镜像,运行时的内存大小等,ECS 将根据定义好的任务去分配资源,运行并配置 Docker 容器。

ECS 实例镜像 :导入配置好容器服务的 EC2 镜像,启动镜像得到的实例,可以根据任务定义,创建并运行不同的 Docker 容器。

容器任务 :服务是一系列任务的集合,包含有所运行的任务、事件、部署和监控信息等。

容器集群 :可以根据 ECS 实例镜像启动 ECS 实例,并且可以管理服务和任务,同时对它们使用的资源进行监控。

五、ECS 实践——部署 WordPress 博客站点

wordpress 博客站点由 web 和 mysql 两个组件构成,需要用到两个 docker 镜像,分别为 wordpress 镜像和 mysql 镜像,均使用最新版本即可,弹性容器服务会根据用户指定的镜像和配置自动下载镜像并启动。本次部署 wordpress 博客的架构包括一个 mysql 服务器、两个 web 服务器和一个负载均衡器。

整个部署过程分为 WordPress 部署准备、部署 WordPress 应用和 wordpress 灰度升级三个阶段。

WordPress 部署架构图

5.1 部署准备

弹性容器服务正常使用的前提条件是管理员在高级服务初始化配置中添加了弹性容器服务。同时,已准备好部署 wordpress 博客所需的 Web 镜像 (通过 docker hub 网站或品高云私有镜像库下载 ) 和 MySQL 镜像 (通过 docker hub 网站或品高云私有镜像库下载 )。

5.2 部署应用

首先,为 wordpress 博客的 mysql 服务器创建任务定义,具体步骤如下:

1. 进入【高级服务→容器服务→任务定义】,点击新建任务定义,出现创建任务定义界面导向图 1,填写任务定义的名称为 wordpress-mysql;

图 1 新建 mysql 任务定义界面

2. 点击图 1 中容器定义下的“添加”,出现如图 2 界面,填写 mysql 容器的信息,给定容器内存,和镜像名称 (mysql)。然后点击高级选项,在环境变量中指定 mysql 的用户名和密码,在网络别名里填上 wordpress-mysql,web 服务器就可以通过 wordpress-mysql 这个名称访问到 mysql 服务器。配置信息(图 3)填写完后,点击保存;

图 2 新建容器及页面

图 3 新建 mysql 容器配置信息界面

3. 保存任务定义。

创建完 mysql 的任务定义后,再为 web 服务器创建任务定义,具体步骤如下:

4. 在任务定义列表界面,点击新建任务定义,填下任务定义的名称为 wordpress-web;

5. 点击容器定义中的“添加”,出现如图 4 界面,与 mysql 容器一样填下内存和镜像名称 (wordpress) 等基本信息,指定容器的 80 端口映射到虚拟机的 80 端口,然后在高级选项的环境变量中配置 wordpress 数据库信息(图 5),数据库账号密码需与刚才定义的 mysql 容器的账号密码一致,最后设置 mysql 的地址为 wordpress-mysql:3306,点击保存;

图 4 新建 Web 容器页面

图 5 新建 Web 容器配置信息页面

6. 保存任务定义。

任务定义创建后之后,我们新建一个容器集群用于部署 wordpress 博客。

7. 进入【容器服务→容器集群】,点击新建,填入集群名称为 wordpress,如图 6 所示;

图 6 创建集群界面

8. 点击集群详情进入到 ECS 实例的标签页面,然后新建三个 ECS 实例用于部署 web 服务器和 mysql 服务器,创建过程与基础服务中创建实例的过程是相同的;

9. 添加 ECS 实例后,进入到服务的标签页面,新建 mysql 服务,出现如图 7 界面。选择我们刚才已定义好的任务定义 wordpress-mysql,设置服务名称为 wordpress-mysql,期望数量为 1,然后点击创建按钮;

图 7 新建 mysql 服务界面

10. 为 web 服务创建一个负载均衡器;

11. 等到 mysql 服务和负载均衡器运行起来之后,新建 web 服务,出现如图 8 界面。设置任务定义为 wordpress-web,名称为 wordpress-web,期望数量为 2(对应两个 web 服务器),然后为 web 服务配置负载均衡(图 9),填写好信息后点击创建按钮;

图 8 新建 web 服务界面

图 9 为 web 服务配置负载均衡

12. 创建好的服务会显示在服务标签页的列表里,如图 10 所示。当 mysql 服务和 web 服务达到稳定状态 (服务中运行的任务数量等于期望数量) 时,在浏览器地址栏输入负载均衡器的地址(本示例中 ip 为 10.202.144.100),即可访问到 wordpress 博客的安装界面,接下来就可以对 wordpress 进行初始化操作了;

图 10 服务列表页面

13. 完成初始化操作后,输入登录帐号和密码,成功进入首页后,可查看到博客的背景页面和首页,如图 11、12 所示;

图 11Wordpress 博客 V1 版本背景页面

图 12 wordpress 博客 V1 版本首页界面

14. 发帖子并查看已发布成功,则 wordpress 博客 V1 版本应用的部署完成,如图 13 所示。

图 13wordpress 博客 V1 版本内容页面

5.3 灰度升级

在部署完 wordpress 博客站点后,将其进行升级至版本 2,具体操作步骤如下:

1. 进入【高级服务→容器服务→任务定义】,找到任务定义组 wordpress-web,点击进入详情,选中上次创建的任务定义 wordpress-web:1,然后点击新建版本,出现如图 14 界面;

图 14 新建 wordpress-web 任务定义界面

2. 点击容器名称 wordpress-web,出现如图 15 界面,将镜像替换为版本 v2 的镜像 registry.bingosoft.net:5000/wordpress:v2,然后点击保存;

图 15 更改镜像名称为 v2 版本

3. 保存任务定义,则 v2 版本的 wordpress 任务定义创建完毕。

4. 任务定义创建好之后,进入【容器服务→容器集群】,进入 wordpress 集群查看服务页面,可以看到刚创建的服务列表,如图 16 所示。选中 wordpress-web 服务,右键更新服务,选择 v2 版本任务定义 wordpress-web:2。

图 16 服务列表界面

5. 为了使服务在升级过程中能够达到不中断访问,这里我们最好设置服务的最小健康百分比为 100,最大百分比为 400,以确保升级过程中有 web 在提供服务,最后更新该服务,如图 17 所示;

图 17 更新 wordpress web 服务

6. 升级过程中,不断访问负载均衡器,可以看到服务一直是访问可行的。因为在升级初期依然保持着原有服务的可用性,所以还会看到原有背景图片还是如图 11 所示,之后新版本的服务运行起来,承载新服务的实例会自动加入到负载均衡器中,这时可以看到主页的背景图片从图 11 切换到图 18,

图 18 WordPress 博客 v2 版本背景

7. 访问网站主页(图 19)、控制面板(图 20),并发表评论(图 21),一切正常,则升级完毕。

图 19 WordPress 博客 v2 版本主页界面

图 20 博客网站管理员控制面板

图 21 发布新博客并评论

弹性容器服务(ECS)已经在品高云 7.0 版本中正式发布,对于这项服务感兴趣的读者,可以访问品高云 7.0 的亮点功能介绍,通过视频的方式增加直观的了解它。

视频连接:http://cloudos.bingocloud.cn/templates/newlook.html

相关文章:基于 Docker 容器的微服务架构实践(http://blog.bingocloud.cn/archives/201