网易蜂巢刘超:基于万节点Kubernetes支撑大规模云应用实践

12月2日,ArchSummit全球架构师峰会在北京开幕,作为面向高端技术管理者、架构师的技术大会,本届峰会吸引了上千位技术管理者、CTO、架构师等。其中在云计算领域崭露头角的网易蜂巢受邀出席,网易蜂巢解决方案总架构师刘超就Kubernetes支撑大规模云应用的实践进行了分享。

图片6.png

随着云计算的普及,越来越多的企业开始在云端部署自己的应用,如何对这些应用进行管理、调度、优化、自主运维等,以实现应用的快速部署、快速迭代和实时监控,已然成为云计算服务的一大难题。

图片7.png

网易蜂巢从2012年正式上线私有云平台,到2014年,95%的互联网应用全部放到云平台上,到2015年网易蜂巢容器云平台正式对外开放,再到2016年上线DevOps和微服务。

作为网易云的基础设施云服务,网易蜂巢一直走在行业前列,并形成了新一代云计算的雏形,实现了从虚拟机到容器,从传统应用到微服务化,从传统研发流程到DevOps,从私有云走向公有云的四个方面的转变。

网易蜂巢已经从最初千级别节点数成长为万级别节点数集群,并支撑了拥有亿级用户的网易考拉海购和网易云音乐。在双十一等访问峰值来临的时候,网易蜂巢系统的弹性伸缩能力以及应用层的微服务化能力表现卓越。

据刘超介绍,网易蜂巢的技术优化可以追溯到IaaS层、PaaS层和CaaS层。

网易蜂巢基于OpenStack自主研发了IaaS服务,在计算虚拟化方面,通过裁剪KVM镜像,优化虚拟机启动流程等改进,实现了虚拟机的秒级别启动。在网络虚拟化方面,通过SDN和Openvswitch技术,实现了虚拟机之间的高性能互访。在存储虚拟化方面,通过优化Ceph存储,实现高性能云盘。

在PaaS层,网易可以说更加的功力深厚,在数据库,缓存,对象存储方面都有非常多的优化。比如说数据库RDS服务,网易是兼容开源的mysql数据库的所有接口的,然而开源的mysql会出现性能不高,主备切换数据丢失等现象,这对于很多关键应用来讲,是不能忍受的。网易是业内为数不多的具备mysql内核开发能力的公司之一,通过优化主备同步技术,可以实现主备切换数据零丢失,为了优化mysql性能,网易还优化了mysql并行复制技术和group commit技术,实现了可靠性和性能的兼顾平衡。当然数据库的性能除了数据库本身,SQL语句的撰写也是十分重要的,直接影响着SQL查询的性能和并发量,这虽然是应用层的事情,但是蜂巢根据自己多年的数据库运维经验,开发了SQL优化工具,用户只要将SQL语句输入这个优化工具,就可以发现SQL查询的瓶颈以及修改建议,例如索引的设置问题,主键的设置问题等等。

不过刘超表示,传统的私有云只能实现资源层面的弹性,应用层面的弹性往往通过脚本实现,而且很多互联网应用由于要求上线时间快,多采取单体架构进行部署,从而丧失了三个方面的灵活性。

图片8.png

l 时间灵活性:应用快速迭代,缩短客户需求到产品上线的时间

l 空间灵活性:应用弹性伸缩,应对业务量突然增长后较短时间恢复

l 管理灵活性:易部署,易迁移,服务发现,依赖管理,自动修复,负载均衡

网易蜂巢作为容器云平台,相比于虚拟机实现了以资源为核心到以应用为核心的转变,用户可以通过对于应用的改造,实现微服务化和DevOps.

第一板斧:去状态、可扩展。

图片9.png

原来的很多应用程序都是有状态的,所谓有状态,就是将很多数据保存在内存中和本地文件系统,这样的话,一旦容器宕机后被分发到其他机器上的时候,所有的状态就都不见了。通过将内存中的数据放在外部的缓存系统,将用户数据放在数据库中,将本地文件放在分布式存储系统中,通过状态的外置化,将应用程序编程仅仅包含业务逻辑的实体,就可以进行横向的弹性扩展,支撑大规模访问了。对于外部的数据,缓存系统,数据库系统,和存储系统,都有自身的高可用的机制,不需要应用层过多关心这方面的事情。

第二板斧:容器化、可编排。

有的人将容器化和微服务化划等号,其实不是的,不仅仅微服务可以容器化,一旦去状态了,就可以容器化。一旦容器化,就可以使用容器编排系统kubernetes进行容器的管理了。

图片10.png

例如一个应用包含四个服务A,B,C,D,她们相互引用,相互依赖。如果使用了kubernetes,则服务之间的服务发现就可以通过服务名进行了,例如A服务调用B服务,不需要知道B服务的IP地址,只需要在配置文件里面写入B服务服务名就可以了。如果中间的节点宕机了,kubernetes会自动将上面的服务在另外的机器上启动起来,容器启动之后,容器的IP地址就变了,但是不用担心,kubernetes会自动将服务名B和新的IP地址映射好,A服务并无感知。这个过程叫做自修复和自发现。如果服务B遭遇了性能瓶颈,三个B服务才能支撑一个A服务,也不需要特殊配置,只需要将服务B的数量设置为3,A还是只需要访问服务B,kubernetes会自动选择其中一个进行访问,这个过程称为弹性扩展和负载均衡。

第三板斧:DevOps、可迭代。

图片11.png

在开发和运维的过程中,往往涉及开发环境,测试环境,联调环境,生产环境。如果不同的环境都需要脚本进行维护,成本太大,不能满足敏捷开发的要求。容器镜像的不可改变性可以很好的解决这一点。

在容器的镜像中,业务代码,程序库,系统依赖,文件目录结构等,都已经打包在里面了,无论从哪里启动起来,都是统一的环境,只需要通过环境变量和配置文件的形式将不同环境的差异注入即可。而且更加优雅的是,结合上面说的编排系统,服务之间的依赖可以通过服务名写入配置文件,这样不同的环境不需要修改配置文件就能够找到对应系统的服务。结合代码管理系统,通过web hook的方式,用户提交代码,马上触发web hook,调用到网易蜂巢的API,则网易蜂巢会在一分钟内构建新的镜像并更新应用,接下来可以进行自动化测试,如果测试通过,则运维人员就可以一键更新线上生产环境了。

对于尚不能一步实现微服务化和DevOps的用户,网易蜂巢还提供了有状态容器的方式,通过挂在远程云盘保存状态数据的方式,使得用户方便从虚拟机模式向容器模式进行过度。

在CaaS层面,为了支撑大规模云应用,除了应用层面的改造,容器的网络和存储性能也是非常重要的。在网络方面,很多容器的使用者使用默认的port mapping的方式进行网络互联,这样对于应用的浸入性太大。也有使用开源的如Docker Network, Flannel, Calico, Weave, OVS等方案,存在二次虚拟化的问题,虚拟机的网络互联是一次虚拟化,为了实现容器跨虚拟机互联,则需要进行二次虚拟化,大大降低性能。网易蜂巢基于SDN,将IaaS层的网络互联能力直接应用与容器,通过一次虚拟化就能够实现容器的扁平化二层互联。在存储方面,如果使用容器的统一存储策略,例如基于云盘搭建Ceph集群,也存在二次虚拟化的问题,云盘本身是一次虚拟化,将云盘作为普通的存储,在其上搭建Ceph集群,则为二次虚拟化,大大降低性能,网易蜂巢基于Ceph,将云盘直接挂在到容器里面,实现一次虚拟化。

服务微服务化之后,容器数量会比较多,如果查找问题需要对于每个容器的日志进行查看,会比较难定位问题,网易蜂巢平台提供统一的日志收集,分析,搜索服务,用户可以通过关键字进行搜索,将某个订单号在各个应用中的日志全部查询出来,则问题就一目了然了。

除了问题的定位,性能瓶颈的定位也是一个挑战,网易蜂巢引入服务端 APM 解决细粒度性能分析,通过不同应用之间的调用链,迅速发掘性能瓶颈。

当容器规模扩大到一定程度,kubernetes的调度就成为了瓶颈,开源的kubernetes是通过串行队列Pod queue进行任务调度的,当任务规模比较大,但队列不能满足要求,网易蜂巢优化为多个优先级队列,极大提高了任务的调度速度和容器的修复速度。另外由于kubernetes的数据是保存在etcd里面,当容器规模扩大的时候,单个etcd集群已经不能满足读写性能,通过根据Pod/Node/Replication Controller等资源到拆分不同etcd集群,解决了集群扩展性的问题。

图片12.png

同时刘超表示,在这个“唯快不破”的互联网时代,网易蜂巢将助力企业实现微服务化。

图片13.png

在如图中的架构里面,用户仅仅需要关心自己的应用的开发流程,实现微服务和DevOps,至于底层的IaaS层的计算,网络,存储,中间的PaaS的数据库,缓存,对象存储,上层的CaaS层的持续集成、镜像仓库、服务发现、服务编排、日志服务、APM等,以及对外的负载均衡和CDN服务,可以全部交给网易蜂巢平台来实现。

更重要的是,网易蜂巢遵循开放、标准、稳定的原则,所有的层面全部使用开源的软件和开放的接口,使得服务本身易迁移、无绑定。

图片14.png

作为一家拥有19年经验的互联网公司,网易在向客户输出稳定云服务的同时,还将输出完善的知识体系,帮助企业更好的运用好云服务,并创造更大的价值。