京东零售云mPaaS平台之Android组件化系统私有化部署改造实践

云计算 PaaS
京东零售云mPaaS平台是京东打造的企业级移动研发运营平台,Aura是Android方向的组件化、插件化解决方案。

一、背景

在当前,上云无疑是一个非常火热的话题,不管是科技企业还是传统企业都在说着这一话题,帮助企业降本增效、协同办公等等,咱作为一个技术人关注的话题还是技术相关的,本篇文章是在京东打造的京东零售云的大背景下,将京东零售云mPaaS平台中的Android组件化系统进行私有化部署改造的历程记录下来,并分享给大家。

京东零售云mPaaS平台是京东打造的企业级移动研发运营平台,Aura是Android方向的组件化、插件化解决方案。

T-PaaS平台是京东进行私有化部署的底座,旨在帮助各种PaaS应用更容易的在各种客户环境中进行商业化输出。其接入规范完全遵循云原生标准,保证PaaS服务能容易与生态应用、客户业务协同配合,以云原生的容器及operator的方式实现应用逻辑,并以Helm标准的方式打包,在Kubernetes之上统一部署和管理。

这里分享的是京东在进行上云的环境背景下,Aura平台(Android组件平台)开始了上云、上T-PaaS环境的改造历程。

二、需求分析及方案选定

1. 需求分析

需求和目的很明确,就是将现在内部的平台系统Aura在TPaaS平台上进行部署

TPaaS平台是以Kubernetes进行容器的编排部署和管理Docker容器的,所以,我们需要做以下两件事

  • 编译出Docker镜像
  • 撰写k8s编排文件,并在TPaaS平台上进行部署和管理

2. 方案选择

现有轮子

我们是移动开发的团队,团队的成员大多都是客户端开发的,但是小伙伴们一技多能,还能维护平台的开发,并在京东内网进行部署。

现在为了部署TPaaS,基础技术组的同事进行了前期的技术探索,开发了一套不用写Dockerfile即可接入TPaaS平台的方案,使客户端团队不至于重新学习一套全新的技能Dockerfile编写和部署,大大降低了接入的门槛,加快了接入的步伐。此方案主要解决了以下问题:

  • 免写Dockerfile
  • 参数配置化
  • 编译镜像自动化

使用现有轮子?发明轮子?

我们尝试过这套方案之后,发现这套方案对于Java写的后端平台部署简直太棒了,按照规范把自己的War包放到云存储上,然后修改配置文件,再按照流程在平台上进行一键打包,哦哦,镜像出来啦~

当然对于前端部署一样的友好。

对于Aura平台,这套轮子不好用了,仔细研究后,发现了问题所在,这套方案之所以好用,是因为内置了一些常用的软件,比如Nginx,Tomcat等,足以满足上述所说的环境部署。

但是Aura平台的系统架构较复杂,使用这套方案的话,就不只是使用轮子了,还需要再在这个轮子上加装很多东西才能达到使用的目的,尝试过后发现得不尝失,而且这个轮子的学习成本太高,不是使用学习成本,而是学习它的改装成本太高。

怎么办?发明一个轮子?仅为了单一平台中的一部分,显然不是明智之举,干脆让部分老弱妇孺的组件坐上这台马车,另一部分腿脚健全、身强力壮的小伙子直接走路吧,不见得就比马车慢。

最后,小伙子先走着,可以边走边完善轮子,或者能走出来一个更加便捷的轮子,再然后就不只是一技多能,而是一技多再加一能了,哈哈~

三、开始干活

1. 镜像划分

Aura平台的系统架构是这样的

 

Aura平台按照架构分为三个镜像,分别是

  • Aura2Web:包含前端,后端
  • Aura2JenkinsMaster:任务调度器
  • Aura2JenkinsSlave:CI构建节点

经过分析,由于Aura2Web、Aura2JenkinsSlave使用到的软件较多,环境配置复杂,决定这两个镜像使用DockerFile进行编写。

2. DockerFile编写

自己写的Dockerfile有两个,在写之前先研究一下Dockerfile的编写规则,遵循这些经验才能编写出优秀的镜像

  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 清理镜像构建的中间产物
  • 注意优化网络请求
  • 尽量去用构建缓存

选择基础镜像

基于我们的环境,选择了服务器最稳定的Centos,版本号是7.2.1511,并修改源为京东内网源,加快下载依赖的速度。

安装基础软件

安装以下一些软件:JDK,nginx,Python,Maven,Git,Tomcat,JQ等。

业务源码到二进制包再到镜像

镜像是为了跑我们的自己服务,所以需要把我们的平台包放到镜像中,这需要制定一个规则,方便记录从源码到镜像这一过程,并且可回溯。

前端:

  • 前端使用的是Vue,需要进行编译构建,将构建后的产物放到镜像中。
  • 首先在源码中打Tag,Push到服务器,由WebHook钩子触发持续集成,编译出前端。
  • 将前端的产物打成zip包,放到京东的云存储上,记下链接地址备用。

后端:

  • 后端需要进行混淆加密,加密后的产物同理打成zip包,然后将其放到京东的云存储上,记下链接地址备用。

3. 统一配置化改造

由于镜像中的代码使用到的配置文件较多,只Aura2Web镜像就达到了6个之多,所以需要一种方法进行统一的配置化。

经过研究发现了一个超好用的配置管理的软件confd,下面介绍一下这个软件的用法。

confd简介

Confd是一个轻量级的配置管理工具。通过查询Etcd或其它后端,结合配置模板引擎,可以保持本地配置最新,同时具备定期探测机制,配置变更自动reload。其后端支持的数据类型有:etcd、consul、vault、environment variables、redis、zookeeper、dynamodb、stackengine、rancher。不过一般使用Confd和etcd的配合使用比较多。

在我们的项目中暂时还用不着后端配合,只需要使用它的模板渲染,进行统一配置管理即可。

confdg下载

下载confd的二进制文件,下载地址为:https://github.com/kelseyhightower/confd/releases。

在这里需要将confd放到镜像中,直接在dockerfile中加上如下语句

 

  1. RUN set -ex \  
  2. && wget http://$storage_domain/our-tools/confd \  
  3. && mv ./confd /usr/bin \  
  4. && chmod a+x /usr/bin/confd 

创建confd配置文件和模板文件

如图所示,根据您的需要,可创建多个配置和模板,但它们要一一对应起来。

举例:frontend_domain.toml

 

  1. [template]  
  2. src = "frontend_domain.template"  
  3. dest = "/opt/servers/nginx/conf/domains/frontend_domain"  
  4. keys = [  
  5. "/aura/frontend/domain_inner" 
  6. "/aura/frontend/domain_outer" 
  7.  
  8. Frontend_domain.template  
  9. server  
  10.  
  11. listen 80;  
  12. server_name {{ getv "/aura/frontend/domain_inner" }} {{ getv "/aura/frontend/domain_outer" }};  
  13. ...  

在dockerfile中将配置文件和template文件copy到镜像中。

  1. COPY render /etc/confd 

在entery的shell脚本中执行生成真实的配置文件。

  1. /usr/bin/confd -onetime -backend file -file ${config_file_path} 

4. 涉及到的中间件配置

数据库

参考TPaaS的文档,将需要配置的Host等在本机配好,登录phpmyadmin.tpaas.local(用户名密码从文档中获得)。

建立新数据库,并自定义数据库名称,假设这里取名为:auradb。

下载之前建好的Aura的初始化sq,导入sql。

记录以下信息,后续放入 configMap

  • 网址和端口号
  • 数据库名
  • 用户名密码

GitLab

参考中间件信息的网址,找到GitLab网址,登录网站,使用中间件信息上提供的用户名密码或新建一个账号,这里示例新建一个账号:aura,密码为: xxxxx,记录下来,后续放入configMap。

Maven私服 (Nexus Repository OSS)

参考中间件信息的网址,找到地址和用户名密码,登录。

建以下两个仓库,(创建时参数deployment policy选择允许上传)

  • libs-releases-local
  • libs-snapshots-local

开通匿名访问权限,如已开通则忽略,建用户并记录其账号和密码,后续放入 configMap。

云存储(minio)

  • 参考中间件信息的网址,找到地址和用户名密码。
  • 登录并创建需要的bucket,并配置访问策略为读/写。

5. 双域名改造

由于私有化客户的环境分为内外环境,所以平台访问的域名分为内外域名,服务间调用使用内部域名,用户能直接访问的使用外部域名。 双域名改造的关键点就是将服务分类,哪些是只用内部服务调用的,哪些还需要用户直接调用,分析清楚后,直接在configMap中添加对应的Key值,并改造Confd的配置,适配相关域名。例如在Confd章节中举例的的 前端域名配置。

6. K8S编排文件

镜像文件生成之后,接下来就该编写K8S的编排文件了,然后就可以将镜像部署到K8S平台上。

需要配置的有以下编排文件

  • configMap
  • ingress
  • service
  • deployment
  • PersistentVolumeClaim

configMap

它的主要作用就是将需要配的参数统一放到这里,然后传给镜像中的confd进行渲染配置

PersistentVolumeClaim

主要用于外部挂载文件或目录,这里用它挂载了AndroidSDK,这样多个构建节点可以共用SDK,节省了空间。

JenkinsSlave镜像将会使用挂载的PVC做为Android SDK的输入

多个 JenkinsSlave节点会共用同一份PVC中的Android SDK,以节省存储空间。

PVC挂载目录为 /usr/local/aura/auraCfs,也可将其挂载到其它目录(例如/mnt/auraCfs),然后将 /usr/local/aura/auraCfs 作为软链指向它。

解压SDK文件,文件有两个:

 

  1. aura-Cfs-mini-without-gradlecache.tar.xz  
  2. aura-Cfs-mini-with-gradlecache.tar.xz 

它们两个的区别差了一个 14G 左右的 gradle cache。 cache可使用也可不使用,如不使用则会自动从网络下载,并只会延长第一次构建的时间。

步骤如下:

  • 将文件 xz 解压到 PVC的根目录即可。
  • 选择使用 gradle 缓存。
  • 可以使用预置的 gradle 缓存来加快首次的构建速度,也可不使用预置缓存,而是在构建过程中自动从网络下载依赖的包。如要使用Grade缓存,按照以下步骤操作即可(变成冒号,底下的步骤能不能缩一下格式,做一个步骤区分,缩进一下,接下来的步骤,步骤是什么?)
  • 保证JenkinsSlave镜像中有充足的存储空间(大于200G)
  • 使用 with-gradlecache 的压缩包
  • 在PVC盘的根目录下新建一个空文件 use_gradle_cache
  • 解压完毕后,镜像启动脚本会输出:“Gradle User Home 缓存恢复完成”

四、经验总结

本篇文章主要记述了,Aura平台(Android组件平台)拆分成Docker镜像,并进行镜像编译和部署的过程。

私有化部署的事情总结下来主要有以下几点

  • Dockerfile编写及镜像编译
  • 配置的统一管理
  • K8S的编排文件编写

只要把握好了这些关键点,相信其它平台如有相同的需求,在进行私有化改造部署落地的过程中也会是很顺利的。

责任编辑:未丽燕 来源: 京东零售云
相关推荐

2021-09-17 18:40:55

京东mPaaS移动端

2021-09-15 16:41:20

京东零售云Flutter热重载

2022-05-18 13:24:47

京东调优实践

2019-06-03 15:27:22

零售企业数字化企业

2019-03-21 19:19:35

新零售阿里云零售云

2022-05-20 11:23:01

火山引擎A/B 测试ToB 市场

2021-09-08 18:12:57

京东零售云

2019-12-13 11:55:30

AI 数据人工智能

2022-06-28 13:41:43

京东数据处理

2020-09-14 16:55:49

IBM

2023-10-28 09:08:19

微服务saas私有化

2020-04-03 10:32:39

数字化转型零售行业CIO

2014-05-09 15:35:51

CRM营销

2018-01-22 10:33:01

云计算 新零售

2022-02-15 18:18:56

数字化出海零售

2012-07-23 16:22:07

Oracle

2021-05-27 10:06:21

京东零售
点赞
收藏

51CTO技术栈公众号