京东 M-PaaS 平台之 Android 组件化系统私有化部署改造实践
系统上云是科技企业及传统企业降本增效、协同办公等有效的助力方式。本文将京东 M-PaaS 平台下的 Aura 平台(Android 组件平台)在 T-PaaS 环境进行私有化部署改造的历程记录下来,分享给大家。
京东 M-PaaS 平台是企业级移动研发平台,结合“京东系”APP 研发的经验积累与最佳实践,为移动开发提供一站式解决方案。Aura 是 M-PaaS 平台下 Android 方向的组件化、模块化解决方案,提供高效解耦、并行开发、独立调试、快速构建、灵活集成等能力。
T-PaaS 平台是京东进行私有化部署的基础环境,旨在模拟各种 PaaS 应用更容易的在各种客户环境中进行商业化输出。其接入规范完全遵循云原生标准,保证 PaaS 服务能容易与生态应用、客户业务协同配合,以云原生的容器及 operator 的方式实现应用逻辑,并以 Helm 标准的方式打包,在 Kubernetes 之上统一部署和管理。
需求分析及方案选定
1/需求分析
需求:将现有内部的平台系统 Aura 在 T-PaaS 平台上进行部署。
分析:T-PaaS 平台是以 Kubernetes 进行容器的编排部署和管理 Docker 容器的,Aura 私有化部署需要解决以下问题:
编译各组件 Docker 镜像
基于 Kubernetes 撰写 K8s 编排文件
在 T-PaaS 平台上进行部署
2/方案选择
1) 现有方案
基础技术组定义出一套标准的接入方式,简化了 Docker 及 K8s 的相关内容学习。基于标准方案,可完成前后端的快速的私有化部署,节省研发同学在运维方面的学习成本。标准接入方案解决了以下几个重要的问题:
基于标准模版自动生成 Dockerfile
参数配置化
编译镜像自动化
2)方案选择
基于现有方案只能够满足前后端的镜像生成及相关功能部署,对于复杂 CI/CD 流程或基于复杂基础环境容器,无法生成 Dockerfile。但是 Aura 平台的系统架构较复杂,现有方案无法满足私有化方案改造。基于现有方案进行定制化改造,在时间成本和人力成本上都有较大的投入,基于以上原因,京东 Android 组件化系统私有化部署需要另辟蹊径,降低改造的门槛,提升开发效率。
具体改造实现方案
Aura 平台的系统架构基于 Kubernetes 改造方案如下:
1/镜像划分
Aura 平台的系统架构:
按照以上架构分为三个镜像:
Aura2Web:包含前端,后端
Aura2JenkinsMaster:任务调度器
Aura2JenkinsSlave:CI 构建节点
由于 Aura2Web、Aura2JenkinsSlave 使用到的基础环境较为复杂,依赖第三方软件较多,决定基于 Centos7.2 编写自定义 DockerFile,进行镜像输出。
2/DockerFile 编写概述
基于 Centos7.2 编写 DockerFile,总结了相关开发 Docker 的经验。编写 DockerFile 需要注意的以下内容:
选择最精简的基础镜像
减少镜像的层数
清理镜像构建的中间产物
注意优化网络请求
尽量去用构建缓存
基于 Centos7.2 安装以下相关软件:JDK,nginx,Python,Maven,Git,Tomcat,JQ 等。业务源码到二进制包再到镜像:镜像是为了运行我们自己的服务,所以需要把平台包放到镜像中,这个需要制定一个规则,方便记录从源码到镜像这一过程,并且可追溯。
定制规则如下:
前端:
前端使用的是 Vue,需要进行编译构建,将构建后的产物放到镜像中;
首先在源码中打 Tag,Push 到服务器,由 WebHook 钩子触发持续集成,编译出前端;
将前端的产物打成 zip 包,放到京东的云存储上,记下链接地址备用。
后端:
后端需要进行混淆加密,加密后的产物同理打成 zip 包,然后将其放到京东的云存储上,记下链接地址备用。
3/统一配置化改造
镜像中的代码使用到的配置文件较多,譬如 Aura2Web 镜像就达到 6 个之多。所以统一化管理配置文件显得尤为重要,经过研究发现,confd 软件非常适合此场景,助力配置化高效率改造,具体用法如下:
Confd 简介:
Confd 是一个轻量级的配置管理工具。通过查询 Etcd 或其它后端,结合配置模板引擎,可以保持本地配置最新,同时具备定期探测机制,配置变更自动 reload。其后端支持的数据类型有:Etcd、consul、vault、environmentvariables、redis、zookeeper、dynamodb、stackengine、rancher。不过一般使用 Confd 和 Etcd 的配合使用比较多。
Aura 系统用不着后端配合,只需要使用它的模板渲染,进行统一配置管理即可。
Confdg 使用步骤如下:
第一步:confdg 下载
下载 confd 的二进制文件,下载地址为:https://github.com/kelseyhightower/confd/releases
第二步:将 confd 放到镜像中,直接在 dockerfile 中加上如下语句
第三步:创建 confd 配置文件和模板文件
如图所示,根据您的需要,可创建多个配置和模板,但它们要一一对应起来。
举例:frontend_domain.toml
Frontend_domain.template
第四步:在 dockerfile 中将配置文件和 template 文件 copy 到镜像中
第五步:在 entery 的 shell 脚本中执行生成真实的配置文件
4/涉及到的中间件配置
1)数据库
参考 T-PaaS 的文档,将需要配置的 Host 等在本机配好,登录 phpmyadmin.tpaas.local(用户名密码从文档中获得)。建立新数据库,并自定义数据库名称,假设这里取名为:auradb。下载之前建好的 Aura 的初始化 sq,导入 sql。记录以下信息,后续放入 configMap。
网址和端口号
数据库名
用户名密码
2)GitLab
参考中间件信息的网址,找到 GitLab 网址,登录网站,使用中间件信息上提供的用户名密码或新建一个账号,这里示例新建一个账号:aura,密码为:xxxxx,记录下来,后续放入 configMap。
3)Maven 私服 (NexusRepository OSS)
参考中间件信息的网址,找到地址和用户名密码,登录。
建以下两个仓库,(创建时参数 deployment policy 选择允许上传)
libs-releases-local
libs-snapshots-local
开通匿名访问权限,如已开通则忽略,建用户并记录其账号和密码,后续放入 configMap。
4)云存储(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 文件,文件有两个:
aura-Cfs-mini-without-gradlecache.tar.xz
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 UserHome 缓存恢复完成”。
经验总结
本篇文章主要介绍了 Aura 平台(Android 组件平台)拆分成 Docker 镜像,并进行镜像编译和部署的过程。在私有化部署的过程中,三个要点总结如下:
1) Dockerfile 编写及镜像编译
2) 配置的统一管理
3) K8s 的编排文件编写
其他平台如有基于本文中所涉及到的相同需求,可以重点把握以上关键点,顺利推进私有化改造部署落地。
M-PaaS 是京东云技术中台(T-PaaS)家族的产品之一,技术中台(T-PaaS)是京东多年数字化技术的最佳实践和技术沉淀。为企业客户提供 16 大类,经过大规模严苛生产验证的全栈 PaaS 服务。
推荐阅读
欢迎点击【京东科技】,了解开发者社区
更多精彩技术实践与独家干货解析
欢迎关注【京东科技开发者】公众号
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/cef55ac04c68a183aba65ed65】。文章转载请联系作者。
评论