首页 存档 技术 查看内容

基因数据云GeneDock基于Docker的部署运维实践

2018-3-30 13:00 |来自: 互联网 339 0

摘要: 编者按:随着国内对Docker的应用逐步深入,越来越多的实践经验涌现出来。特别是科技前沿的互联网公司,对于Docker和微服务架构的接受程度更高,应用也更成熟。 GeneDock是一个生命健康数据创业团队,创始人为前友盟 ...

编者按:随着国内对Docker的应用逐步深入,越来越多的实践经验涌现出来。特别是科技前沿的互联网公司,对于Docker和微服务架构的接受程度更高,应用也更成熟。


GeneDock是一个生命健康数据创业团队,创始人为前友盟首席数据科学家李厦戎和前阿里云资深专家王乐珩。旨在提供安全、易用、开放的基因数据云计算服务,致力于提高基因数据流动性,促进行业应用发展。


本文由GeneDock实习工程师胡英谦撰写,介绍了GeneDock如何基于Docker容器技术,构建一个自动化、易管理、高可用的运维部署系统。如果你有更好的经验分享,欢迎投稿。


GeneDock系统式典型的微服务架构

超过二十个模块分别负责平台的各项功能,例如接口、权限、资源管理、编译、调度、监控等,模块之间通过RESTful接口相互通讯。


模块这么多,如果没有自动部署工具,运维工程师全凭手工操作,在敏捷开发的快节奏下,升级部署会成为一个大坑。


于是需求来了:用程序代替人,实现脚本化甚至自动化部署。


先干什么?

大多数工程师都会想到两件事:


  1. 采用Docker技术发布和部署所有服务;

  2. 编写脚本,自动完成代码下载、构建镜像、启动服务的流程。


真挽起袖子来干活儿,就发现问题:最初模块之间还未隔离干净,存在代码和路径依赖。因此每个服务的Docker镜像制作脚本都不相同,藏了很多黑魔法在里面。例如从其他模块拷贝某个源代码文件过来,甚至是多个服务不得不共享一个镜像。新版本代码稍有变化,部署脚本就得改,很容易出错。


Bad Smell!完美主义的GDers热情高涨,开始重构:


  1. 拆分,保证每个Docker镜像里只启动一个逻辑独立的服务;

  2. 将跨服务的调用解耦为 RESTful 接口调用,禁止跨模块import代码;

  3. 有些公用基础类库(例如加密算法),被做成了规范的 PyPI 包,使用pypiserver自建私有的 PyPI 源,然后将这些包放到Docker file里面去;

  4. 规范各个服务的目录结构、启动方式、日志格式。所有服务的docker采用相同的方式挂载代码、数据和日志。这样就解决了目录混乱不一的问题。


经过精心重构,达到了以下目标:


  1. 实现了所有模块的代码独立,去除跨模块代码级依赖;

  2. 实现了所有服务的Docker化发布;

  3. 实现了自动化部署的脚本,测试环境还会定时自动从GitHub master分支更新版本;


虽然引入Docker实现了自动化……

但部署过程还有点漫长:

  1. 将服务代码从GitHub服务下载到服务器本地;

  2. 通过Docker工具创建镜像;

  3. 启动Docker容器;

  4. 确定服务已经正常启动,向相关工程师发监控微信。


事实上,已经有许多专业的第三方云服务功能强大且聚焦,能够帮助我们大大提高部署效率,花的费用也不多。所以,作为云服务信徒的我们使用了以下代表先进生产力的服务:


  • 使用 GitHub 管理代码,防止代码的丢失与混乱,提高团队协作效率。

  • 使用 Travis 进行持续集成,在每次提交新代码时自动做代码检查及单元测试,在每次发布时发布系统会自动构建 Docker 镜像,并推送到 Docker Registry 上。

  • 使用Docker Hub 维护镜像,Docker Hub具有完善的版本号支持,与自建私有的Docker Registry 相比更加方便。


采用了以上服务,实现了发布与部署的分离。发布时只需 在GitHub上打一个Tag,部署系统就会在服务器上通过执行命令docker run从官方Docker Hub 上拉下服务镜像然后启动容器,能够方便地支持异地部署与回滚。这样真正发挥了 Docker 的好处:服务装箱,下载即用。


GitHhub 和 Docker Hub都有着完善的私有化和权限支持。对于自建的pypi源与其他可能被外网访问的服务,我们使用了 Nginx 反向代理进行转发,在转发时使用 Nginx 的基本认证进行鉴权,兼顾了便利性与安全性。


也就是说,经过再次完善,我们又有进步:


  1. 极大简化了部署流程,大幅减轻运维工程师的负担;

  2. 运维工程师不再需要接触代码,明确了运维与开发的边界;

  3. 基本消除了安全性隐患。


最终,GeneDock部署运维系统架构

新的架构如图:


  • 代码在 GitHub 上管理,通过 Travis 自动化代码检查与单元测试

  • Docker 镜像 由 Docker Hub 管理,Travis 进行持续集成与部署

  • 配置使用 MongoDB 统一管理,MongoDB 相关配置统一路径后挂载到 Docker 容器中

  • 部署与测试由 Travis 进行监控,如果失败会报警

  • 运行的容器借助 Docker 的事件机制进行监控

  • 服务端系统日志使用Docker的高级特性Data Volume来存储,以供相关日志服务分析和收集


构建这套系统时,除了自己摸索,还参考了一些最佳实践与文档,甚至阅读了Docker源码,每个公司情况不同,需要结合实际确定具体方案。


原文链接见【阅读原文】

长按关注!
Container技术日报

本文转载自:微信公众账号 - Container技术日报,版权归原作者所有!

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部