数人云CTO解读Docker 1.12和金融业容器化

7月29日数人云在上海举办金融沙龙,邀请上交所和近二十家来自银行、保险、证券的IT技术专家一同探讨容器技术在金融业中的最佳实践。数人云CTO肖德时在会上将传统金融行业通过容器可以解决的四大问题做了逐一解读。

以下是演讲实录:

容器技术基本上是2013年出来的,2014年开始在中国传播。在2016年,大家可以感觉到Docker技术的发展加速,在生产环境中也有很多的成功案例。在DockerCon 2016上我们发现,Docker已经从原来的一个工具变成一个真正的生态圈,Docker已经具备整套的解决方案,同时上下游生态也已经非常完备。这都在告诉大家,你能想到的、和你需要的一些最佳实践,Docker基本上都能提供。目前,基本上是大公司在不断的追求Docker的技术,因为小公司用Docker技术解决问题产生的收益比还比较不明显,而大公司原来冗余的架构通过使用Docker确实可以产生效益,所以一些传统企业对Docker会比较关注。

容器技术发展加速

最新的资料显示,现在是应用Docker技术的比较好的时机。全球雇员超过500人的公司中73%已使用Docker技术。国内的很多公司也都在关注这项技术,尤其是金融行业,因为金融业的IT发展的比较成熟,他们对新技术比较关注,Docker已经有很多生产应用在里面产生。

用Docker能干什么是大家比较关心的问题。第一个比较常见的场景是DevOps,DevOps实际上就是提高生产力。原来,开发能做运维的事,运维能做开发的事。但实际上从真实的场景里,术业有专攻,在创业公司可以这么干,但传统公司做不了。Docker可以帮助企业进行业务的转型,提供标准的接口,这样开发提供标准运维能知道,运维提供标准开发也能知道。传统企业的开发流程不像创业公司,一个人要干很多事,传统企业强调的是标准化,是业务的转型,而在原有的老的制度下很难实现这种标准,用Docker技术可以加快转型。

第二个场景,云化。2016年云计算开始了新的增长,云计算发展到了新的技术点,老的虚拟化技术已经不能满足企业对动态资源和快速响应的需求,不能起到资源复用的作用。Docker可以应用在物理机上,也可以应用在虚拟机上,可以快速构建应用管理平台,或者构建IaaS、PaaS,或者service都可以。原来部门做不了,因为没有技术栈的改变,仍然要用老设施,那些老设施都是为大企业设计的。但是Docker出来的时候就是为开发者服务的,它是一个工具,一个人也可以做一个私有云。从这个点来看,在云端的转变这个场景里Docker是目前比较推荐的技术栈,它能够快速构建应用管理平台,可以有很好的基础。

另外,用了Docker一定要无状态,这只是表象,以前的应用架构和原来的状态是不是就一定不能满足现在的需求?不是的,原来的单体仍然可以用,为什么要做微服务?因为业务里有多个Function,其中有一个Function是特别热的,这时候怎么能抽出来?最简单的办法就是重构,因为想把它抽出来,抽出来以后,如果没有一些工具怎么做后面的工作?这都是限制问题。Docker公司提供的方案就是用Docker把它包裹一下,成为一个标准的小组件,然后利用分布式的概念,把它scale out,scale out以后再进行后面的工作。在现代的应用中,用了云,资源更容易获得,所以客户想快速地创造一些环境,这些环境里面的资源利用率解决了,但是应用的复杂度仍然存在。如何动态的分配,就是刚才上交所介绍的一些治理的方法。在Modern APP之上会面临一些问题,但是如何快速响应,这个情况是需要一些工具的,这些工具我们认为Docker是可以做到。

大背景,之前IOE的架构存在,不是说不好,从技术层面来讲,我并不认为IOE有什么不好,只是我加了一些策略做这件事,它比较拥堵,但不代表它不好。还有“十三五”规划,自主可控的要求,这些背景让企业对开源工具的需求变得会越来越多,数人云这种开源公司也是应势而生,我们给企业提供的解决方案就是自主可控,把开源、透明的技术交给客户。

在2015年,当时去跟客户说我们上一个Docker,人家说你的Docker和VM比有什么好处?VM用的多好,为什么要上Docker?当时我们是无言以对的,因为安全性,还有各种生态圈的工具链也不成熟。但是慢慢的,我们在做这件事的时候发现,其实这是需要和企业一起成长,我们也总结一些步骤。

金融行业拥抱容器四大步

总结一下我们想解决的问题,首先,Docker能不能解决快速发布的问题,实际上用Docker以后,管理起来是更复杂的。所以才会有数人云这种PaaS的存在,把复杂的东西用计算机的方式管理,因为用个人的方式是没法管理那么多资源的和实例的;二是原来多套环境相互隔离,客户需要的是多套环境多租户的分发,真正的隔离,因为是内部系统,对于隔离的要求还是可以分级的。环境的快速搭建涉及编排,怎么把DB分成两个,上面分成多个,然后都能访问DB,还有如何将手工操作变成自动的;三是大版本升级回滚,很难做这种升级回滚,怎么去做;四是各种设备,有的CPU,有的是VM,有的在物理机上,这么多设备怎么统一的管理起来。这是我们现实的一些场景,我们怎么解决这些问题是我今天想和大家一起探讨的问题。

第一个问题是快速部署,还有缓慢的升级,基本上就是用容器和微服务解。微服务是一个框架,如果把现有的服务拆成微服务,一定是一个统一的架构,那这个架构里面一定是包含这样的元素:首先,一定要有一个API网关的Server,微服务里面的API网关不涉及Nginx,因为Nginx没法动态的改配置,得手动去改,这是满足不了需求的,因为底下的应用无数,所以上面一定要构建自己的API网关,这个网关可以解决所有的问题,要不然下面每个API的服务,它的服务请求SLA都是可以经过网关控制的,这也是新型微服务架构里面经常不被人提起的,被忽略的地方。但是这是非常重要的一点,因为底下的服务特别多。发到集群里,怎么管控这些服务的质量,就是API的请求,出错怎么办,怎么来控制?这些都要通过API网关来控制,所以这个一定要去注意一下。

另外是几个大块的认证,如果你的内部认证没有统一的认证,就没法做标准化的双向通行,而且API网关也没有办法给下面的应用下发东西,因为没法认证。还有Configuration server一定要加上,Service Discovery单纯靠容器解决不了,需要PaaS的容器平台解决。做端口、应用的发现,方便其他应用访问它。还有监控、报警,然后就是常规的日志分析,这就是常规的需求。这些需求里面最特殊的就是容器,因为很多个要做逐一监控,没有一个平台是不行的。对日志也是一样,每个容器起来以后就死掉了,怎么知道这个容器是应用呢?一般都是要通过容器的ID来标识,然后收集回来。

还有一个API网关里面最大的特点,快速的熔断,什么意思呢?就是底下的服务很可能出问题。微服务架构里都打散,上面挂一个Nginx,如果业务量大了,如何快速关闭某个API呢?没有可编程的接口是做不到的。但是要采取微服务解决,这个架构的的组织形式就是这样。微服务里面承载的这些组件特别复杂,需要一个标准的组件来封装起来,这个封装组件的方式用Docker是比较合适的。微服务的架构确实可以解决这个问题,因为每个组件的升级很快,如果把整个组件升级一下,还有一些其他的东西,会很麻烦。我们会想到能给一个这样的架构,微服务架构里面统一管理服务。

环境之间的隔离,Docker做的目录级别的隔离已经完全可以满足需求了,原来为什么做不到这点?是因为手工的操作特别多,用别的方法隔离也是没有问题的。但是我们觉得,原来的架构里面,CICD的架构已经很成熟了,能不能把它自动化?因为完全可以用Docker来交付整个环境,手工部署没有问题。我们再往前走一步,怎么走?Jenkins可以调一个集群系统,然后分发集群,刚才说的微服务发到这里面,然后快速的部署。这是一个自动化的过程。这里面涉及到一个问题,原来咱们经常会听到的是持续构建,也就是把原码先构建成镜像,然后镜像再发到集群里面,这个操作觉得很顺,但实际上这里面真正的挑战在于,因为每个业务组件的依赖,还有他们之间的配置怎么抽离出来,这都是需要比以前更复杂的。所以,用容器确实解决了持续集成的一部分问题,但它对你的技术要求会越来越高。原来是手工做,而现在需要自动化。对于基础人员的架构改造,其实是抽象层更高一点,对大家的要求也会更高一点。

大版本升级不可回滚。大版本的升级困难点在哪儿?原来都是单体服务根本没法拆,动又不能动,刚才说了微服务基本上能够解决它。第二个情况是每个版本的版本控制怎么解决?基本上配置中心可以把配置做出来,然后建仓库,做版本控制。要做这个最好是滚动更新,也就是在不停机的情况下,一点点把业务迁到新的应用上面,然后将老的流量在处理完业务之后慢慢的退掉,这是一种办法。服务的时候,原来指向老的服务进程,自动地切到新的服务进程里面,这样产生流量尽快切到新的服务里面,所以这是需要服务发现的。

我们这边会构建一个集群,我们用的ZooKeeper去保证调度器,在正常运行的情况下,我们给Marathon发指令,让它把应用一个一个更新。起一个服务,保证老服务不停机,这时再把域名切换,进来的新流量就到新的应用里面了,老的应用在没有流量的时候自动退出,保证用户访问的时候没有宕机的感觉。这是集群环境里面做升级的常见案例。

还有各种异构设备,硬件资源利用率比较低,解法是数人云的应用集群。它是容器的集群,我们的系统会运行在独立的环境里远程控制集群系统,保证系统里面运行的只有容器,然后有相应的Agent来管理应用的服务。

这张图比较清晰一点,数人云本身就是微服务的架构,这里面针对的情况,大家都知道Nginx性能是最好的,我们可能在这上面写一个新的API网关对接整个系统,这套系统是数人云系统架构里面的一部分。我们业务管理用Marathon调度器会进行升级,因为Mesos本身是集群管理的调度。对于这些组件,比如镜像,我们采用的方式是跟VMware合作的一个开源项目叫Harbor镜像管理仓库,这是我们和他们一起合作开发的软件。持续集成我们和Jenkins做集成,通过自动配置能够把我们这个小本下发给Jenkins,然后和它构建镜像。监控报警,大家会觉得容器的监控报警不好做,容器目前为止基本上都是接口,现在新的容器把日志和报警,所谓的报警的实现都要按照流程的方式提供API接口,只要接上就收走日志,在本地不落盘。日志也是一样,它现在提供plugin方式和日志系统对接,不用担心落到盘里面收上来是不是把硬盘撑爆,现在都可以配的。这里对于我们现在新加的网络模块,就容器发展到现在其实对于网络都是成熟的,大家都在用host模式去管,虽然容器很轻,但并不比VM先进到哪里去,只是说它更轻量一些。客户希望VM有的东西它也有,这块最后也提供了这种对于IP的管理。所以也是刚刚在上的一种新的成熟架构,也就是说一容器一IP,现在是刚刚才开始支持,这是我们最新配套的。

容器圈新方向预览

讲完这些方案之后,今天会有些容器圈的新东西给大家讲讲。

首先是Docker1.12,昨天它正式发布了,这是一个新版本的发布,最重要的发布。这个发布先是内置了自己的工具,再就是对网络的增强,达到了更容易商用的阶段。第二个是我们现在用的Mesos,也发布了1.0,可以给大家介绍一下特性。

Docker1.12它有一个重要的特点,一般在集群系统里面,因为容器是很碎的,用户希望知道这个服务到底是run还是不run,原来的方式是Docker run的时候把端口打开,然后通过一个脚本去查。这等于是第三方去做,现在提供的功能是可以在构建镜像的时候就把Healthcheck打开,通过Docker Daemon的内容给这台主机上运行的容器定期的检查,通过Docker知道这个容器是不是健康的。当然这个功能并不是为咱们准备的,是为自己内置的Swarm编排工具做准备的,因为Docker公司做集群管理的工具也在想这个事情。还有一个情况是咱们最常用的CentOS系列,原来对于安全Docker公司一直在回避,它现在默认把这个组件打开了,打开以后跑出来更安全。Linux可以打标签、做监控,但是这个东西因为刚出来,所以只是一个信号,也就是Docker越来越安全了,原来是做不到,现在是越来越方便了,可以做到这样。Docker内置了一个IPVS,干什么用?就是想替代HaProxy提供IP给网络里面。这是比较新的技术,目前我们认为处于实验阶段,它利用IPVS的模块来提供网络的接口,只是一个信号,目前是没有采用这种方案的,因为太新了,还要测试。最后是内置Swarm的组件,这是很轻量的编排工具,也就是说装几台机器,必须要组成一个网,怎么去做?可以用Swarm做这个事。这个网IP怎么做,用IPVS,这就是最新的Docker的发展,非常快。

目前为止,一容器一IP技术理论已经落地。每台机器要装一个小的路由器,然后小路由器给你的容器。这个路由器可以想象成家里的无线路由器,因为是个屋子,一台主机里面都有屋子,任何终端设备都可以向路由器调IP,这个IP是假的都可以。当然Docker里面现在有了网络的插件,就相当于类似有了一个驱动,就可以找路由器要一个IP,实现了路由器有IP。大家注意到这个IP和底下的IP不一样,他们之间通过IPtable 做包头的转换,通过转换就可以双向通信了。但是这里面192.168的网段和10网段的管控,如果只做一次转发,那就控制不了这些IP之间的东西,我们用的方案把这些规则都记录在一个键值库里面,这样的好处在于,可以控制这个IP和这个IP的通信,把它记录下来就可以了,如果删掉,默认不让它通信也是可以的。虽然一台主机有三台服务器,但是他们之间是否能通信是你可以控制的,这样更安全。也就是说,用户有一个应用,这个应用是1.1和0.9,放在这两个容器上,然后1.10是另外一个APP,不希望他们之间互相通信就可以通过IPtable写进去,然后把他们隔开,他们通信的时候,一看规则没有就把他们删掉了,路由器就不会给它分。

还有一个情况,都是容器里面的IP,那外网的IP之间能不能通信?因为内网有一个路由器,路由器给它分了一个IP,也想给容器分一个同样网段的IP,需要一个网关来转换为可用的IP,转换给它,就是改包头改完包头转进去。它请求的时候再转出去,两个路由器之间再转一下,是这样的过程。它有一个缺点,就是主机的数量不能太大,毕竟是虚拟的IP网络,主机的数量不是容器的数量,基本上在200台左右是一个推荐的方式。

性能对比,跟主机、物理机再和calico的解决方案对比,基本上会在1024、2048、4096这块,如果用普通的overlay方案性能就很低,目前Docker overlay自己的原生方案性能就很低,但是它在提升,因为它刚刚出来。上面这套方案,因为calico的方案只是在包的包头上做了篡改,欺骗主机转发数据包,所以它的性能和host主机之间,有时候从数据表里面看到它传输的效率,吞吐量比host还快,但是这个数有假像,因为改了包头,但是基本上可以肯定,和原生的host的网卡里面性能是差不多的,是这样的情况。

最后说Mesos现在新产品,就是1.0技术开源的组件,1.0以后,我们基本上就会有新的HTTP API,原来的API都是Google的协议,现在有新的HTTP API更方便数人云和它做深度整合,我们也希望不断的前进,给客户提供更好的产品。第二个情况,大家现在遇到的情况,那就是Docker有各种各样的bug,这个问题没有很好的解决办法,因为Docker公司的产品是开源的,它的商业产品也到不了中国。Mesos解决了这个问题,Mesos拥有给Twitter、苹果等都部署过几万台的节点的经验。他发现安装Docker Daemon以后,Docker是很不稳定的,尤其在大规模集群方面很不稳定,所以他们推荐另外一个方式,就是用原生的容器框架解包镜像。客户在本地用Docker,但是把镜像发给我,我用另外的方式把这种镜像给起起来,用户是透明的,就认为它是Docker room,但它不用了Docker Daemon,因为把Docker Daemon关掉以后容器就死掉了,但是把Docker Daemon去掉以后,容器还要通过原生的方式运行起来,这就满足了企业的各种需求,这是新的技术点。还有云原生APP架构里面,对于网络需要一个标准,现在提供了一个类似的架构,Mesos提供了这个标准。另外就是支持GPU。还有Mesos在和微软合作,开始接管Windows的一些信息,这也是比较大的亮点。这个生态圈还是比较活跃的,这也是数人云关注和考虑的。