2020年第5期总第162期
福建师大福清分校学报
JOURNAL  OF  FUQING  BRANCH  OF  FUJIAN  NORMAL  UNIVERSITY
No.5  2020Sum 162
收稿日期:2020-06-29基金项目: 福建省中青年教师教育科研项目(JT180823);福建省本科高校教育教学改革研究项目(FBJG20180130);福建省
教育科学“十三五”规划项目(2019CG0369).
作者简介: 王明芬(1981— ),女,福建福清人,硕士,讲师,研究方向为网络通信、机器学习.
基于Docker 的Web 系统架构设计
王明芬1 ,陈锐旺2
(1.福建师范大学协和学院信息技术系,福建福州 350117;
2.福州迅腾网络技术有限公司,福建福州 350004)
摘 要:结合微服务和Docker 容器化技术构建高可用性的Web 系统架构, 首先使用开源容器引擎Docker 打包微服务应用,然后运用Kubernetes 平台编排容器,设计系统业务运维的资源调度.实验表明系统能够实现系统的高可用性以及系统资源弹性调度,提升集的资源利用率.
关键词:微服务;Web 架构;Docker 容器;容器编排
微服务项目技术架构
中图分类号:TP39  文献标志码:A  文章编号:1008-3421(2020)05-0008-07
基于传统的Web 系统架构模式,即采用单体架构或面向服务的架构(SOA)存在诸多不足.比如资源扩容难,运维难度大,平台即使只是改动一个小功能,也需要将整个应用重新发布,容易由于系统升级而造成线上业务停顿.随着在线用户数量以及数据规模的增长,传统Web 系统架构的开发、测试、部署、维护愈发困难,已经不能满足当前需要[1].目前Docker 的细粒度微服务已逐渐成为Web 架构设计主流,将网站的系统功能划分为多个独立的服务,大大提高了系统资源的灵活度.文章针对传统Web 结构资源难编排、不能快速扩容等不足,结合微服务和容器化技术,设计基于Docker 容器化技术的Web 架构,通过资源调度和系统容器的弹性伸缩提升网站平台的高可用性和可扩展性.1 容器集化原理
Docker 是一种开源的软件容器平台,开发人员可将其应用程序和依赖项打包到可移植镜像中,这对于应用程序的部署和扩展都很方便.通过Docker 打包的应用程序与业务功能匹配的微服务部署到云平台,可以选择一键式部
署方法.它的横向扩展和持续集成的功能大大提高部署和运营效率.微服务和Docker 容器的组合可以解决构建大量系统应用程序时的困难、系统模块的可重用性低以及操作和维护困难等问题 [2-3].使用Docker 技术可以轻松隔离和划分设备资源,同时由于Docker 本身的超轻量级特性,可以高密度地部署设备.多设备有利于实现高可用性和高弹性的应用,从而最大限度地利用和调度资源.
Kubernetes 是一个强大的开源分布式架构,主要用于容器应用的编排,可以实现自动化调度、资源分发.由于容器快速启动的特性,可以在业务高峰时快速启动成百上千个容器来负载应用,如果物理机资源不足可以使用join 命令将新机器加入集.同时Kubernetes 的智能负载均衡器让业务在更新或是回滚上线时实现无停机,可以有效提高资源利用率和应用服务质量,有着出的用户体验.云原生时代Kubernetes 已成为IT 自动化的基石[4-5].1.1 系统总体架构设计
Docker 容器在底层的Kubernetes 集中运行,集中的数据保存在Etcd 中.系统架构可
王明芬,等:基于Docker的Web系统架构设计
第5期9
以集化部署Etcd,从而实现数据存储的高可用.为了应对人员流量的突然增加和主机的突然中断,Kubernetes集进行高可用性和负载平衡的设计.
Kubernetes由Master节点和多个Node节点组成.Master主要负责节点的管理和资源的调度,Node是工作负载节点,作为分布式部署节点与Master通信[6].基于Docker的Web 架构设计如图1所示,系统集由3台机器组成,分别为Master管理节点、Node1工作节点和Node2工作节点.
1.2  系统节点设计
Master管理节点的核心组件如下.
Etcd:开发的分布式键值存储模块,可用于服务发现,共享配置和一致性保障.
API  Server:提供集管理的REST API 接口,包括身份验证和授权,操作资源以及其他模块之间的数据交互和通信.在架构中只有API  Server能访问Etcd.
Scheduler:负责将Pod分配和调度到集中的节点上. 它在API  Server中查询并侦听尚未分配给节点的Pod,然后根据调度策略将节点分配给这些Pod .
Controller Manager:控制器模块就是集的大脑,它通过API  Server监控整个集的工作状态,并确保工作状态达到预期.
Node工作节点的核心组件如下.
kubelet:接收并执行Master发出的管理Pod和Pod容器的指令.每个kubelet进程节点的信息在API  Server上注册,并定期向Master 节点报告该节点的资源使用情况.
kube-proxy:监听API  Server中服务和pod节点的变化,并通过IP表配置服务的负载均衡.
Pod: 工作节点中的每个Pod对应一个用于支撑线上教育平台业务运行的微服务.
如图1所示,Node1中的Pod运行的是Web Server服务,Node2是MySQL服务,两个Pod通过节点中的kube-proxy进行通信支撑整个业务的正常运行,每个Pod都有自己的IP地址,但管理人员和用户并不需要关注这些Pod的IP,因为当管理节点监控到某个Pod 的健康状况不佳时就会清除并重启这个Pod,所以Pod的IP地址都是不固定的,底层都是Docker引擎.
2 基于Docker的Web架构实现
微服务架构的核心是将大型单体应用程序拆分为很多小的相互关联的微服务,每个微服务后面有多个镜像在支撑业务.这些特性为后期微服务的拓展提供了基础,用户可以方便地在原有业务基础上进行功能模块的拓展.文章设计的线上教育平台的数据库和Web应用服务器就是两个微服务.
容器技术为微服务理念提供了一种匹配的实现机制,这能够解决当前传统Web平台的问题.轻量级且可以实现虚拟化运行环境的Docker容器为微服务提供了理想的载体[7].轻量级的Docker容器是微服务的最佳
运行环境,微服务应用在容器环境下运行时才能有效提升运维效率.
2.1 环境搭建
用3台机器来搭建容器集平台,其中一台为Master节点,另两台为Node节点.选定操作系统,设置初始的集IP地址和外部IP 地址,物理机具体配置如表1所示.
系统为所有节点角分配及文件添加全域名运维/开发
用户
图1 容器化的Web系统架构设计
10
福建师大福清分校学报 2020年10
解析,安装与配置容器集化的流程如图2所示.
操作系统配置角外部IP 集IP Hostname Centos7.6_18102G/20G Master 192.168.127.16110.0.0.1k8s-master Centos7.6_18102G/20G Node1192.168.127.16210.0.0.2k8s-node1Centos7.6_1810
2G/20G
Node2
192.168.127.163
10.0.0.3
k8s-node2
表1 实验硬件环境
配置成功后查看集状态都是Ready,同时显示生存时长和版本号.2.2 构建Web Server
首先部署Web 服务器,创建Web Server 的 Pod 资源, Node1部署为Web 服务器.其次部署Web Server 的服务功能,主要涉及到IP 地址和类型、通信协议、API 版本、命名空间、端口号、服务功能等配置,完成后网络信息如图3所示.
2.3 构建数据库资源
部署MySQL 服务器,创建MySQL 的Pod 资源,Node2部署为MySQL 服务器.部署MySQL 的服务功能,主要涉及到的网络服务
功能等配置与Web 服务器类似,完成后网络信息如图4所示.
修改配置文件中数据库的IP 地址参数,使得数据库应用与集关联,如图5所示
.
图3 Web Server
网络信息
图4 MySQL 网络信息
图2  容器集化流程
王明芬,等:基于Docker 的Web 系统架构设计
第5期11
2.4 资源调度
Web 系统架构中采用Docker 作为微服务的载体,由于在具体的应用中可能需要分割出大量的微服务,因此要调用Kubernetes 自带的插件式调度器.它通过默认算法分配和调度具体的Pod 来运行微服务程序,每次调度一个Pod 容器,通过初选以及优选策略来决定待调度容器的最优Node 节点[8].文章采用资源负载均衡调度法,如图6所示.
所有待调度容器组成待调度Pod 队列,所有可选的Node 节点组成Node 队列,调度器循环执行,每次取出待调度Pod 队列的队首元素进行调度.首先进行预选策略,遍历所有Node 节点或者部分节点,根据待调度容器的CPU 内存等资源需求来筛选Node 节点,去除掉不符合最基本资源需求的节点.接着采用资源利用最均衡优先级函数来打分,根据分数高低选择最优的Node 节点.最后将待调度容器绑定到目标最优节点,启动容器即完成单个容器的调度过程[9-10].
该调度策略是从系统资源利用平衡度的出发,为了避免出现CPU、内存消耗不均衡的情况.该调度策略的打分标准公式如下:
score=10-abs(a-b )×10
(1)其中 a 为CPU 的申请率CPUFraction,b 为内存资源的申请率memoryFraction,两者均表示为请求数与资源的比值.当CPUFraction 与memoryFraction 的值相等时,分值score
最高.
5 实验数据库配置
图6 资源负载均衡调度法
12
福建师大福清分校学报 2020年10月
2.5 弹性伸缩设计
Web 系统的流量并发既具有周期规律又具有不可控的突发因素,实际应用中的不确定性需要集具有伸缩性.综合资源CPU 利用率,Kubernetes 提供实现Pod 水平自动伸缩功能的HPA 策略(Horizontal Pod Autoscaler)来支持集的弹性伸缩.传统的HPA 策略V1版本资源伸缩时只关注CPU 的利用率,但是一般的网站不仅对CPU 资源需求高,而且对内存资源的需求也比较高.文章通过资源监控采集到CPU 和内存的利用率,采用求二者均值的方式来调度资源.
如图7所示,Kubelet 启动容器组的容器时,HPA 通过集内的资源监控系统来获取集中资源的使用状态.系统将CPU、内存以及用户自定义的最大使用率等参数进行权值调和,根据指标参数来制定一个阈值,一旦超出阈值,HPA 就会自动计算伸缩尺度,决定增加或者缩减Pod 副本.
计算每次扩容或者缩容的Pod 的数量采用Ceil 函数:Ceil((目前使用率 /自定义最大使用率) * Pod 数量).该函数返回大于或者等于表达式的最小整数.且为了系统的稳定,规定每次扩容Pod 数量不会超过当前Pod 数量的2倍.3 实验测试结果3.1 高可用性测试
在集中和外网机器上都是使用WebServer 的地址访问网页,如图8所示.
基于微服务和容器的Web 系统架构可以
保持高可用性和健壮性.当网站的Pod 出现故障或者网站更新上线时,都无需中断当前业务的运行,系统会自动调度资源,用户体验是无感的.
高可用功能测试时,首先关闭运行MySQL 数据库Pod 的Node 节点[root@k8s-node2 config]# shut down now. 此时数据库已断开,如果没有采用Kubernetes 的Docker 集调度,则用网站停止运行,网页提示连接数据库失败,
如图9所示.
Kubernetes 集管理检测到Node2的数据库Pod 失效,立即启用资源负载均衡调度法最后选择在Node1创建MySQL 的Pod 用于支撑业务运行,恢复速度取决于集服务器性能,在生产环境中通常是几秒之内,Pod 申请创建并成功运行.再次测试网站业务,显示业务正常,如图10所示.
业务在Kubernetes 集的其中一个工作节点上运行,当工作节点意外宕机之后,Node 节点的Kubelet 还能访问到另一个主节点的API  Server 等组件进行运行、自动重调度、自动重启、自动复制,当支撑业务运行Pod 所在
节点出现问题时,管理节点会检测到并在几秒
图8 访问Web
网站
图9 网站业务中断
图 7 HPA 弹性伸缩策略
HPA 策略
伸缩尺度
指标权值调和部署
资源监控
CPU 指标
内存指标
自定义指标
Pod1PodN

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。