一、Rainbond总体技术架构

整体架构 - 图1

Rainbond践行以应用为中心的理念,吸纳优秀的社区解决方案,形成了应用控制、应用运行时,集群控制三大模块结合的数据中心技术架构,结合跨数据中心的上层结构应用控制台和资源控制台,形成了完整的PaaS平台解决方案,下面将对每个组件和重点流程进行介绍:

二、Chaos组件之应用构建(CI)

整体架构 - 图2

​Rainbond 应用构建(CI)的过程是将输入介质:源代码 或 Docker镜像进行一系列处理,最终生成 应用抽象 介质的过程。

此过程可重复操作,从而生成一系列的应用版本。

传统意义上说,完整的CI过程会包括:设计、编码、打包、测试和发布,Docker自推出以来逐步成为众多应用代码打包的新形式。

现有的CI产品中已经在源码测试和Pipline方面做得非常成熟,例如Jenkins,Gitlab等,因此Rainbond在对于源码或Docker镜像的前置处理方面可以直接对接第三方服务,由第三方服务处理完成的源码或镜像再对接到 Rainbond-Chaos 模块进行应用抽象。

这样Chaos的输入源是支持Git协议的代码仓库,Docker镜像仓库。如果是源代码,Chaos智能判断源码的类型,例如Java,PHP,Python,Dockerfile等,根据不同的源码类型选择对应的BuildingPack进行源码编译,同时识别源码中定义的运行环境要求参数,应用端口、环境变量等参数,形成应用抽象的配置雏形。除了Dockerfile以外的源码类型将被编译成应用代码环境包(SLUG)存储于分布式存储中,其他的生成Docker本地镜像存储于数据中心镜像仓库中,结合应用的各类属性信息形成应用抽象包

  • 关于源码编译的BuildingPack参考各语言支持文档
  • Chaos组件支持多点高可用部署,多点部署从MQ组件获取应用构建任务。

三、Worker组件之应用部署(CD)

整体架构 - 图3

worker组件将chaos构建出来的应用抽象进行实例化,配属应用运行需要的各类资源,完成应用生命周期中的运行态部分(CD)。

应用生命周期中可能经历启停、升级与回滚。不同的应用类型需要进行不同的控制策略,例如无状态应用能够进行无序的滚动升级,而有状态应用的升级控制策略将更加复杂。

应用运行需要各种外部环境支持,例如需要分配租户IP,端口等网络资源,需要根据应用设置配属持久化存储资源,例如共享文件存储分配存储目录,块存储等依托各类插件分配存储资源。根据应用依赖属性建立服务发现和负载均衡策略供给mesh插件。根据应用属性生成调度策略调用Kubernetes集群调度应用运行。

目前Rainbond使用Kubernetes以下资源类型:ReplicationController、Deployment、Statefulset、Service、Pod。对于用户来说,无需理解这些资源,我们产品中也不体现,其只是应用运行的载体。

worker组件功能分为有状态部分和无状态部分,为了实现worker组件的集群部署,worker进行了主节点选举,当选主节点的服务将额外启动一个gRPC服务,提供应用状态等数据服务

四、Entrance组件之应用负载均衡(LB)

整体架构 - 图4

当应用成功运行后,面临的就是如何访问的问题,下面就详细讲解Rainbond在应用运行后所做的处理:

  • 应用运行时会为每个租户分配子网
    • 租户之间网络隔离,因此集群内运行的应用不能之间被外网访问到。
    • 应用每次启动IP地址跟随变化,所以租户内应用与应用直接也无法直接访问。
  • 配置应用端口策略,平台设计了应用端口的服务控制,具有两种类型
    • 对内服务:对平台内部应用开放,并加入到租户级别内部负载均衡,内部应用间访问通过ServiceMesh实现
    • 对外服务:对平台外部应用开放,并加入到平台全局负载均衡
  • 设置应用协议类型,应用支持HTTP和TCP协议的应用,并支持添加到负载均衡

Entrance组件支持集群部署,并通过etcd实现全局资源一致性,可防止了对同一个资源操作的重复进行。

五、Eventlog组件之应用日志处理

​Rainbond平台需要处理的日志和消息信息包含三大类,分别为:用户异步操作日志、应用构建日志和应用运行日志,下面针对这三类日志加以详细说明。

5.1 用户异步操作日志

对于用户操作日志,我们需要分布式跟踪每一次操作的最终状态,目前由eventlog组件根据每一次操作的日志汇聚判断操作的最终状态。其他组件在处理某一次异步任务过程中会将过程日志记录通过gRPC消息流发送到eventlog集群。

5.2 应用构建日志

主要展示源码构建或Docker镜像构建的输出信息,这些信息来自于Chaos组件。

5.3 应用运行日志等

关于应用日志,目前我们分为两种形式:

  • (1) 标准输出/错误输出的日志

对于标准输出的日志,Rainbond定制了docker日志处理驱动插件,基于TCP数据流通信实现将所有计算节点的容器日志实时送往Eventlog组件按照应用级别的汇聚,从而进行存储和实时推送到UI。

  • (2) 输出到持久化文件的业务日志(访问日志)

对于输出到持久化目录的业务日志,一般需要对其进行自动分析,例如对接ELK系统,因此在插件体系中安装日志处理插件,收集持久化目录的日志文件输送到第三方日志分析服务上。

随着集群规模越大,运行应用越多,日志处理量非常大,因此我们实现了Eventlog的集群,每一个应用的日志在传输之前会选择送往的eventlog服务节点,类似于数据分区。选择过程中做了均衡分配处理,例如当前有10000个应用,3个eventlog服务节点,将做到每个eventlog节点分别处理3000左右应用日志。

由于各种实时推送的需要,eventlog组件实现了websockt服务。

六、Webcli组件之应用容器控制

该组件实现了通过web的方式连接到容器控制台的功能。该组件通过与UI进行WebSocket通信,用户可以通过模拟Web终端发送各类shell命令,webcli通过kubernets提供的exec方式在容器中执行命令并返回结果到Web终端。

Webcli属于无状态组件,天然支持多点高可用部署。

七、Monitor组件之集群监控

Rainbond集群需要多个维度的监控:

  • 应用业务性能级
  • 应用容器资源级
  • 集群节点级
  • 管理服务级
    Rainbond借助Prometheus封装了Monitor组件,能够自动发现以上描述的各类监控对象并完成配置,将监控目标纳入Prometheus监控范围。Rainbond各组件也都实现了Prometheus的exporter端暴露监控指标。

Prometheus有单点性能障碍,例如单节点服务监控目标越多,内存与磁盘使用量大等问题,对于大型集群,我们借助monitor组件实现了Prometheus多点数据分区运行,并建立了Prometheus的集群查询机制。

除了监控我们还需要报警,monitor能够自动配置一些默认的报警规则,自定义的报警规则支持将在资源管理后台体现,后续将支持命令行控制。Prometheus发出报警信息到monitor,完成去重,忽略等操作后根据级别与用户需求完成邮件、微信、站内消息等报警方式。

八、Node组件之集群节点管理与ServiceMesh

整体架构 - 图5

Node组件是Rainbond集群组建的基本服务,集群内所有节点都需要运行该组件。

运行于管理节点的Node具有master角色,维护所有节点的状态与健康检查。在监控方面,Node暴露出节点的操作系统级别各类指标(集成promethes node-exporter),同时定时检查不同属性的节点上运行的各类服务状态,网络状态等。监控到问题并尝试自动处理,以提供集群自动化运维能力。

​第二方面,所有计算节点运行的Node服务组建起租户网络内运行应用的运行环境支持,特别是ServiceMesh支持。

整体架构 - 图6

Node提供了envoy的全局化配置发现支持,跟应用绑定的envoy插件通过宿主机网络跳出租户网络,访问到Node服务,并最终获取全局的服务网络治理配置。其他应用插件使用同样的机制从node服务中动态获取配置,应用运行信息等。

九、MQ消息组件

​MQ组件是基于etcd实现的轻量级分布式、消息持久化和一致性的消息中间件。该组件维护异步任务消息,提供多种主题的发布和订阅能力。

我们没有选择使用已有的消息中间件服务,主要是我们要实现分布式消息,还要保证消息的一致性,评估了现有的方案后都觉得不太合适且复杂,因此我们基于etcd的分布式能力实现了轻量级MQ组件,提供了gRPC和http两种接口实现pub/sub。

十、App-UI组件

应用控制台UI组件作为Rainbond以应用为中心抽象的关键模块,面向应用开发者和应用使用者。基于Django+Ant design前后端分离架构设计,提供用户对应用抽象、应用组抽象,数据中心抽象,应用市场抽象提供交互体验。实现完整的应用创建、管理流程,应用交付分享流程等。

十一、Resource-UI组件(企业版)

资源控制台UI组件提供Rainbond集群资源管理,计划支持对接IaaS的资源管理能力,面向运维人员设计。关注节点物理资源,集群资源,管理服务资源,应用实际使用资源,租户资源等管理。Rainbond自动化运维能力的关键展示平台。

十二、命令行工具grctl

grctl命令行工具提供一些有趣实用的应用管理功能和集群运维功能,并逐步丰富中。对于开源使用用户来说在没有ResourceUI的情况下方便进行集群管理和运维。