数人云“容器助力产品迭代力MAX”沙龙干货分享实录持续上新,今天是来自人人贷高级运维工程师杜天鹏的分享,与咱们细数了人人贷容器化实践过程当中遇到的问题以及解决方法。shell
很高兴站在这里和你们一块儿交流容器技术,我叫杜天鹏,是人人贷的运维工程师。人人贷是一家作P2P的互联网公司,如今业务量上升比较快,业务组件也比较多,这个过程给运维增长了很大的压力,因此人人贷考虑了容器化技术。数据库
Docker官网有一句话:build once,run anywhere,容器一次构建,在其余服务器上就能够运行。第二,容器使用的是Unionfs,在传输的过程当中,实际上传递的是变动的部分,而不须要拉取完整的image。第三,容器为人人贷提供了一个隔离的环境,在测试的过程当中,一台机器可能运行了不少服务,一旦测试或者开发人员更改服务器环境或者其余参数,会致使其余的测试环境运行不起来。容器带来了环境的隔离性,一个容器只需运行一个Docker,能够避免不少问题。第四,容器可以结合Jenkins以及如Hudson、Teamcity这些持续交付软件来进行持续交付、持续集成、持续部署。第五,容器能够结合如K8S、Mesos、Swarm等调度器而后进行横向扩展。json
这是人人贷的传统上线流程。首先开发人员推送他们的代码到Git仓库,人人贷使用的是Stash,测试人员在测试的时间输入仓库名称和版本号,来进行使用Jenkins构建。在测试环境中,测试完成以后会从新构建一次,而后推送代码到类生产环境。这个类生产环境实际上使用的是生产环境的配置,只不过再作一次校验,防止出现问题。最后运维人员使用Ansible推送代码到生产环境,在这个过程当中会产生不少问题。服务器
好比刚才说的环境不统一,或者是无心中修改了环境,或者有临时的需求上线的时间,须要准备新的虚拟机。这个临时的需求或许很是着急,可是从运维的角度来看,建立服务器,修改配置,初始化操做都须要一个过程,所以会影响总体的工做进展。Docker解决了这个问题,由于可使用提早准备好的Docker镜像进行全部的初始化操做,让运维能够从容应对突发的状况。网络
还有资源浪费的问题。在开发或者测试环境,人人贷运维人员为开发建立了不少测试虚拟机,假如不作按期巡检的话,就没法得知这个虚拟机是否正在被开发或者测试人员使用,致使了资源的浪费。使用了Docker技术后,运维就能够随时为开发或者测试同事部署一套环境,而且作按期的清理。对于大规模的部署过程,能够实现灵活调度,由于人人贷的业务峰值是不同的。好比白天交易系统比较繁忙,能够调整交易系统节点数量;晚上要作计算和统计,计算资源则会多跑一些任务。运维
人人贷在使用Docker时,考虑了三种容器技术,分别是Mesos,Kubernetes以及Swarm。最终选择Mesos主要基于三点考虑:最主要的是学习成本,对于Kubernetes,它的功能不少也很强大,可是它更新迭代很是快,里面不少功能如今仍处于Beta版本,可是官方并无明确其使用环境。第二,成熟度的问题,Mesos推出时间早,实践的公司也比较普遍,成熟度高于其余两个技术。第三,Mesos有不少调度器例如Marathon,在界面上能够有一个直观的展现。而Kubernetes和Swarm以前是没有界面的,如今Kubernetes有一个Dashboard,可是功能尚不完整。分布式
人人贷从物理机迁移到虚拟机过程当中遇到不少问题,一个完整的技术就是一个成熟的技术在应用到生产环境中,这个过程当中的问题并非技术引发的,而是落地的过程当中没有标准,因此人人贷须要有一个标准化来面对需求。学习
首先,配置不可见。运行在Docker内部的程序,并不不推荐进入容器,由于Docker就是一个容器,须要链接到里面来看配置项。在Marathon上面就能够看到配置项,具体配置项是经过ENV传入的。测试
第二,项目没法相互调用。人人贷的业务比较多,全部的项目须要相互调用,包括交易所、 P2P以及基金,它们之间须要进行资源交互。可是因为人力精力有限,Docker技术在整套系统的实现尚须要一个过程。ui
第三,没法经过SSH链接Docker。好比在测试环境中测试或开发进行一些debug操做,须要经过SSH链接上去,了解Docker如今的配置。
第四,容器IP不可见。
接下来我会经过运用的技术来为你们解释人人贷是如何解决这些问题的,Docker落地过程当中主要有七点须要关注。
第一,编排。Marathon是使用json文件进行部署的,里面会写到具体的资源配置,镜像名称以及挂载目录。首先进行配置文件模板化,在人人贷,运维人员分别负责不一样业务部门的运维工做,因此运维并不清楚其余部门是如何配置的,模板化以后只须要让开发人员按照规则来表述,就能够清晰地传递和表达。
例如上图中两个配置,这是exchange(人人贷的一个项目名)环境里面的MySQL以及服务。开发只要按照这个标准往里面写配置,运维就能够明白项目和配置项。而后进行配置项ENV化,配置都是经过ENV传入,经过命令进行渲染,固然也可使用shell命令或者其余的程序进行配置渲染。以后修改上线json,由于每一次json文件并非一成不变的,须要更改文本配置。
第二,网络。人人贷使用的是Calico,它自己能够划分网段,来指定范围。咱们在路由器上面添加了路由,让开发环境能够直接访容器内部的网络。Calico自己能够支持Docker1.10版本后,能够经过 - 指定 --IP。人人贷使用的是CNM模式,Calico是支持CNI与CNM的,人人贷使用的是calico-containers,所以可使用Docker命令,而且指定驱动为Calico,很是便于管理。指定路由后,能够直接访问,再也不须要使用例如Marathonlb这些指定端口,也不须要维护端口列表。Calico使用BGP协议,不须要封包。对于Mesos来讲,我比较推荐使用Calico。
第三,服务发现。人人贷使用Calico能够固定IP地址,虽然并不推荐把容器做为一个虚拟机来使用,可是对于固定IP地址这种状况可能仍须要一个容器。当其余服务须要灵活调度时,则须要IP动态划分。人人贷使用Mesos-DNS来获取动态分配的IP,全部的组件配置域名相互调用,测试环境一样使用的配置域名化,即服务调度之间都是使用域名来调用的。所以Mesos-DNS只须要转发现有域名服务器的域名解析,就能够直接调用原有的服务,在里面写域名,而不须要知道其IP地址,亦不须要配置。
第四,存储。对于一些须要持久化的数据,人人贷使用的是本地化持久卷,这个绑定在host上,当这个容器挂掉以后,它会在物理机上从新起一个容器。Docker一般运行的都是无状态应用,因此若是MySQL里面的数据很是重要,我仍是更推荐使用物理机或者虚拟机进行部署。对于分布式如MongoDB或者其余具备高可用性的数据库,部署在Docker里面也仍是能够的。
第五,监控。人人贷使用的就是Cadvisor+Influxdb+Grafana这套开源方案,Cadvisor是谷歌的一个开源产品,Influxdb是一个时序数据库,Grafana是一个漂亮的界面展现。对于Zabbix,人人贷用过一个叫Zabbix-Grafana的插件,能够在Grafana里面显示Zabbix的数据。Cadvisor主要起到做用就是收集容器里面的资源使用状况,例如内存,CPU以及磁盘IO,而后存入到Influxdb中。固然监控的同时,也可使用Dockerstats等实现一些数据采集。
第六,日志收集。人人贷如今主要使用的是ELK的数据方案。为了实现SSH登陆容器内部, Docker是须要一个前台进程来保持Docker程序不退出的,所以人人贷全部的容器都是使用SSHD守护进程,来保持Docker一直运行下去。
人人贷有一个start的脚本,例如Tomcat,咱们会在这个SSHD进程启动以前来启动它。因此日志经过Docker logs是看不到的,只能在容器里面部署一个Logstash agent,可是会加剧容器的负担。对于没有接入容器内部需求的同窗,能够直接接入运行进程,将日志打入到Docker控制台,经过Docker logs进行日志收集,在Docker的宿主机上面指定Docker日志的产出目录实现收集,而再也不须要在Docker里面部署agent。
第七,镜像仓库。Docker官方的镜像仓库自己是没有认证功能的,可是在真实生产环境中,须要有镜像的权限划分。如今Registry用的比较多就是Apphouse以及Habor,据我以前了解,Habor的BUG比较多一点,因此人人贷使用了Apphouse。可是如今我了解到Habor支持分布式以及主从关系进行主从复制,因此未来人人贷可能会弃用Apphouse,使用Habor来作私有仓库。Habor是一个开源产品,能够看到它内部的实现原理,Apphouse虽然免费,可是它是闭源的。
最终人人贷落地实现了这个过程,由开发人员提交代码到Stash,输入版本号以及分支名经过Jenkins进行构建,推送到image。在发布的时间经过调用Marathon的API进行发布,拉取image,最终运行在Mesos Slave节点上。
接下来人人贷但愿实现部署多套环境,对于项目名称进行模板化处理,而且经过Jenkins实现彻底自动化。我的认为落地的过程当中,主要问题就在于配置管理。谢谢你们。