首页>博客正文
基于万节点Kubernetes支撑大规模云应用实践
2017-07-21 09:56:53

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

 

基于万节点1

 

 

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

 

基于万节点2

 

 

网易云基础服务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查询的瓶颈以及修改建议,例如索引的设置问题,主键的设置问题等等。

 

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

 

基于万节点3

 

 

○时间灵活性:应用快速迭代,缩短客户需求到产品上线的时间。
○空间灵活性:应用弹性伸缩,应对业务量突然增长后较短时间恢复。
○管理灵活性:易部署,易迁移,服务发现,依赖管理,自动修复,负载均衡。

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

 

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

 

 

基于万节点4

 

 

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

 

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

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

 

 

基于万节点5

 

 

例如一个应用包含四个服务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、可迭代。

 

 

基于万节点6

 

 

在开发和运维的过程中,往往涉及开发环境、测试环境、联调环境、生产环境,如果不同的环境都需要脚本进行维护,成本太大,不能满足敏捷开发的要求。容器镜像的不可改变性可以很好地解决这一点。在容器的镜像中,业务代码、程序库、系统依赖、文件目录结构等,都已经打包在里面了,无论从哪里启动起来,都是统一的环境,只需要通过环境变量和配置文件的形式将不同环境的差异注入即可。

 

更加优雅的是,结合上面说的编排系统,服务之间的依赖可以通过服务名写入配置文件,这样,不同的环境不需要修改配置文件就能够找到对应系统的服务。结合代码管理系统,通过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集群,解决了集群扩展性的问题。

 

 

基于万节点7

 

 

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

 

 

基于万节点8

 

 

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

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

 

 

基于万节点9

 

 

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

分享到:

评论(1)
评论文章前您需要先登录
发表评论
182****3898 1 楼
8月 25日 下午2:31


热门标签
热门推荐