勿忘初心

个人签名

530篇博客

容器平台选型的十大模式:Docker、DC/OS、K8S谁与当先?(1)

勿忘初心2018-11-08 13:19

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


本文根据刘超在DBAplus社群第122期线上分享整理而成


无论是在社区,还是在同客户交流的过程中,总被问到底什么时候该用Docker?什么时候用虚拟机?如果使用容器,应该使用哪个容器平台?显而易见,我不会直接给大家一个答案,而是希望从技术角度进行分析具体的场景,例如客户是大公司还是小公司,将部署小集群还是大集群,倾向于私有云还是公有云,已经采购了IaaS还是没有IaaS,IT运维能力强还是弱,是否需要物理机、虚拟机、容器的混合部署,是一般的并发系统还是高并发,这里面所应该做的技术选型都不一样。


例如,如果你是一个初创型的主营业务非IT的小公司,自然不应该花大力气在数据中心里面自己搭建一套大规模、高并发、高性能的容器平台。


首先我们来谈什么情况下应该使用Docker的问题



如图,左面是经常挂在嘴边的所谓容器的优势,但是虚拟机都能一一怼回去。


如果部署的是一个传统的应用,这个应用启动速度慢,进程数量少,基本不更新,那么虚拟机完全能够满足需求。


  • 应用启动慢:应用启动15分钟,容器本身秒级,虚拟机很多平台能优化到十几秒,两者几乎看不出差别

  • 内存占用大:动不动32G,64G内存,一台机器跑不了几个

  • 基本不更新:半年更新一次,虚拟机镜像照样能够升级和回滚

  • 应用有状态:停机会丢数据,如果不知道丢了啥,就算秒级启动有啥用,照样恢复不了,而且还有可能因为丢数据,在没有修复的情况下,盲目重启带来数据混乱。

  • 进程数量少:两三个进程相互配置一下,不用服务发现,配置不麻烦


如果是一个传统应用,根本没有必要花费精去容器化,因为白花了力气,享受不到好处。



什么情况下,才应该考虑做一些改变呢?


传统业务突然被互联网业务冲击了,应用老是变,三天两头要更新,而且流量增大了,原来支付系统是取钱刷卡的,现在要互联网支付了,流量扩大了N倍。


没办法,一个字:拆!


拆开了,每个子模块独自变化,少相互影响。

拆开了,原来一个进程扛流量,现在多个进程一起扛。


所以称为微服务。



微服务场景下,进程多,更新快,于是出现100个进程,每天一个镜像。


容器乐了,每个容器镜像小,没啥问题,虚拟机哭了,因为虚拟机每个镜像太大了。


所以微服务场景下,可以开始考虑用容器了。



虚拟机怒了,老子不用容器了,微服务拆分之后,用Ansible自动部署是一样的。


这样从技术角度来讲没有任何问题。问题是从组织角度出现的。


一般的公司,开发会比运维多得多,开发写完代码就不用管了,环境的部署完全是运维负责,运维为了自动化,写Ansible脚本来解决问题。


然而这么多进程,又拆又合并的,更新这么快,配置总是变,Ansible脚本也要常改,每天都上线,不得累死运维。


所以在这如此大的工作量情况下,运维很容易出错,哪怕通过自动化脚本。这时,容器就可以作为一个非常好的工具运用起来。


除了容器从技术角度,能够使得大部分的内部配置可以放在镜像里面之外,更重要的是从流程角度,将环境配置这件事情,往前推了,推到了开发这里,要求开发完毕之后,就需要考虑环境部署的问题,而不能当甩手掌柜。


这样做的好处就是,虽然进程多,配置变化多,更新频繁,但是对于某个模块的开发团队来讲,这个量是很小的,因为5-10个人专门维护这个模块的配置和更新,不容易出错。


如果这些工作量全交给少数的运维团队,不但信息传递会使得环境配置不一致,部署量会大非常多。


容器是一个非常好的工具,就是让每个开发仅仅多做5%的工作,就能够节约运维200%的工作,并且不容易出错。


然而原来运维该做的事情开发做了,开发的老大愿意么?开发的老大会投诉运维的老大么?


这就不是技术问题了,其实这就是DevOps,DevOps不是不区分开发和运维,而是公司从组织到流程能够打通,看如何合作,边界如何划分,对系统的稳定性更有好处。


所以微服务、DevOps、容器是相辅相成,不可分割的。


不是微服务,根本不需要容器,虚拟机就能搞定,不需要DevOps,一年部署一次,开发和运维沟通再慢都能搞定。


所以,容器的本质是基于镜像的跨环境迁移。


镜像是容器的根本性发明,是封装和运行的标准,其它什么namespace,cgroup,早就有了。这是技术方面。


在流程方面,镜像是DevOps的良好工具。


容器是为了跨环境迁移的,第一种迁移的场景是开发、测试、生产环境之间的迁移。如果不需要迁移,或者迁移不频繁,虚拟机镜像也行,但总是要迁移,带着几百G的虚拟机镜像,太大了。


第二种迁移的场景是跨云迁移,跨公有云,跨Region,跨两个OpenStack的虚拟机迁移都是非常麻烦,甚至不可能的,因为公有云不提供虚拟机镜像的下载和上传功能,而且虚拟机镜像太大了,一传传一天。


所以跨云场景下,混合云场景下,容器也是很好的使用场景。这也同时解决了仅仅私有云资源不足,扛不住流量的问题。


所以这是我认为的容器的本质,是最终应该使用容器的正确姿势,当然一开始你不一定完全按照这个来。


模式一:公有云虚拟机


适合场景:初创公司,无信息安全担忧


如果您是一家初创公司,人员少,IT运维能力不足,要部署的系统很少,能够花在IT系统上的资金有限,当然应该选择公有云的虚拟机部署,它能够解决您的如下问题:


  • 基层IT资源的管理交给公有云平台,公司自身运维人员仅需要基本的Linux能力

  • 少量的部署系统,例如10台以下的虚拟机,往往替换一个war,重启Tomcat就能解决,如果稍微虚拟机多一点10到20台,Ansible脚本可以很好的解决这个问题

  • 公有云按量按时收费,可以在花费很少的情况下启动,并且在业务飞速扩展的时候,迅速申请大量虚拟机


这里所说的信息安全担忧,真的仅仅是心理的担忧,公有云往往有大量的安全机制来保证每个租户的安全隔离,只要用好了这些机制,公有云的安全性绝对大于一般的公司自己搭建的数据中心,为什么呢?


大家有兴趣可以阅读《当客户在说要安全的时候,客户在想什么?》,绝对的端到端解决方案。


这里贴张图说明公有云的安全性。



公有云为支撑自身高并发业务积累了更强的安全防护能力和更多的安全防护经验:


  • 多线BGP,外网线路冗余

  • 高吞吐量的DDoS外网防护

  • 更完善的防火墙,入侵检测,WAF

  • 更完善的流量清洗规则


公有云为支撑自身高并发业务推出了更安全、更高可靠、更高可用的PaaS服务:


数据库:

  • 高可用:主备切换数据零丢失

  • 高可靠:同城双活,异地备份

  • 安全性:访问控制,IP白名单


对象存储:

  • 高可靠:超大容量,三份备份,异地同步

  • 安全性:访问控制,防盗链


公有云为支撑自身高并发业务推出更完善的监控运维的系统,流程,经验:


  • 完善的监控系统,保障大促期间系统故障的快速定位和排障

  • 保障大促能够极大的提升和训练一支有经验的运维团队

  • 大促的业务层面的数据对运维也是机密的,需要流程保障


道高一尺魔高一丈,公有云为保证自身业务的安全性对云平台不断升级:


  • 越来越强的DDoS防护

  • 越来越完善的防火墙规则

  • 最新的云平台安全功能和机制

  • 不断更新的虚拟机和容器镜像建设漏洞

  • 不断更新的病毒库


这不是今天的重点,这几张图大家自行参考。


模式二:无IaaS,裸用容器


适用场景:初创公司无IaaS,有信息安全担忧


但是即便如此,还是有初创公司或者初创项目,也许因为心理方面,也许因为合规方面,非常担心信息安全问题,还是希望采取部署在自己机房的方式。


但由于是初创公司,在机房里面一般是不能部署IaaS,因为IaaS平台的运维难度,优化难度更大,没有一个50人的团队根本玩不起来,所以一般在使用容器之前,采用的是物理机部署的方式,当物理机数目非常小,比如部署5到10个应用的时候手动部署或者简单脚本部署就可以,但是一旦到了20个应用,手动部署和简单脚本就非常麻烦了:


  • 运维人员比例低,而应用相对较多

  • 部署在同一个物理机上的应用多,配置冲突,端口冲突,互相连接,运维需要一个excel去管理,还容易出错

  • 物理机容器被脚本和Ansible改的乱七八糟,难以保证环境一致性,重装物理机更加麻烦

  • 不同的应用依赖不同的操作系统和底层包,千差万别


这个时候,可以试一下裸用容器,即在原来的脚本,或者Ansible里面,将启动进程,改为使用Docker run,可以有以下的作用:


  • 配置,端口隔离,冲突减少

  • 基于容器部署,使得环境一致性,安装和删除干干净净

  • 不同的操作系统和底层包,都可以用容器镜像搞定


在这个阶段,最简单的方式就是把容器当做虚拟机来使用,也即先启动容器,然后在里面下载war包等,当然也可以更进一步,将war包和配置直接打在容器镜像里面,这样需要一个持续集成的流程了,不仅仅是运维的事情,开发也要参与其中。


在这个阶段,网络的模式可以使用桥接打平的方式。



这种方式好处是访问Docker和访问物理机一样,可很方便地实现Docker里面和物理机里面的互通,兼容原来部署在物理机上的应用。


当然Bridge的性能一般,如果性能要求比较高,可使用SR-IOV网卡嵌入容器内。



模式三:有IaaS,裸用容器


适用场景:创新项目,引入DevOps流程


有一些公司规模大一些,已经采购了IaaS,只不过有一些创新的项目需要部署,这种状态下,基本虚拟机已经能够满足需求,而且由于能够运维IaaS,IT能力比较强,一般也采用了Ansible等部署工具。


这种情况下,使用容器的动力相对比较少,然而容器也是能够带来一定好处的,就是DevOps。


创新项目迭代速度比较快,如果有比较多的创新项目,对运维的压力也是非常大的,这里的裸用容器和模式二的裸用容器不同的是,不是拿容器当做虚拟机来用,而是将容器当做交付物来用。虽然容器化对于运维的整个过程来讲改进有限,但是关键就是要开发写一个Dockerfile,这一点非常重要,意味着运行环境的配置提前到开发,而非直接交到运维,也即上面说的,开发5%的工作量增加减少大量运维工作,容器环境原子性升级回滚使得停服时间变短,可以保持开发、测试、运维环境的一致性。



模式四:使用Docker Swarm Mode


适用场景:发展中公司,中等规模集群


当集群规模超过50台时,裸用容器已经非常难受了,因为网络、存储、编排

服务发现等全部要靠自己的脚本或Ansible来搞定,是时候引入容器平台了。


当容器平台规模不是很大时,Docker Swarm Mode还是比较好用的:


  • 集群的维护不需要Zookeeper,不需要Etcd,自己内置

  • 命令行和Docker一样的,用起来顺手

  • 服务发现和DNS是内置的

  • Docker Overlay网络是内置的


总之Docker帮你料理好了一切,你不用太关心细节,很容易就能够将集群运行起来。


而且可以通过docker命令,像在一台机器上使用容器一样使用集群上的容器,可以随时将容器当虚拟机来使用,这样对于中等规模集群,以及运维人员还是比较友好的。


当然内置的太多了也有缺点,就是不好定制化,不好Debug,不好干预。当你发现有一部分性能不行时,你需要改整个代码,全部重新编译,当社区更新了,合并分支是很头疼的事情。当出现问题时,由于Manager大包大揽干了很多活,不知道哪一步出错了,反正就是没有返回,停在那里,如果重启整个Manager,影响面又很大。



容器服务是网易云提供的无服务器容器服务,让企业能够快速部署业务,轻松运维服务。容器服务支持弹性伸缩、垂直扩容、灰度升级、服务发现、服务编排、错误恢复及性能监测等功能。点击可免费试用


免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击