持续集成是容器一个绕不过去的话题,无论哪家容器厂商都一定会谈到,数人云关于持续集成,最开始用的是drone,一个小众的持续集成工具,将drone内置在平台上,通过平台的持续集成功能可以方便的实现持续集成的配置和管理。
对SVN的支持不好
容易出问题,因为数人云平台所有的组件都是容器化的,所以若使用drone,则需要使用docker-in-docker技术,但是该技术已经是一个不再被维护的技术了,所以继续使用的风险很大。
总结
在我看来,容器是一个革命性的产物,改变了软件交付的方式,它开箱即用的特性消灭了程序员常说的一句话 “在我这里运行时正常的啊!”; 它快速部署,环境无关的特性帮助运维人员提高了工作效率,但是任何事情都有其两面性,它的开箱即用,环境无关带来好处的同时,也带来了问题——配置文件。
一般而言,每个程序都会有一个或多个配置文件,里边记录着DB地址、账号、密码、缓存地址等信息,在容器时代之前,应用程序一般的流转方式是“从开发->测试->生产”:
开发同学交付一个编译之后的二进制文件,源文件(解释执行)或者代码仓库中某一个tag,同时附带一个release notes;
测试同学拿到开发同学交付的内容后,就将其部署在自己的测试环境中,如果release notes中说明了有配置信息需要更新或依赖文件版本需要升级,会依照文件进行调整;
如果测试通过,确定可以投产,那么就将其交付给运维同学进行生产部署。
此时有一个问题,开发、测试、运维每个环节都会自己维护配置文件,如果使用了容器,那么配置文件管理就是很麻烦的问题了,因为配置文件被放到了容器里,若想修改配置文件就不是那么简单的事情了,所以这就是传统应用在容器化时面临的第一个问题,当然这个问题也不是不能解决,一般而言,有以下几种解决方案:
挂盘,将配置文件放到外部存储中,然后将该目录挂到容器中;
生成新的镜像,基于Docker文件系统的特性,使用测试环境的配置文件覆盖开发环境的镜像,从而得到测试环境的镜像,同理,使用生产环境的配置文件覆盖开发环境的配置文件得到生产环境的镜像,使用该方案会导致每个环境都有一个镜像。
要先有个配置中心
要改代码,使其可以适配配置中心
最终选择的解决方案
方案一[挂盘], 这个方案会给容器产生另外一个状态,外部文件,不符合cloud 的思想,pass;
方案三[配置中心],成本太高,周期太长,而且需要改代码,往往之前的应用已经被维护了很多年,修改其配置接口,风险太大。
传统应用的坑
方案一:放到容器里
方案二:挂盘,写到外部存储上
两种方案都有一些问题:
放到容器里,逻辑上最简单,不需要做任何改动,但是它的问题是,怎么从容器中把日志取出来。
通过挂盘,把容器日志写到外部存储,然后沿用传统的Logstash + ES 的方式处理日志,听起来很美好,但是如何建立容器和日志的对应关系?
容器时代日志的正确打开方式
最终选择的解决方案
新的问题
新的解决办法
总结
平台自身监控
宿主机监控
中间件监控
总结
扩很容易,缩很难
什么时候缩容?
如何安全的缩容?
自身算法
应用程序本身是有状态的,需要保持会话
总结
以上内容是基于数人云在某银行实施过程中总结出来的一些感悟,如果能给大家一些帮助,我们非常高兴,如果有问题,请指出来,我们共同提高,Docker到现在大概有3年多的历史,个人看来它距离真正落地还有很大一段路程要走,我们必须不停的摸索。
Q:我想问一下,日志打两份的话具体是怎么实现的呢,用到了哪些技术或现有的工具呢?
A:我们自己实现了一个log-agent, 然后log-agent 可以实现这个功能。
Q:如果应用有自己的写的日志,如log4j的,输出不到标准输出,还怎么处理?
A:log4j貌似是可通过配置输出到标准输出的,另外如果有些应用不能输出到标准输出的,可以配置日志文件路径,我们会去读文件。
Q:缩容的产生条件是否有比较好的解决方案,比如根据CPU、内存甚至业务规则多维度的进行考察?
A:缩容很容易,但是麻烦的是如何安全的缩容,我理解这个环节其实是跟应用的逻辑有直接关系的,如果应用是一个无状态的应用,那么缩容非常简单,只需要在前端控制流量,然后停止容器即可,但是如果是有状态的应用,那么就有可能对用户造成影响。
Q:配置管理这块,不断的覆盖会增加镜像体积,如何最大化减少镜像大小呢?
A:首先,一个镜像最多被覆盖2,3次,测试镜像一次,生产镜像一次,而且配置文件一般是很小的,几乎对镜像大小没有影响。
Q:测试环境配置文件覆盖开发环境镜像,是只用测试环境的docket file 吗? 如果每天打版,会很麻烦吗?
A:通过覆盖测试文件来解决环境问题,只是一个思路,不一定非要使用开发测试环境的信息,这个可以具体情况具体分析。
Q:log-agent具体实现呢,日志直接打给log-agent还是log-agent读取本地日志文件呢?或者说log-agent读取标准输出的内容呢?
A:log-agent可以通过Docker的log-driver获取标准输出的日志,同时也可以直接读取日志文件的日志。