基于万节点Kubernetes支撑大规模云应用实践
Posted 网易云基础服务
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于万节点Kubernetes支撑大规模云应用实践相关的知识,希望对你有一定的参考价值。
12月2日,ArchSummit全球架构师峰会在北京开幕,作为面向高端技术管理者、架构师的技术大会,本届峰会吸引了上千位技术管理者、CTO、架构师等的参与。
在云计算领域崭露头角的网易蜂巢受邀出席,蜂巢解决方案总架构师刘超就Kubernetes支撑大规模云应用的实践在大会上做了分享。
随着云计算的普及,越来越多的企业开始在云端部署自己的应用。如何对这些应用进行管理、调度、优化、自主运维等,以实现应用的快速部署、快速迭代和实时监控,已然成为云计算服务的一大难题。
网易蜂巢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查询的瓶颈以及修改建议,例如索引的设置问题,主键的设置问题等等。
刘超介绍称,传统的私有云只能实现资源层面的弹性,应用层面的弹性往往通过脚本实现。但由于很多互联网应用要求上线时间快,采取单体架构进行部署会丧失三个方面的灵活性。
○
时间灵活性:应用快速迭代,缩短客户需求到产品上线的时间。
○
空间灵活性:应用弹性伸缩,应对业务量突然增长后较短时间恢复。
○
管理灵活性:易部署,易迁移,服务发现,依赖管理,自动修复,负载均衡。
网易蜂巢作为容器云平台,相比于虚拟机实现了以资源为核心到以应用为核心的转变,用户可以通过对应用的改造,实现微服务化和DevOps。
第一板斧:去状态、可扩展。
原来的很多应用程序都是有状态的,所谓有状态,就是将很多数据保存在内存中和本地文件系统,这样的话,一旦容器宕机后被分发到其他机器上时,所有的状态就都不见了。通过将内存中的数据放在外部的缓存系统;将用户数据放在数据库中;将本地文件放在分布式存储系统中;通过状态的外置化将应用程序编程仅仅包含业务逻辑的实体,就可以进行横向的弹性扩展,支撑大规模访问了。对于外部的数据、缓存系统、数据库系统和存储系统,都有自身的高可用的机制,不需要应用层过多关心这方面的事情。
第二板斧:容器化、可编排。
有的人将容器化和微服务化划等号,其实不是的,不仅微服务可以容器化,一旦去状态了,就可以容器化。一旦容器化,就可以使用容器编排系统kubernetes进行容器的管理了。
第三板斧:DevOps、可迭代。
在开发和运维的过程中,往往涉及开发环境、测试环境、联调环境、生产环境,如果不同的环境都需要脚本进行维护,成本太大,不能满足敏捷开发的要求。容器镜像的不可改变性可以很好地解决这一点。在容器的镜像中,业务代码、程序库、系统依赖、文件目录结构等,都已经打包在里面了,无论从哪里启动起来,都是统一的环境,只需要通过环境变量和配置文件的形式将不同环境的差异注入即可。
更加优雅的是,结合上面说的编排系统,服务之间的依赖可以通过服务名写入配置文件,这样,不同的环境不需要修改配置文件就能够找到对应系统的服务。结合代码管理系统,通过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集群,解决了集群扩展性的问题。
刘超还表示,在这个“唯快不破”的互联网时代,网易蜂巢将助力企业实现微服务化。
在如图中的架构里面,用户仅仅需要关心自己应用的开发流程,实现微服务和DevOps。至于底层的IaaS层的计算、网络、存储;中间的PaaS的数据库、缓存、对象存储;上层的CaaS层的持续集成、镜像仓库、服务发现、服务编排、日志服务、APM等,以及对外的负载均衡和CDN服务,可以全部交给网易蜂巢平台来实现。
更重要的是,网易蜂巢遵循开放、标准、稳定的原则,所有层面全部使用开源的软件和开放的接口,使得服务本身易迁移、无绑定。
作为一家拥有19年经验的互联网公司,网易蜂巢在向客户输出稳定云服务的同时,还将输出完善的知识体系,帮助企业更好地运用好云服务,并创造更大的价值。
END
以上是关于基于万节点Kubernetes支撑大规模云应用实践的主要内容,如果未能解决你的问题,请参考以下文章
一年时间打造全球最大规模之一的Kubernetes集群,蚂蚁金服怎么做到的?
当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?