技术架构
Rainbond 技术架构
Rainbond 践行以应用为中心的理念,吸纳优秀的社区解决方案,形成了应用控制、应用运行时,集群控制三大模块结合的数据中心逻辑技术架构,结合以管理节点、计算节点、网关节点、存储节点给类 节点类型划分的物理架构形成高可用、高扩展性的数据中心架构体系。
在数据中心架构之上,根据使用目标人群划分为应用管理控制终端和资源管理控制终端,来分别服务于应用开发运维者和资源使用者。支撑用户同时管理和控制多个数据中心的多数据中心模式。
数据中心服务组件说明
数据中心 API 服务
API 服务作为数据中心级抽象的核心控制服务,对外提供 Restful 风格的 API 服务,是数据中心控制请求的唯一入口,安全控制基于 TLS 双向安全认证。自主签发证书后分发到客户端。

API 服务请求进入后由 router 模块进行请求分发,普通请求进入 Handle 请求处理模块,这类请求主要是操作数据库模型的请求,API 服务基于 ORM 支持 Mysql 数据库和 CockroachDB 数据库。进入 Proxy 的请求分为 API 请求和 Websocket 请求。由 Discover 模块通过 etcd 服务发现其代理目标并转发请求。因此其他组件提供的 API 可通过服务注册由 API 服务代理转发请求。
应用网关服务
应用网关是外部流量进入 Rainbond 租户内部组件的唯一 入口, 提供 HTTP, HTTPs 路由, TCP/UDP 服务, 负载均衡器, 高级路由(A/B 测试, 灰度发布),虚拟 IP 支持等功能.
应用网关的设计灵感来自于 NGINX Ingress Controller, 基于从 kube-apiserver 将监听到的 Kubernetes 资源(Ingress, Service, Secret, Endpoint)模型转化为 Proxy 控制器的配置,提供一种自动工作、实时生效、动态热配置的 7 层、4 层网关服务。
应用网关可以通过水平扩展的方式来增加并发能力和基础性能,通用配置在所有网关节点中同步生效。对于 74IP+

单节点应用网关服务的架构目标是支持多种数据源、支持多 IP、支持高并发能力、支持多 Server 能力、支持动态配置变化能力。基于此需要应用网关架构设计如下:

应用网关服务集成 Openresty 服务作为前置流量代理服务,基于 lua 对 Openresty 实现功能扩展,Lua-Config-Controller 实现对 Openresty 的动态配置、Upstream 管理、负载均衡策略实现, Lua-Monitor-Controller 实现对请求数据的记录和汇总上报、Lua-Security-Controller 实现对请求的安全控制。三个 Lua 模块由 Openresty-Controller 驱动工作,Metric-Controller 模块汇聚网关的各类监控数据并向外暴露 Prometheus 规范的 Metric-Server。Openresty-Controller 由数据驱动,数据来源于 Gateway-Model-Controller,两层无耦合关系,其实现了标准的接口规范。根据需要我们可以实现基于其他 proxy 服务的驱动器,比如 F5。
应用网关的数据模型来源支持 kubernetes 的 ingress 模型或从 etcd 中发现精简模型,由数据发现服务驱动整个网关动态工作。IP 是网关的重要资源,IP-Port-Pool 模块启动后将获取当前集群的所有可用 IP 地址和端口,并建立对 IP 地址变化 的感知,IP-Manage 模块将根据 IP 和端口数据判断网关策略是否在当前节点生效。
应用构建服务

Rainbond 应用构建服务处理 CI 过程,将输入源包括 源代码
或 Docker镜像
或 应用市场应用
进行解析、编译、打包,最终生成 应用(组件)的版本介质。
传统意义上说,完整的 CI 过程会包括:设计、编码、打包、测试和发布,Docker 镜像自推出以来逐步成为众多应用代码打包的新形式。现有的 CI 产品中已经在源码测试和 Pipline 方面做得非常成熟,例如 Jenkins,Gitlab 等,因此 Rainbond 在对于源码或 Docker 镜像的前置处理方面可以直接对接第三方服务,由第三方服务处理完成的源码或镜像再对接到 Rainbond-Chaos 模块进行应用抽象。
Chaos 的输入源是支持 Git、Svn 协议的代码仓库,Docker 镜像仓库。如果是源代码,Chaos 智能判断源码的类型,例如 Java, PHP , Python, Dockerfile 等,根据不同的源码类型选择对应的 BuildingPack(源码构建器)进行源码编译,同时识别源码中定义的运行环境要求参数,应用端口、环境变量等参数,形成应用抽象的配置雏形。除了 Dockerfile 以外的源码类型将被编译成应用代码环境包(SLUG)存储于分布式存储中,其他的生成 Docker 本地镜像存储于数据中心镜像仓库中,结合应用的各类属性信息形成应用组件属性。
应用构建服务是无状态架构,由消息系统(rbd-mq)驱动的任务执行器设计。 实现了 Git 客户端和镜像仓库客户端,集成了 SVN 客户端来获取组件构建源资源。 任务执行过程记录完整日志由 event 客户端通过消息流将日志输入到 rbd-event-log 服务。每一个源码构建过程由 Chaos 控制调用本机 Docker API 创建构建容器并维护容器生命周期。
源码构建过程是一个非常消耗资源的过程,因此应用构建服务支持多节点部署来增加并发支持的构建任务数量,每一个节点支持的最大并发构建数量由节点 CPU 核数确定或运维人员手工设置。
- 关于源码编译的 BuildingPack 参考 各语言支持文档。
- 应用构建服务支持多点高可用部署,多点部署从消息中间件获取应用构建任务。
应用运行时控制服务
应用运行时控制服务将 Rainbond-Application Model 进行实例化转化为 Kubernetes 资源模型,配属应用运行需要的各类资源,完成应用生命周期中的运行态部分,可以理解为 CD 控制服务,该服务的设计要点是支撑大量应用的生命周期监管。
应用生命周期中可能经历启停、升级与回滚。不同的应用类型需要进行不同的控制策略,例如无状态应用能够进行无序的滚动升级,而有状态应用的升级控制策略将更加复杂。Worker 服务中实现各类组件类型的生命周期控制器器、包含启动、停止、更新、伸缩等待。
应用运行需要各种外部环境支持,例如需要分配租户 IP,端口等网络资源,需要根据应用设置配属持久化存储资源,例如共享文件存 储分配存储目录,块存储等依托各类插件分配存储资源。 根据应用依赖属性建立服务发现和负载均衡策略供给 mesh 插件。根据应用属性生成调度策略调用 Kubernetes 集群调度应用运行。
目前 Rainbond 使用 Kubernetes 以下资源类型:Deployment、Statefulset、Service、Ingress、Secret、ConfigMap、Pod。对于用户来说,无需理解这些资源,产品中也不体现,其只是应用运行的载体。
Worker 组件功能分为有状态部分和无状态部分,为了实现 worker 组件的集群部署,worker 进行了主节点选举,选举为主节点的服务将提供应用存储 Provider 和存储统计服务。
Worker 组件是 kubernetes-controller 控制器扩展和调度器扩展的模块,目前有实现本地存储 Provider,有状态组件的共享存储 Provider 等等,其同时会获取 Kubernetes 集群中已有的资源供 Rainbond 应用组件选择使用。
Worker 组件可支持多节点部署已保证高可用性。
监控服务
Rainbond 集群监控服务的设计目标是对应用业务性能级,应用容器资源级,集群节点级,管理服务级四个维度进行全面监控,从功能上提供数据存储、查询、可视化和报警,从性能上支持大规模集群。
Rainbond 基于 Prometheus 封装了 Monitor 组件,通过从 etcd、Kubernetes 集群中自动发现应用、集群、集群节点服务的各类监控对象并完成 Prometheus 监控目标配置,将监控目标纳入 Prometheus 监控范围。Rainbond 各组件也都实现了 Prometheus 的 exporter 端暴露监控指标。无需用户干预的条件下实现对多个维度的自动化监控。
Monitor 组件能够自动配置一些默认的报警规则,计划支持从 Kubernetes 中获取自定义的报警规则资源生成 Prometheus 报警规则使其动态生效,从而支持自定义报警规则,报警信息由第三方 Alter-Manage 系统处理。
Prometheus 默认情况下不支持集群部署,无法直接通过扩充节点来提高监控能力。为了提高监控系统的处理能力,目前支持将存储数据通过远程存储来提高数据存储能力;支持多个节点配置同步来提供服务可用性;支持调整监控数据存储窗口和减少对内存资源的占用。计划支持对监控目标进行集群化分区,从而支持扩充节点来扩充监控能力,对外提供统一的查询 API 屏蔽底层的数据分区。
消息中间件服务
MQ 组件是基于 Etcd 实现的轻量级分布式、消息持久化和全局一致性的消息中间件。该组件维护异步任务消息,提供多主题的消息发布和订阅能力。
市场上消息中间件产品众多,ActiveMQ、RabbitMQ、ZeroMQ 等等,针对我们的需求:分布式、持久化、全局一致性、轻量级、有序等关键属性,目前已有的消息中间件产品或多或少不满足。
Etcd 是简单、安全、快速、可信的键值存储服务,在我们的整个系统架构中扮演重要角色。基于 etcd 已有的特性很方便的实现一个基础消息系统。对于每一个订阅主题采用一个 key,由 etcd 控制时序和独占机制,使进入的消息可以顺序消费,客户端通过 etcd 提供的 watch 机制可以非常简单的订阅消息。基于此我们包装了两类 API: restful 和 grpc。客户端即可便捷的操作消息的 PUB/SUB。