藏书馆App基于 Rainbond 实现云原生DevOps的实践
藏书馆App基于 Rainbond 实现云原生DevOps的实践
我们需要的不是精通 Kubernetes 的工程师,我们需要一款小白都能用好的管理工具。 -- 郭传壕
大家好,我是厦门正观易知科技有限公司运维负责人郭传壕。
藏书馆是一个专注用户自我成长的云端私人图书馆,集电子书的读、荐、借、购、存和知识管理功能于一体,致力于用户的认知赋能,通过读书习惯的养成,达成自我成长。目前累计注册用户已达 1500W ,平台图书资源超过 200W 册。
我们使用 Rainbond 已经有 2 年,我把我们的使用经验分享给大家。
以前的困局
处于云原生时代中的藏书馆的起点很高,我们一开始就选定了微服务架构、Kubernetes、容器化等符合时代潮流的技术体系。然而原生的 kubernetes 管理平台提供的功能并不完全符合我们的预期,二次开发的巨大技术成本也是我们负担不起的。
在了解到 Rainbond 之前,处于创业初期的我们一直受困于产品迭代变更频繁所带来的琐事之中。我所说的琐事包含微服务架构下 50 个服务的版本管理、构建产物的更替、线上环境的发布以及围绕着应用从开发到上线再到运维的种种繁琐工作。
我们希望可以从这些琐事中跳脱出来,专注于业务本身,探索出一条适合 kubernetes 环境下持续开发、持续交付的简捷之路。
鉴于此,我们开始积极的寻找一款开源且易用的应用管理平台。
初识 Rainbond
在 Rainbond 之前,我们已经尝试过了 Rancher 等产品,但产品功能和我们的预期有很大差距。
2 年前,我们通过 Github 第一次了解到了 Rainbond 这款产品,惊喜于功能非常契合藏书馆的需求。列举几个令人印象深刻的能力:
-
应用架构的整体拓扑图
以上帝视角,一览无余的观测到所有服务组件的运行状态与依赖关系。强迫症会逼着我们的工程师消灭红色的异常状态,而体现运行状态的绿色真的令人感到安心。
-
可视化的资源占用情况
资源占用情况是体现可观测性很重要的指标。对于初创公司而言,了解资源分配是否合理,杜绝资源浪费是很重要的。Rainbond 从团队到服务组件的每个维度都提供了良好的可观测性。团队级别的资源限额能力非常实用,解决了运维团队无法有效掌控资源分配的难题。
-
自动伸缩
藏书馆是一个典型的 2C 场景,如何利用好云计算提供的弹性,灵活的应对流量高峰呢?答案就是使用自动伸缩功能。Rainbond 提供的自动伸缩功能,突出了简单易配置的特点。自动伸缩能力极大的解放了运维团队的工作压力,从此远离兴师动众和严阵以待。关键业务会随着我们的心意,自动扩张,直到能够吞吐所有流量。
-
集中式的网关策略管理
2C 场景下的服务发布,是无论如何也绕不过去的坎儿。无论是蓝绿发布、灰度发布抑或是 A/B 测试,这服务发布相关的十八般武艺多少都会碰到。原生的 Kubernetes Ingress 的确可以实现这些发布策略,但是我们更希望得到一个产品化的集中式管理页面来处理这些问题,而不是去麻烦运维工程师们去碰那些格式严苛的 Yaml 文件。Rainbond 网关策略管理完美的实现了我们的需求。
-
应用复制快速生成环境
在藏书馆的开发流程中,我们时常需要搭建各种环境,来区分开发、测试、预发布场景,分别对应不同版本的微服务组件,比如 Dev、Prod 之类的。但如果每次生成环境都要手动创建服务组件,那真的太低效了。应用复制功能在这个场景下非常有用,它帮助我快速复制出一套环境出来。复制过程中自助选择构建源的版本,对我而言是镜像的 Tag。复制后的新环境,保留了所有的服务组件元信息以及依赖关系。
在逐步的探索过程中,和官方团队在社区中进行的互动,让我们少走了很多弯路。一款开源产品如果伴随着有生命力的社区,将会是非常令人安心的。
开发测试环境部署
第一步,部署微服务
上手 Rainbond ,是从部署单个微服务开始的,这个过程非常简单,不需要学习 Kubernetes 的 Yaml 。开发环境中的组件是基于镜像构建完成的,只需要按界面的引导填写好镜像地址及相关信息就可以了。
我们用的是 Spring Cloud 微服务框架,在 Rainbond 体系下可以很好的运行,我在部署过程中受到了一系列文档的影响,这里分享给大家:
第二步,通过可视化的方式服务编排
在编排微服务的过程中,基于图形化编辑组件依赖关系这个功能,着实惊艳了我。这种编排方式和其他平台基于复杂 Yaml 文件进行编排的方式有极大的不同。感兴趣的小伙伴们可以阅读下服务编排相关的描述,这的确是一种小白都可以掌控的微服务编排方式。

第三步,对接外部的服务
对于我们这样一个初创公司而言,将数据库等服务托管给云服务商,直接使用 RDS 服务是个既经济又稳健的选择。在 Rainbond 体系中,我通过添加第三方组件的方式将位于云端的 RDS 服务纳入管理之中。这种纳入让第三方服务也像部署在平台之中一样,可以被其他微服务组件所依赖。
至此,我的开发环境就已经部署完成了。
第四步,复制出了测试环境、预发布环境和生产环境
在以往的开发过程中,搭建环境是一个很繁琐的事情。对一个处于快速迭代过程中的产品而言,我们至少需要开发环境、测试环境、生产环境,在我们自己的实际场景中,还引入了预发布环境。对于代码而言,我仅需要 Fork 出多个分支,来区分不同环境即可。通过定义流水线,我们也已经完成了不同代码分支打包镜像的不同 tag。但是到了搭建环境这一步,难道就只能根据不同的镜像 tag ,手动一点点的创建组件?想到藏书馆业务的近 50 个微服务组件,和彼此间的依赖关系,我的头就很大,IT 从业者最不能忍受的就是重复工作。
在探索 Rainbond 使用方法的过程中,快速复制这个功能一下子抓住了我的眼球。快速复制功能可以检出所有组件的构建源信息,对于源码构建的组件,构建源就是它的代码仓库地址、编程语言、代码分支;而对于镜像构建的组件,构建源则对应了镜像地址和 tag。在这样一个界面下,我可以选择需要被复制的组件,修改其 tag 版本。这样的复制能力可以实现环境在不同集群、不同团队下的复制。新的环境继承了原环境中除镜像 tag 以外的所有设定:依赖关系、组件名称、环境变量配置、持久化设置等等。
利用这个能力,我基于开发环境,像 Fork 一份代码一样,通过修改 tag 的方式复制出了测试环境、预发布环境和生产环境。

这一能力极大的节约了我们使用 Rainbond 时,部署各种环境的时间成本。目前,我们也把这一功能用于新人的开发环境搭建,以前手把手教新人如何搭建自己的开发环境是很费心费力的事情。