我与容器的缘分起源于我在Google内部研发容器集群管理系: Cluster Management。谷歌内部一切皆容器,搜索、视频、大数据、内部工具等核心业务都以容器的方式运行在容器编排系统Borg上。2014年,随着公司内部的”Ursquake” (注:Urs是负责基础设施的高级副总裁),我转投到了公有云Google Cloud Platform的建设当中。2014年3月份,在由各部门基础设计技术带头人参加的谷歌内部的云峰会中,我做为早起参与者之一加入到了Kubernetes的项目中。 从2015年回国创业至今,我亲身感受到了国内对于Docker的追捧热度。如今,Docker已经迅速在国内形成了“要是不知道Docker都不好意思和人打招呼”的火热势态;在互联网巨头和独角兽企业中,甚有从“谁在用Docker”转变为“谁没用Docker”之势。 Caicloud基于Kubernetes开源技术,力争为企业提供Gifee(Google’s Infrastructure for Everyone Else)的体验。目前已经成功落地于多家国内大型企业,其中不乏传统国有企业。在不少案例中,我们都发现一个明显的趋势:很多企业一开始受到Docker现象的鼓吹,认为Docker是万灵药,然而在自己尝试进行开发、生产使用时才发现Docker带来的不仅仅是“坑”,更多的是局限和对已有流程的颠覆。这里我想从我在谷歌内部使用容器,并基于容器研发大规模生产平台的经验中谈谈现有Docker和谷歌容器环境的差别,并通过Caicloud的实际案例落地经验总结下Docker自身所带来的一些“谎言”和误区。希望能抛砖引玉,并在产品上填补空白,实现Gifee。 Docker的谎言这里用“谎言”略有夸大其词之嫌,Docker也确实为软件开发带来了巨大的好处。而我想表达的是人们对于Docker的一些常见预期在现实使用中并非像理论中那般完美。 Docker达到了环境一致性 几乎所有的Docker介绍或教程中提到的前几个Docker带来的好处之一,必有“环境一致性”。然而这句话表述的并不准确,“环境”是一个模糊和相对的概念。Docker实现的是镜像内部的小环境一致性,它保证了一个应用程序在一台机器上使用Jetty 9, 在另一台机器上也使用Jetty 9(通过封装软件中间件如Jetty 9)。然而大中型企业用户很快意识到,真正的难点在于如何保证“大环境”一致,既整个业务系统中众多容器、组件、服务之间如何配置、互联、依赖,如何保证开发、测试、生产环境能相互转化、克隆等。这些环境、配置在容器概念之上,是容器自身无法解决的,只能依赖集群层面的管理工具。 Docker帮助了微服务 微服务与Docker是两个完全独立的维度,微服务所带来的好处完全不依赖于你是否使用Docker,同时微服务所带来的问题Docker也无法解决。例如,如今大家都流行将原来的巨石型应用进行微服务细粒度切分,而第一个难点就是切分的粒度。虽然不乏最佳实践和Rule of Thumb, 但总的逻辑是切分的粒度越细,软件开发灵敏度越高。然而带来的问题是管理成本的增加:更多的模块如何进行各自的配置,更多的API通信、互联如何管理,更多的二进制(容器)如何发布。这些问题都是Docker自身不能解决的,也必须通过第三方工具来进行弥补(例如Kubernetes的Pod机制就是谷歌基于内部的经验教训设计的一个解决方案)。 Docker实现了以应用为中心 Docker的大火也让”App Centric”, “Cloud Native”焕发了青春,Docker确实在为实现这两者的道路上提供了便利,但Docker本身还远远不能和这两个词划等号。Docker对应用虽然进行了封装,但是应用的开发者在实践中还远无法做到只要关心到Docker这一层即可。首先我们还是要关注操作系统,是否有合适的内核,是否有合适的API支持。其实我们甚至要关心硬件,是否是x86架构还是power pc架构。此外,我们还需要关心引擎,是Docker还是Rocket还是runC。最后,开发、运维者还要关心平台,是Kubernetes还是Mesos来进行生产集群管理,并需要针对具体的底层平台做完全针对该平台的部署、配置(甚至需要修改应用、框架等)。而这些都不是应用、业务所应该关心的范畴。 Docker实现了Devops Docker有很多开发、发布敏捷性方面的亮点,然而不少企业用户认为Docker自身就迈向了Devops,而残酷的现实是他们往往在真正开始使用后很快发现Docker带来了额外的负担,例如基于Docker的发布流程应该是怎么样,应用程序打包的最佳实践应如何(如何避免打出一个上G的包),Docker的镜像仓库该如何管理(如何有效利用存储空间、识别Dockerhub里的恶意镜像)。总之,Docker毕竟给系统中引入了新的一层东西,业务出了问题,到底是应用的问题还是Docker的问题?最后(among many others),Docker自身主要是进程级别的,而对于复合型、集群化的场景(翻译:任何一个认真的生产场景)则需要第三方的工具和系统来补足。在机器层面,如何做到跨主机的通信、数据的迁移、跨主机的任务调度;在应用层面,如何做到用多个Docker镜像/容器构造成一个复合性应用(Codis就是一个很好的例子)。当然,Docker的安全性也是经久不衰、流行的议题。 集群工具和Kubernetes的迅猛生产落地还是要说明上述的论点旨在让企业用户认识到Docker自身不是万灵药,但是我们也不可否认Docker对于软件开发、发布和计算上所带来的变革性优势。如何基于Docker自身的优势更上一层楼,我认为需要顺应“社会专业化分工”,让专业的人做专业的事,通过第三方工具一起打造一个完善的生态系统。 谷歌在十年间打造了三个集群管理系统:Borg、Omega、Kubernetes,原因就是基于它领先于外界多年的容器使用经验,它清楚地意识到容器自身的局限性(只是应用运行的一个“载体”,和其他的载体诸入虚拟机、物理机在这个角度上甚至没有本质区别)。在虽有Mesos这一开源项目的情况下,谷歌还是在2014年决定大力推广Kubernetes项目(内部代号为 “Project 7”),是出于几点深思熟虑。这些出发点也在国外众多知名企业(如eBay等互联网巨头,或高盛、 Bloomberg等金融巨头)和Caicloud在国内一些大型甚至传统国有企业的成功落地中得到了验证):
现在的空白和未来的趋势无论是Docker还是开源第三方集群管理工具,如要到达Gifee都还有很长的路要走。这里我仅仅抛砖引玉列举一些空白和我们希望和正在努力的方向。 发布管理远大于CI/CD 如今谈到发布,大家想到的就是持续集成(CI)和持续发布(CD)。然而我们在谷歌内部实践的发布管理系统还包括很多其他的方方面面,例如:
Devops远大于Docker Devops包含方方面面,其中诸多实践都是Docker自身层面所不能企及的,以谷歌为例:
集群管理远大于服务管理 最后想澄清的一个名词是”集群管理“。现在当人们谈及“集群管理”时,容易直接和Kubernetes,Mesos等划等号。然而集群管理在谷歌内部是一个非常庞大的组织,Borg只能算作任务管理或应用管理,除此之外一个真正的集群管理系统还需要诸如机器管理、网络管理、安全管理等诸多方面:
|