PAAS的架构设计与应用实践(一)

CloudSpace是一个平台即服务(PaaS),它提供给开发者自由的去选择云平台、开发框架和应用服务,使得开发者可以更快更容易的开发、测试、部署和扩展应用,让开发人员专一于编写应用程序,而无需为中间件和基础设施分心。团队在使用自助式高生产力的框架和应用服务的同时,开发人员能够快速在本身的环境上开发和测试本身的下一代应用,并能部署到云上而无需作任何更改,大大提高持续快速,高质量地交付价值的能力。java

1、 PaaS解决了什么问题?web

     PaaS为开发者提供应用全生命周期的服务能力,主要有两方面:sql

  • 是提供了资源资源和服务集成的平台,如  存储、数据库、缓存和搜索等;docker

  • 服务端应用程序的运行环境,如  Web应用和Work应用等;数据库

PaaS架构设计要提供多租户的应用平台,多租户间的隔离机制(Nodes、Network、IO、Runtime、Services等)很是重要,对于隔离要关注如下方面:缓存

  • 资源隔离和约束安全

       指应用间的容器配额cpu、io、内存等资源要相互不受影响。cookie

  • 访问控制网络

       包括应用间的网络访问控制和本地IO访问控制。架构

  • 数据和数据服务

       Container只挂在归属应用自身的UnionFS 

       OVS针对服务实例实施白名单策略

       相似S3等块存储自然隔离

 

PaaS平台主要支持了通用应用架构应用运维两方面能力:

  1. 支持应用架构能力

  

      随着应用架构迭代,平台最终将应用抽象为两种类型web和work。区分两种类型, 就是看应用提供的是http能力,仍是socket能力。对于通用应用架构,与框架无关,具备无状态、分布式、通用性三个特性。

  • 对于无状态

       一个应用一般有多个实例集,单实例失去服务能力不影响应用的服务。应用开发时,不要将状态与实例耦合,一般采用实例以外通用存储来保证状态一致性。

  • 对于分布式

       一个应用一般要进行集群部署,而不是单个应用部署。具体这样的特性,必须在应用开发时,注意扩展性,不要将配置与实例耦合,一般采用实例以外通用配置中心来保证应用独立性。

  • 对于通用性

       更可能是从应用和服务角度来作定义,对于应用来说,从调用关系来看,可分为对外或对内调用,应用间通讯抽象为同步(经常使用Http)或异步(经常使用Message);对于服务来说,从中间件角度来看,都应该具备分布式能力(分布式cache、分布式db等),而且提供数据的安全访问机制,屏蔽应用交互差别,作到通用模型。

 

2. 支持应用运维的能力

       运维一般划分为基础运维和应用运维。对于基础运维,主要负责物理设备及网络等基础建设,更偏底层。对于应用维护,主要围绕应用构建全方位服务,如 虚拟资源,网络规划,软件预装、应用,安全、日志等管理服务,一直以来都在推进运维工做的自动化、规范化和简约化,但仍然面对不一样应用团队个性化的挑战,这些都应该有PaaS平台统一解决。

 

2、PaaS架构设计

 

  

  

CloudSpace围绕AppEngine核心采用了容器级的PaaS模型来设计,其设计目标为: 

#可用性,利用组件冗余的设计,知足应用7*24的服务。

#伸缩性,利用规则引擎的设计,知足应用所属实例的动态调度。

#安全性,利用软控制策略,实现了应用与服务的网络隔离和流量控制。

#省成本,利用虚拟化和自动化运维,节省资源,节省运维,按需计费。

#灵活性,利用容器技术,隔离环境,支持多语言,自定义软件栈,  个性化配置等。

 

 

CloudSpace对于App的访问,有Lvs集群接入,经过Router来路由到具体App分配到宿主机(N)->容器(C)->实例(I)。对于三者关系, 对于PAAS平台,会维护一个机器池,每一个机器称为宿主机,每一个宿主机上有多个容器,每一个容器会部署一个App的实例。对于App在平台上,实例的分布有Master基于数据决策,调度到不一样宿主不一样容器,达到动态缩扩容要求,知足应用的性能变化。

1.Node分层视图

  

对于PaaS平台部署应用最小物理单元为Node,从结构上分为三层:

第一层为机器(简称Machine),提供给容器虚拟化的物理集群,对应用透明。

第二层为容器(简称Container),提供给App部署最小虚拟化单元,对应用透明。

第三层为实例(简称 Instance),提供给App运行的实例,依赖软件栈配置。

 

2.Container技术

主流PaaS模型包括 进程级、容器级、VM级,三种最重要区别隔离机制实现策略不一样。

对于CloudSpace的容器技术迭代经历了两个重要版本: 

第一种:LXC 基于容器的虚拟化技术

  • 共享OS和内核

  • User Space + Kernel Space

  • Cgroup + Namespace

  • 容器的建立,销毁,启动,中止

      命令:  lxc-create, destroy,start,stop,attach, execute

第二种:Docker 轻量级的操做系统虚拟化解决方案

  

 

Docker是一个构建在LXC之上的,基于进程容器的轻量级VM解决方案。

  • 与VM不一样

    Docker则直接在宿主平台上加载运行应用程序. 本质上他在底层使用LXC启动一个Linux Container,经过Cgroup等机制对不一样容器内运行的应用程序进行隔离,权限管理和quota分等,每一个container拥有本身独立的各类命名空间(亦即资源)包括:  PID 进程, MNT 文件系统, NET 网络, IPC , UTS 主机名等。

  • 与LXC不一样

    Docker是Lxc的一个高级封装,提供了各类辅助工具和标准接口方便使用,能够依靠Lxc和各类脚本实现与docker相似的功能。除此以外,Docker核心思想就体如今它的运行容器构建方案上, 为了最大化重用Image运行时所构造的运行环境,其实是由具备依赖关系的多个Layer组成的。有了层级化的Image作基础,不一样的APP共用底层文件系统及相关软件栈,同一个APP的不一样实例也能够实现共用绝大多数数据。

  

CloudSpace系统(如上图)有六大组件构成:

1.Agent组件(应用代理)

  

  • 容器生命周期

    容器建立/配置/启动/中止等指令,有Master经过Agent下发执行,应用于容器的生命周期。

  • 语言运行环境初始化

    容器自己语言无关,但在启动时会指定语言类型(如java),并初始化语言相关的软件栈(如 Jetty),为应用配置好环境。

  •  与Master交互命令

    Agent与Master经过消息方式进行通讯,接受Master对容器与应用的控制。

  • 运行数据采集

    Agent负责对应用依赖的机器和容器,进行性能数据采集(如 cpu,load,io等)。

  • APP状态管理

Agent负责对应用的可用性进行健康检查。

 

2.Router组件(路由)

  

CloudSpace部署多个Router共同处理全部HTTP流量。Controller得到信息并实时更新路由表,持续维护分布式路由状态,并将用户请求URL的访问路由至具体的应用,保持在应用实例之间分发流量实现负载均衡。

  •  Dynamic Upstream

APP在Master调度过程当中,会动态更新Router中的映射地址,即为用户访问APP的域名与容器地址,便于支持APP的动态所扩容策略。

  •  Management Interface

Router开放接口,来支持Master围绕APP动态load配置信息,实时控制应用链路映射,支持相关特性实现。

  • Http/Https

Route支持针对有https需求的应用配置https证书能力。

  • Sticky Session

      Route反向代理应用请求,能够根据配置支持IPHash能力,便于应用支持粘性会话功能,但在实例调度时,仍然失效,只能必定程度保持状态。更好建议是采用分布式集中缓存的token或cookie方案来实现。

3. Master组件(控制)

Master是PAAS平台最核心的控制中心,主要围绕APP针对网络和实例进行管理。对网络利用SDN来进行多APP及服务间访问限制;对于实例集中在资源分配和实例调度两方面,最重要利用规则引擎实现了动态缩扩容,支持应用的弹性部署,可以从容地应对业务的流量高峰。

  • 对于APP资源分配,就是容器数量与类型配置选择。对于已选定的APP资源也能够进行扩展,即分为横向扩展(实例数量)和纵向扩展(实例配置)。

  

  

  • Master主要依据APP的指标设置规则和采集机器及容器的性能数据作动态分析,对于APP实例调度,支持四种策略来实现自动缩扩容。

 

  

 

  • 策略一:负载调度

若APP部署了三个实例(A/B/C),围绕APP的三个实例的负载数据(cpu/mem/load等)进行采集,而后计算APP平均负载指标,来对比指标设置数据,若达到阀值,就触发APP负载调度。Master会计算须要扩容3个实例能达到阀值如下,接着在剩余资源中找到不一样宿主机(负载最低)启动APP的新实例DEF,最终APP启动了六个实例来服务线上业务。

  • 策略二:性能调度

若APP部署了三个实例(A/B/C),围绕APP的三个实例的性能数据(qps/tps/rt/等)进行采集,而后计算APP平均性能指标,来对比指标设置数据,若达到阀值,就触发APP性能调度。Master会计算须要扩容3个实例能达到阀值如下,接着在剩余资源中找到不一样宿主机(负载最低)启动APP的新实例DEF,最终APP启动了六个实例来服务线上业务。

  • 策略三:故障调度

若APP部署了三个实例(A/B/C),围绕APP设置健康检查配置(端口、协议和频次),Agent周期进行健康探测,而后根据结果状态判断来触发故障调度。故障分为三种Node、Container,无论那种故障类型,只是调度范围不一样。对于Node,是针对Node上全部app,对于Container,是针对Container内app,首先Master要发指令给Router,剔除掉原有映射关系,避免请求到故障实例上。对于负载和性能调度策略,在缩扩容时也要考虑映射关系动态变动。

  • 策略四:最大最小调度

对于APP的业务有高峰有低谷,经常流量不平均,指望在高峰时扩容,低谷时缩容,提高对资源利用率。正式这种考虑,须要依据APP最小最大调度数设置(如: 3<x<6),Master利用规则引擎,实现自动缩扩容。围绕APP动态计算性能和负载的综合数据指标,并进行同比和环比计算,来预测指标趋势,最终决定是要扩仍是缩。

 

总结:自动缩扩容机制,本质上是利用Router的动态Upstream机制,实现APP指望的实例数动态映射。如今有不少网关方案均支持这种特性,感兴趣也能够研究下k8s,比原有方案会简单很多。

 

4.Monitor组件(监控)

  

对于监控来说,基于日志自研的APM系统,对于APP的应用请求和业务日志经过Flume采集,通过实时计算分钟级的性能指标(机器/容器/APP),存储在数据库中,提供Console进行可视化展现,同时让开发者能够基于ES查询实现日志搜索查询。

 

5.Service组件(服务)

Sevice是一个独立的、插件式的模块,便于第三方方便地把本身的服务整合成CloudSpace服务。在此PAAS平台中已经包含了服务的框架及核心类库,如MongoDB、Mysql、 PostgreSql、RabbitMQ、Redis和ElasticSearch等,而且第三方能够继承Node和Gateway基础类来开发本身的服务。

 

6.Net模块(网络)

PAAS平台主要采用了floodlight实现SDN功能,来控制容器的OVS的配置,实现APP间的网络限制功能。对于floodlight的高可用利用ZK特性实现了M/S架构二次开发,并对ovs可视化视图进行了指标优化,进而提高了平台安全性。

 

3、CloudSpace架构设计将来规划

 

1.支持多平台多区域

  • 支持多平台:

考虑多平台的资源集成架构设计,增长Azure,Aws等资源平台。

  •  支持多区域:

考虑多Region架构设计,支持后续会逐步增长节点

2.支持开放平台原则

  • 持续完善OpenApi

      便于第三方管理平台集成服务

  • 接入更多的服务

      便于知足用户更多的业务需求

3. 支持AIops功能

在不断完善devops外,引入更加智能aiops,为用户提供一致的开发/测试/生产环境,更好的提高交付价值的效率。

4.  支持新应用架构

   跟进新一代微服务技术Service  Mesh的发展。