周海鹏:谢谢邵总和各位莅临的专家还有银行的同仁们,我今天的演讲是给大家一起分享一下我自己在进行容器云建设的一些思考,因为大家知道容器约等于,就是我们现在敏捷开发DevOps,我自己做容器有一点优势,我在华为做过云开发,有过瀑布式开发,在IBM做过测试,后来做了中机电支持,在中信银行做过系统运维、应用运维、广告存储、广告虚拟化、广告上线,所以会把IT的各个一些工种、方面可能自己都经历过,因为容器本身就是围绕快速上线,围绕应用去展开的。有一个比喻,我自己在IBM工作过几年,传统银行也都食用大机或者小机庞大的系统去做,有一个比喻,开始的时候我们都是大象,大象的特点就是他自己体型非常大,非常有力量,一跺脚地要颤一颤,但是它的特点在互联网+的时代是行动缓慢,食物匮乏,很多的大象可饿死了。本身我去年去过一次成都蚂蚁金服他们组织的活动,那时候有一个强烈的印象,像蚂蚁做这种普惠金融、互联网金融,就像一个蚂蚁,它的业务比如淘宝都很小,但是积累在一起就是非常大的一个力量,那么他们的运维技术、开源技术也是一点点积累起来,就会变成一个像非洲森林里行军蚁,大家也知道非洲的行军姨几千万上亿只,可以横扫整个非洲雨林的。
我今天给大家交流十个方面,开始五个方面,包括容器的一些我自己的考量,一些来龙去脉的问题,思考一下我们银行为什么要去做容器,后五点是我们在容器中的一些思考,因为我们时间可能只有半个小时,我讲一些重点,主要是两点,第一个是银行怎么能够去做容器,因为跟很多的银行同事沟通过,他们有的人POC很长时间,但是找不到一个切入点,没有上线。第二点,今天不会一直说容器的好话,因为确实容器有很多问题,作为我们金融的一些同仁们,我们自己在做容器的时候就要把握住怎么去落地,怎么去把控它的一些风险点。
第一个是谷歌,去年也有几个会,比如DevOps等一些金融会议,会有很多的技术流派介绍,大家会有一个共通点,就是有一个爆发点,我们不管是开发还是运维都会有一个爆发点,这个爆发点从一万到十万,尤其是做互联网业务的,当你有一万个机器,突然之间因为业务的爆发,像滴滴一样,当你有业务的量一下变成十倍,那你的机器是不是也要卖十倍?人是不是也要突击的雇佣十倍?都是要打问号的。我理解,因为去年也是跟咱们谷歌SRE一起沟通,感觉其实我们整个现在考虑了很多的东西都是谷歌,因为他们做互联网非常早,它五年十年前就开始思考,当大量的交易并发到来的时候,当你的服务器从一万台变到十万台的时候,到底怎么去运维,包括传统运维是非常耦合的,有大量的不同,应用错综复杂,紧耦合,环境,开发、测试、运行的环境问题,准生产到底是准不准?他们考核开发人员看你的服务器利用率,他们反向考核,包括提的非常多的是全站工程师,也就是他做开发运维全站需要各种的技能,包括从SOA到微服务。
现在互联网有大量的上线,甚至有的公司宣称一天可以上一千次,去年我就不太相信,后来我找到了蚂蚁金服的人,找到了京东金融的人和微信支付的人,他们确实是这样,咱们银行的高峰期上午十点就在上线,而且上去的东西是支付网关,因为他们的东西实在是量太大了,变化太多,我也是看了这本书,凤凰项目就是在讲再一个传统的IT系统,在受到互联网冲击的时候,它转变成一个在网上销售的时候需要快速上线,一天上十次线,它怎么做的?当时它有一个非常著名的一点,就是要把上线从无序变成有序,从有序变成类似制造业精密运维的工业化流水线,就是把它做成流水线那样的,可以说是0运维,人投的越来越少,自动化的工具去做。
讲到容器的时候要讲到起源,大家可能有人会听过逻辑思维有一期节目讲的特别好,罗振宇就讲改变二十一世纪最重要的一个发明由于集装箱,因为集装箱不但改变了我们的船运,改变了我们整个运输业,改变了整个铁路的宽度,改变了公路的宽度,改变了整个物流业,进而改变了整个世界的格局,那么容器其实也是作用非常大的,是希望用一种围绕营运的集装箱改变整个软件行业。这是Docker的历史,大家都见过,我又手绘了一遍,做金融可能讲Docker舭部开的就是传统的PaaS平台,2003年整个互联网业都在做容器,BAT也在做,但是各做各的,直到13年的时候Docker进行了开源,它才引爆了整个容器,大家可以看到容器最最核心的的技术,一个是隔离的技术,一个是地质空间。在2001年就已经出现了,到了2013年通过开源这种非常好的形势引爆了整个市场。Docker现在也不是唯一的,我们有三大阵营大家都知道,包括谷歌也在推容器,整个世界还是会有一个竞争的态势。
在咱们金融行业,传统的是大集中,对应的是集中式的系统架构,对应的是大型机,之后我们银行会大量推电子渠道ATMPOS,对应的一些SOA的,比如咱们银行都会有一个总线,有的叫大牵制,对应小型机,当你出现互联网化的时候开始出现分布式架构,我们开始大量的采购小型机,像中信银行2016年没有采购一台小型机的。最后到我们未来的区块链技术、智能化的银行3.0会考虑微服务包括容器,其实每个行都在做容器的试点。
这个也是容器发源的背景,在座的都知道银行都在做虚拟化,也就是从虚拟机到Lieux,其中有一个二八原则非常残酷,对于我们开发人员来说,我们传统的一年开发一个项目上线,经过正常的瀑布式的开发,其实已经不大适合了,因为业务部门他们竞争非常激烈,要快速上线,而且有一个二八原则,是他80%的应用都是无效的,也是无人问津的,或者你太晚了,比别人晚了一天你就失去了机遇窗口,所以这就逼得我们开发中心运维要进行快速上线。
这个也是我们上个月内部在做的事情,就是在考虑类似于网银传统的架构怎么变,我们传统围绕三台小机上面四个分区,通过WAS集群做一个高可用,前面有IHS,这个特点就是扩容太慢了,因为可能涉及到物理采购和整个WAS的创建一些测试,非常非常慢的,那我们现在变成了一个虚机时代,就是我的应用服务器要非常非常小,以前一个节点我可能部署很多应用,现在我只部署一个,把它做成一个最小最小单元的虚拟机,我抛弃WAS集群的技术,让一个服务器对应一个虚拟机一个应用服务器,我可以做到扩容。因为我是自己做系统上线和页面的建设,还有容器,我就在想其实里面的思路就是容器的思路,容器的两个特点,第一个,就是要把它的接口有线,但是容量做到无线,第二,要把自己做得足够小,像刚才举例子非洲行军蚁一样,能快速的扩展。
我们测试的时候要关注两个点,当你的并发变大的时候,要保证你整个通过容器数量的增加来保证你响应时间能够恒定。讲一下我对容器核心技术的理解,容器本身一台物理机会有一个虚拟话筒,对于我们的开发人员和应用人员约等于一台物理机和一台虚拟机,但是到了容器时代它是最小化的打包,就是我要多小就要有多小,我只把我最最需要的应用要的库打包起来,这个特点造成了它的优势,比如它自己非常的清凉剂,可以做到环境的不依赖,可以做一个平台管理,但是因为大家都是银行的,我们把安全做到第一位,所以我自己有一句名言,就是容器所有的优点都是它的缺点,因为它小,所以它的隔离度就没有像虚拟机那么大,因为它可以快速扩容,就会给我们应用运维带来非常大的问题,因为我们传统的运维是围绕一台主机,这台主机会有自己的IP、主机名,会部署在某一个物理位置,我们自己要做配置管理,这完全的传统运维中这种以节点为单位的运维方式就完全打乱了。
这是容器的两个关键技术,一个是访问隔离,一个是资源隔离,第二个技术也是容器,其实大家在做容器的时候,最困难理解也是最容易出问题的就是它的分层技术,然后我做了一个类比,我觉得容器的分层就是类似于咱们自己做开发时的立项对象,它是把自己需要的东西封装起来,后一层层的去叠加,通过继承关系,也就是我们本身一层层的去打包,创造一个非常千变万化的应用环境,而在不同的环境中通过dockfile又实现了在不同环境下的应用,这由于多态。大家知道我们面向技术怎么开发最最核心的技术?由于它变化出我们千变万化的开发的技术,我理解容器就是我们现在的运维最最重要的一个技术,它就是类似于面向运行的方法组装成,而且是非常轻量级便捷的组装成我们整个的运维环境。
这里是我自己做的例子,原来我是做虚拟机的,现在我容器就用一个大概二十行的配置文件,我得到中间件,基础镜像,应用包,WEB接口,就用二十行的配置文件组装成我的应用,而对于我们银行肯定需要一个集成环境,同样的是用另一个配置文件,组装成前面有一个组装器,前面有一个links,WEB通过links指想不通的文件,这就是与我们传统的搭建是不同的方式。这里有一个总结,因为我是做虚拟上线,从实体到虚拟机有一个提升,到容器有一个极大的变化,我们的效率弹性都有大幅度的提升,但是运维是有一个彻底颠覆性的变化。
微服务,我们在银行大家以前叫单体应用,我们自己可能有一个大前置,银行都会有一个交换中心,类似一个组件,我们每周要上线,因为不管是上什么应用,我都要在我的总中心改一个代码,都要重启这就是所说的SOA架构的问题,SOA它抽象出来一个交换中心,但这个交换中心是一个庞大的系统,任何一个变化都要通过上线和重启解决。到了微服务就是尽可能的解耦,尽可能的分散,让第一个模块的上线不影响第二个的上线,可以做到每天上线,上线的过程不会因为某一个上线影响整体的业务。这里有一个例子,也是咱们在容器里非常著名的一个例子,它未来得应用架构会是什么样子的?比如美国的大选,它前面会有一个展现,不依赖任何的WEB服务器,后面有一个redis的缓存,用Java写一个中间件,然后又一个新型的DB处理,最后展现是Node写的,整个应用是五个模块,会放在一个容器的管理平台上去管理,也就是应用的组合,下面五个模块,每个模块可以独立的扩展,模块之间用接口的处理,A模块的扩展不会影响B模块,就可以用简单这些代码来支持整个美国的投票。
开发规范,做容器的知道是十二原则,因为是美国人写的,所以跟我们开发习惯不大一样,我把我们在自己做的时候有很多落地,其中有一个很关键的点,比如配置,容器之所以可以不依赖环境,是因为把每个环境特有的东西抽象成配置,然后把配置和应用做了分离,刚才说了容器特别特别小,因为像在中信我们一个虚拟机200G,是标配,容器只有200兆,也就是它只有它的一千分之一,他这么小的量必须非常明确的告诉你我是需要什么类包,到虚拟机时代你可以把所有的东西,不管好坏,因为大家都知道是有300G空间的,把你所有需要的东西都可以装到这个虚拟机里,到了容器我要追求小的话,你就必须得做裁减。必须是无状态的如果有状态你得分离,大家知道容器一个口号叫弹性融缩,融就是一个可以变成十个,缩是一个变成十个,缩非常难,如果你上面跑着业务直接Que掉是会丢业务的,所以要必须得去保证一遍一遍的测试,能够让他弹性的扩上去,还要弹性的缩下去。
CI、CD也是大家谈的非常多的事情,弹性、敏捷不等于混乱,因为咱们金融行业要求一个非常严格的环境,有一个运维红线就是开发人员绝对不能碰数据,我们自己要做持续的集成、交付、部署,其中很多互联网公司都做到了一点,就是通过这个流程的一个工具化,大家都会有Git上用代码减负荷的工作,因为咱们银行都会有一个堡垒机强制性的进行预操作的负荷,就是通过这些工具来保证整个CI、CD虽然很快,虽然一天上十次但是不会乱。这是一个典型的互联网环境下的一些工具。
运维,容器非常快、非常小,我们确实得到了好处,我自己是做系统运维的,它占的磁盘空间是特别小的,我每年银行为了虚拟化进行大量的存储采购,但是,对于系统问题也会带来一个问题,这是我跟我们应用运维系统运维厂商一起总结的17个点,比如应用上线,传统金融行业上线的时候我们得评审,评审的时候一定要关注应用之间的关联关系,你的A系统上线不影响B系统,我们一定要到一个总生产环境验证一个包,上线的时候要自己去检查验证日志,如果发现回馈我们该得非常紧急的重启,有了容器我们评审的时候,尽量的微服务化,就要保证它的关联关系适用于我们可见得用接口的方式固定固化下来,上线的时候会有自动的冒烟测试,会提供接口,每个容器启动起来的时候去践行检查,如果我需要回退,我只需要把当前这台物理机上面的上一个版本做一个覆盖,实现了秒级的回馈。但是容器会有很多的问题,还有本身的处理,日常任务,日常日志清理,包括一些取数,系统监控之外应用取数,都会因为容器这个特点发生一个非常大的变化,甚至比如说它的定时任务就不能放在容器里,我们要单独为了容器再建立一个单独的自动化任务的平台,由他们来跑我们日常的工作。包括容器可以非常快的扩容的,大家可能都见过秒级可以从十个容器变成一百个容器,但是还带来一个巨大的风险,就是对后端的风险,所以这个连接数的控制,就A和B系统的控制必须严格的把控。人才培养有最后一点,这也是我们做容器会有容器厂商,有两个问题,致命的问题,第一,他不懂得运维,因为容器厂商很多都是从公有云的角度开发的,他们跟我们传统银行的精细化的运维思路不一样,他不懂开发,因为他不会用java和非语言,没有银行开发的能力,我们做的时候我们提出一体三翼,容器是我们的一个体,我们跟高校运维社区合作,他们帮我们做规划和运维,我们会请应用厂商跟我们共同成长,让他们按照银行的思路想问题,改造他们的产品,我们会建立一个生态,请我们自己常用的开发厂商,他们自己代码的时候要考虑为服务化,人才培养上,像我们中信银行做项目就是一步两中心一起做,我们都会出部门,比如我在PMO管整个双轨的上线,开发中心在做微服务改造,我们管它叫做aPaaS,PaaS做应用的上层,我做基础架构的底层,以上就是我给大家分享的心得,谢谢大家。