专栏名称: 数据猿
关注大数据行业的最前沿资讯,分享最有价值的大数据深度文章,关注“数据猿”就是关注大数据!
目录
相关文章推荐
数据派THU  ·  独家|人工智能值得信任吗(附链接) ·  4 天前  
大数据分析和人工智能  ·  10个超级实用的deepseek提示方式 ·  5 天前  
51好读  ›  专栏  ›  数据猿

美团点评Kubernetes集群管理实践

数据猿  · 公众号  · 大数据  · 2019-08-23 08:30

正文

来源:美团技术团队

数据猿官网 | www.datayuan.cn

今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区


作为国内领先的生活服务平台,美团点评很多业务都具有非常显著、规律的“高峰”和“低谷”特征。尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长。这对集群中心的资源弹性和可用性有非常高的要求,同时也会使系统在支撑业务流量时的复杂度和成本支出呈现指数级增长。而我们需要做的,就是利用有限的资源最大化地提升集群的吞吐能力,以保障用户体验。
本文将介绍美团点评Kubernetes集群管理与使用实践,包括美团点评集群管理与调度系统介绍、Kubernetes管理与实践、Kubernetes优化与改造以及资源管理与优化等。

美团点评集群管理与调度系统

美团点评在集群管理和资源优化这条道路上已经“摸爬滚打”多年。2013年,开始构建基于传统虚拟化技术的资源交付方式;2015年7月,开始建立完善的集群管理与调度系统——HULK,目标是推动美团点评服务容器化;2016年,完成基于Docker容器技术自研实现了弹性伸缩能力,来提升交付速度和应对快速扩缩容的需求,实现弹性扩容、缩容,提升资源利用率,提升业务运维效率,合理有效的降低企业IT运维成本;2018年,开始基于Kubernetes来进行资源管理和调度,进一步提升资源的使用效率。

最初,美团点评通过基于Docker容器技术自研实现了弹性伸缩能力,主要是为了解决基于虚拟化技术的管理及部署机制在应对服务快速扩容、缩容需求时存在的诸多不足。例如资源实例创建慢、无法统一运行环境、实例部署和交付流程长、资源回收效率低、弹性能力差等等。经过调研与测试,结合业界的实践经验,我们决定基于Docker容器技术自研集群管理与调度系统,有效应对快速扩缩容的需求,提升资源的利用效率。我们把它叫做“绿巨人”——HULK,这个阶段可以看作是HULK1.0。
之后,在生产环境中经过不断摸索和尝试,我们逐渐意识到,仅仅满足于集群的弹性伸缩能力是不够的,成本和效率肯定是未来必将面临且更为棘手的问题。我们吸取了2年来HULK 1.0的开发和运维经验,在架构和支撑系统层面做了进一步优化和改进,并借助于生态和开源的力量来为HULK赋能,即引入了开源的集群管理与调度系统Kubernetes,期望能进一步提升集群管理、运行的效率和稳定性,同时降低资源成本。所以我们从自研平台转向了开源的Kubernetes系统,并基于Kubernetes系统打造了更加智能化的集群管理与调度系统——HULK2.0。

架构全览

在架构层面,HULK2.0如何能与上层业务和底层Kubernetes平台更好地分层和解耦,是我们在设计之初就优先考虑的问题。我们期望它既要能对业务使用友好,又能最大限度地发挥Kubernetes的调度能力,使得业务层和使用方毋需关注资源关系细节,所求即所得;同时使发布、配置、计费、负载等逻辑层与底层的Kubernetes平台解耦分层,并保持兼容原生Kubernetes API来访问Kubernetes集群。从而可以借助于统一的、主流的、符合业界规范的标准,来解决美团点评基础架构面临的复杂、多样、不统一的管理需求。

架构介绍

自上而下来看,美团集群管理与调度平台面向全公司服务,有各个主要业务线、统一的OPS平台以及Portal平台,HULK不可能针对每个平台定制化接口和解决方案,所以需要将多样的业务和需求抽象收敛,最终统一通过HULK API来屏蔽HULK系统的细节,做到HULK与上层业务方的解耦。HULK API是对业务层和资源需求的抽象,是外界访问HULK的唯一途径。
解决了上层的问题后,我们再来看与下层Kubernetes平台的解耦。HULK接到上层资源请求后,首先要进行一系列的初始化工作,包括参数校验、资源余量、IP和Hostname的分配等等,之后向Kubernetes平台实际申请分配机器资源,最终将资源交付给用户,Kubernetes API进一步将资源需求收敛和转换,让我们可以借助于Kubernetes的资源管理优势。Kubernetes API旨在收敛HULK的资源管理逻辑并与业界主流对齐。此外,因为完全兼容Kubernetes API,可以让我们借助社区和生态的力量,共同建设和探索。
可以看到,HULK API和Kubernetes API将我们整个系统分为三层,这样可以让每一层都专注于各自的模块。

Kubernetes管理与实践

为什么会选择Kubernetes呢?Kubernetes并不是市面上唯一的集群管理平台(其他如Docker Swarm或Mesos),之所以选择它,除了它本身优秀的架构设计,我们更加看重的是Kubernetes提供的不是一个解决方案,而是一个平台和一种能力。这种能力能够让我们真正基于美团点评的实际情况来扩展,同时能够依赖和复用多年来的技术积累,给予我们更多选择的自由,包括我们可以快速地部署应用程序,而无须面对传统平台所具有的风险,动态地扩展应用程序以及更好的资源分配策略。
Kubernetes集群作为整个HULK集群资源管理与平台的基础,需求是稳定性和可扩展性,风险可控性和集群吞吐能力。

集群运营现状

  • 集群规模:10万+级别线上实例,多地域部署,还在不断快速增长中。

  • 业务的监控告警:集群对应用的启动和状态数据进行采集,container-init自动集成业务监控信息,业务程序毋需关注,做到可插拔、可配置。

  • 资源的健康告警:从资源的角度对 Node、Pod和 Container等重要数据监控采集,及时发现它们的状态信息,例如 Node不可用、Container不断重启等等。

  • 定时巡检与对账:每天自动对所有宿主机进行状态检查,包括剩余磁盘量(数据卷)、D进程数量、宿主机状态等,并对AppKey扩容数据和实际的Pod和容器数据同步校验,及时发现不一致情况。

  • 集群数据可视化:对当前集群状态,包括宿主机资源状态、服务数、Pod数、容器化率、服务状态、扩缩容数据等等可视化;并提供了界面化的服务配置、宿主机下线以及Pod迁移操作入口。

  • 容量规划与预测:提前感知集群资源状态,预先准备资源;基于规则和机器学习的方式感知流量和高峰,保证业务正常、稳定、高效地运行。

Kubernetes优化与改造

Kube-Scheduler性能优化

我们有集群在使用1.6版本的调度器,随着集群规模的不断增长,旧版本的Kubernetes调度器(1.10之前版本)在性能和稳定性的问题逐渐凸显,由于调度器的吞吐量低,导致业务扩容超时失败,在规模近3000台的集群上,一次Pod的调度耗时在5s左右。Kubernetes的调度器是队列化的调度器模型,一旦扩容高峰等待的Pod数量过多就会导致后面Pod的扩容超时。为此,我们对调度器性能进行了大幅度的优化,并取得了非常明显的提升,根据我们的实际生产环境验证,性能比优化前提升了400%以上。

Kubernetes调度器工作模型如下:

Kubernetes调度器,图片来源于网络

预选失败中断机制

一次调度过程在判断一个 Node是否可作为目标机器时,主要分为三个阶段:
  • 预选阶段:硬性条件,过滤掉不满足条件的节点,这个过程称为 Predicates。这是固定先后顺序的一系列过滤条件,任何一个 Predicate不符合则放弃该 Node。

  • 优选阶段:软性条件,对通过的节点按照优先级排序,称之为 Priorities。每一个Priority都是一个影响因素,都有一定的权重。

  • 选定阶段:从优选列表中选择优先级最高的节点,称为 Select。选择的Node即为最终部署Pod的机器。

通过深入分析调度过程可以发现,调度器在预选阶段即使已经知道当前 Node不符合某个过滤条件仍然会继续判断后续的过滤条件是否符合。试想如果有上万台 Node节点,这些判断逻辑会浪费很多计算时间,这也是调度器性能低下的一个重要因素。

为此,我们提出了“预选失败中断机制”,即一旦某个预选条件不满足,那么该 Node即被立即放弃,后面的预选条件不再做判断计算,从而大大减少了计算量,调度性能也大大提升。如下图所示:

我们把该项优化贡献给了 Kubernetes社区(详见PR文档),增加了 alwaysCheckAllPredicates 策略选项,并在 Kubernetes1.10版本发布并开始作为默认的调度策略,当然你也可以通过设置alwaysCheckAllPredicates=true使用原先的调度策略。
在实际测试中,调度器至少可以提升40%的性能,如果你目前在使用的Kube-Scheduler的版本低于1.10,那么建议你尝试升级到新的版本。

局部最优解

对于优化问题尤其是最优化问题,我们总希望找到全局最优的解或策略,但是当问题的复杂度过高,要考虑的因素和处理的信息量过多时,我们往往会倾向于接受局部最优解,因为局部最优解的质量不一定都是差的。尤其是当我们有确定的评判标准,同时标明得出的解是可以接受的话,通常会接收局部最优的结果。这样,从成本、效率等多方面考虑,才是我们在实际工程中真正会采取的策略。







请到「今天看啥」查看全文