前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >京东mPaaS平台之Android组件化系统私有化部署改造实践

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

作者头像
京东技术
发布2021-03-16 10:53:18
7480
发布2021-03-16 10:53:18
举报
文章被收录于专栏:京东技术京东技术

Tech

Powered by 京东科技AI主播

前言

系统上云是科技企业及传统企业降本增效、协同办公等有效的助力方式。本文将京东mPaaS平台下的Aura平台(Android组件平台)在T-PaaS环境进行私有化部署改造的历程记录下来,分享给大家。

京东mPaaS平台是企业级移动研发平台,结合“京东系”APP研发的经验积累与最佳实践,为移动开发提供一站式解决方案。Aura是mPaaS平台下Android方向的组件化、模块化解决方案,提供高效解耦、并行开发、独立调试、快速构建、灵活集成等能力。

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

01

需求分析及方案选定

1/需求分析

需求:将现有内部的平台系统Aura在TPaaS平台上进行部署。

分析:TPaaS平台是以Kubernetes进行容器的编排部署和管理Docker容器的,Aura私有化部署需要解决以下问题:

  • 编译各组件Docker镜像
  • 基于Kubernetes撰写k8s编排文件
  • 在TPaaS平台上进行部署

2/方案选择

1) 现有方案

基础技术组定义出一套标准的接入方式,简化了Docker及K8S的相关内容学习。基于标准方案,可完成前后端的快速的私有化部署,节省研发同学在运维方面的学习成本。标准接入方案解决了以下几个重要的问题:

  • 基于标准模版自动生成Dockerfile
  • 参数配置化
  • 编译镜像自动化

2)方案选择

基于现有方案只能够满足前后端的镜像生成及相关功能部署,对于复杂CI/CD流程或基于复杂基础环境容器,无法生成Dockerfile。但是Aura平台的系统架构较复杂,现有方案无法满足私有化方案改造。基于现有方案进行定制化改造,在时间成本和人力成本上都有较大的投入,基于以上原因,京东Android组件化系统私有化部署需要另辟蹊径,降低改造的门槛,提升开发效率。

02

具体改造实现方案

Aura平台的系统架构基于Kubernetes改造方案如下:

1/镜像划分

Aura平台的系统架构:

按照以上架构分为三个镜像:

1) Aura2Web:包含前端,后端

2)Aura2JenkinsMaster:任务调度器

3) Aura2JenkinsSlave:CI构建节点

由于Aura2Web、Aura2JenkinsSlave使用到的基础环境较为复杂,依赖第三方软件较多,决定基于Centos7.2编写自定义DockerFile,进行镜像输出。

2/DockerFile编写概述

基于Centos7.2编写DockerFile,总结了相关开发Docker的经验。编写DockerFile需要注意的以下内容:

1)选择最精简的基础镜像

2)减少镜像的层数

3)清理镜像构建的中间产物

4)注意优化网络请求

5)尽量去用构建缓存

基于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使用步骤如下:

1) confdg下载

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

2)将confd放到镜像中,直接在dockerfile中加上如下语句

代码语言:javascript
复制
RUN set -ex \
&& wget http://$storage_domain/our-tools/confd \
&& mv ./confd /usr/bin \
&& chmod a+x /usr/bin/confd

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

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

举例:frontend_domain.toml

代码语言:javascript
复制
[template]
src = "frontend_domain.template"
dest = "/opt/servers/nginx/conf/domains/frontend_domain"
keys = [
  "/aura/frontend/domain_inner",
  "/aura/frontend/domain_outer",
]

Frontend_domain.template

代码语言:javascript
复制
server
{
  listen 80;
  server_name {{ getv "/aura/frontend/domain_inner" }} {{ getv "/aura/frontend/domain_outer" }};
  ...
}

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

代码语言:javascript
复制
COPY render /etc/confd

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

代码语言:javascript
复制
/usr/bin/confd-onetime -backend file –file ${config_file_path

4/涉及到的中间件配置

1)数据库

参考TPaaS的文档,将需要配置的Host等在本机配好,登录phpmyadmin.tpaas.local(用户名密码从文档中获得)。建立新数据库,并自定义数据库名称,假设这里取名为:auradb。下载之前建好的Aura的初始化sq,导入sql。记录以下信息,后续放入 configMap。

1. 网址和端口号 2. 数据库名 3. 用户名密码

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 缓存恢复完成”。

04

经验总结

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

在私有化部署的过程中,三个要点总结如下:

1) Dockerfile编写及镜像编译

2) 配置的统一管理

3) K8S的编排文件编写

其他平台如有基于本文中所涉及到的相同需求,可以重点把握以上关键点,顺利推进私有化改造部署落地。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京东技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Tech
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档