【编者的话】现在业内一提到Docker就必然说到Kubernetes、Mesos。然后就提到重写Kubernetes、Mesos,优化Ubuntu内核等等。作为一个资源紧缺的使用者我只能表示用不起。我就是喜欢把事情简单化,用最小的力气做事。简单粗暴没什么不好。
【3 天烧脑式容器存储网络训练营 | 深圳站】本次培训以容器存储和网络为主题,包括:Docker Plugin、Docker storage driver、Docker Volume Pulgin、Kubernetes Storage机制、容器网络实现原理和模型、Docker网络实现、网络插件、Calico、Contiv Netplugin、开源企业级镜像仓库Harbor原理及实现等。
我说另类是指我就用了原生的功能,这些对我们来说基本够用了。还省去了很多开发维护的工作量。
1. 最小化的使用Docker,保证资源利用最大化和服务分钟级切换。
现在业内一提到Docker就必然说到Kubernetes、Mesos。然后就提到重写Kubernetes、Mesos,优化Ubuntu内核等等。作为一个资源紧缺的使用者我只能表示用不起。那么真的需要这么用吗?Docker自带的工具可以吗?其实我们经常处于消费过剩,需求过剩的状态。很多需求都是伪需求,没必要什么都做到100%。为了达到这目标需要的资源比做到70%要多几十倍。我们使用工具目标是用最少的投入来解决问题。简单粗暴没什么不好。
首先我们使用Docker是为了解决服务稳定性和资源紧缺的问题。现存很多关键系统(非生产)都跑在古老的服务器上,说挂就挂。很多系统跑在VM上,宿主机资源不足。说不定突然VM就崩了。甚至于宿主机直接挂了,再也启动不了。想上新系统,机柜也没空间。所以为了保证这些系统的稳定和高效,就决定把这些系统迁移到Docker系统。
先用一批新机器安装Docker,配成Swarm集群。然后把用的服务一个个做成image,上传到集群上的Docker Hub。所有服务的端口全部固定,人为错开。网络全部使用Host模式。所有的数据全部从外部存储挂载。就是这么简单粗暴。
然后把所有服务启动在Swarm上,看看负载情况,不行就手动指定机器。全部启动完成后,把IP和Port填入DNS和Nginx。其他人就可以通过域名来访问到对应的服务。如果服务挂了,重启这个服务,然后修改对应的DNS和Nginx。如果服务代码变了,直接JENKINS编译出新版本image到Docker Hub。停服务,拉镜像,重启,修改DNS,这些都可以通过脚本完成。
下一步在所有镜像里添加自主开发的Agent来完成服务监控,完成服务自发现。再加上服务监控。基本就可以用一段时间,不用折腾了。
这个方案的缺点就是如果是JIRA这种有License的软件,必须手工重新去获取机器信息,然后重新申请License。不过正常情况服务就这么起个一年,也不用管它。系统监控通过Zabix和我们自己开发的Agent来进行。也能满足日常监控需求。
这样搭建整个环境,2个人搞两周就行了。
2. 中等规模测试环境Docker的规划,环境网络隔离及持续集成。
因为我们是金融公司,所以目前生产系统还没有打算上Docker。在测试环境还是可以用Docker的。由于多个测试环境需要互相隔离,而且服务一般都部署在80端口,所以就要比前一个用法进阶一点了。用Contiv进行VLAN的隔离。各个环境互相隔离。IP也自动分配,不用自己管了。服务启动后自己上报信息,修改DNS和Nginx的信息,内部外部都可以访问。
针对不同的测试环境建不同的Jenkins,可以产生对应的镜像部署到对应的测试环境。缺点是不能做到按需建立和销毁环境。那个还需要进行很多开发工作。整个Docker的动态伸缩也没在考虑过程中。毕竟规模不大。预先划分出5,6套测试环境足够使用。
这样就把整个CI内置到测试环境中了。
Q&A
Q:请问从开始看Docker到完成环境搭建大概用了多长时间?Q:可以说明下为什么生产环境不用Docker吗,跟你们是金融公司属性有什么关系?
A:前期的学习和选型用了2个月。后面基础搭建用了1个月,耗时最长的是旧服务的Docker化,这个到现在还没全部完成,因为技术债太多。
Q:主要想了解下你们集成的流程?
A:因为金融公司对于稳定性有非常高的要求,同时对于生产服务器数量和空置率又不敏感。所以Docker这样的新技术应用还是需要不会那么快切入。同时运维团队也要去学习,技术储备等都是阻碍。所以现在很多银行也只是在周围不重要,变化频繁的系统开始尝试Docker。
Q:为什么不考虑在私有云平台上玩?
A:CI的流程和普通的CI类似。代码变动后触发Jenkins,Jenkins会编译,打包,产生一个对应的发布单元的新容器版本。然后触发对应的脚本来停服务,取镜像,启动容器。
Q:请问容器做编排管理,你们选用什么工具
A:因为资源限制,从硬件及人力上都不足。另外就几十台服务器,没必要。如果有几百台就要考虑资源调度等因素。
Q:如何让宿主机挂载到存储之后,让容器全部跑在存储里面?
A:我们只用了原生的Swarm。这样不用考虑开源软件二次开发及工具间的版本兼容问题。
Q:z387的ip如何分配?
A:容器本身还是在Docker主机的磁盘中,但其他数据:例如配置文件都是从SAN上挂载到容器中。这样保证如果Docker主机down了,容器可以在其他主机上重启恢复。
Q:为什么把JIRA也Docker?
A:Contiv会帮你分配IP的,不用自己管理。
Q:镜像带环境变量属性吗?
A:因为资源不足,没有强大的主机来跑JIRA,也没有办法主备。所以干脆把这些重要系统都放到容器里。这样就可以用较少的主机来保证性能和可用性。
Q:如果服务挂了,重启服务。重新修改DNS和Nginx,问题1:服务挂了,Swarm可以负责重启吧?问题2:为什么重启后需要改DNS Nginx。Swarm的ingress网络可以从任何一台node路由到对应的Container吧。
A:看情况,我们跑自动化测试的镜像有环境变量属性,因为有很多可变参数。
Q:应用是Java的吗,根据环境不同的配置文件如何处理?
A:如果镜像down了,Swarm会管理的。但如果是服务不可用,Swarm是不知道的。这时候就需要在服务监控那里触发重启。由于服务还有端口的问题,所以是在Nginx上转发到真实的服务端口上。DNS基本都是配置到Nginx上,如果Nginx挂了,就要把DNS重新指向。
Q:如何做多版本环境隔离测试?
A:大部分是Java的,也有Python等。我们自己开发了一套配置文件管理的系统,同时对配置文件里的配置项进行命名规范,这样从一套环境到另一套大部分情况是直接自动进行修改的。
Q:请问Ngin配置的是Container的IP还是物理机IP?
A:目前我们没有这样的需求。测试环境基本上都是和生产对齐。特殊情况是在Jenkins上来选择特定的代码版本来进行部署。所以在不同的环境里可以部署不同的代码。
Q:不同环境的配置文件是在镜像层面替换进去还是在容器层面替换进去
A:Nginx是暴露出80端口在容器宿主机上的。
以上内容根据2017年06月20日晚微信群分享内容整理。分享人寿佳炎,盛付通质量流程中心经理。在通信和互联网跌打滚爬近20年。几乎干过研发体系内各种岗位。从初级码农到管理层。中国第一批EXIN DEVOPS MASTER认证通过者。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesa,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。
A:是在容器层面的。每个容器上有个Agent,负责去拉取配置文件。
有疑问加站长微信联系(非本文作者)