10W+集群规模下,美团点评如何优化改造K8s?
国梁,美团点评基础研发平台集群调度中心高级工程师
正文共:7396 字 16 图
预计阅读时间: 19 分钟
背景
美团点评集群管理与调度系统
美团点评在集群管理和资源优化这条道路上已经“摸爬滚打”多年。2013年,开始构建基于传统虚拟化技术的资源交付方式;2015年7月,开始建立完善的集群管理与调度系统——HULK,目标是推动美团点评服务容器化;2016年,完成基于Docker容器技术自研实现了弹性伸缩能力,来提升交付速度和应对快速扩缩容的需求,实现弹性扩容、缩容,提升资源利用率,提升业务运维效率,合理有效的降低企业IT运维成本;2018年,开始基于Kubernetes来进行资源管理和调度,进一步提升资源的使用效率。
架构全览
架构介绍
Kubernetes管理与实践
集群运营现状
集群规模: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%以上。
预选失败中断机制
预选阶段:硬性条件,过滤掉不满足条件的节点,这个过程称为 Predicates。这是固定先后顺序的一系列过滤条件,任何一个 Predicate不符合则放弃该 Node。
优选阶段:软性条件,对通过的节点按照优先级排序,称之为 Priorities。每一个Priority都是一个影响因素,都有一定的权重。
选定阶段:从优选列表中选择优先级最高的节点,称为 Select。选择的Node即为最终部署Pod的机器。
为此,我们提出了“预选失败中断机制”,即一旦某个预选条件不满足,那么该 Node即被立即放弃,后面的预选条件不再做判断计算,从而大大减少了计算量,调度性能也大大提升。如下图所示:
局部最优解
Kubelet改造
风险可控性
可扩展性
跨Site同步:保证服务器总能从就近的镜像仓库拉取到扩容用的镜像,减少拉取时间,降低跨Site带宽消耗。
基础镜像预分发:美团点评的基础镜像是构建业务镜像的公共镜像。业务镜像层是业务的应用代码,通常比基础镜像小很多。在容器扩容的时候如果基础镜像已经在本地,就只需要拉取业务镜像的部分,可以明显的加快扩容速度。为达到这样的效果,我们会把基础镜像事先分发到所有的服务器上。
P2P镜像分发:基础镜像预分发在有些场景会导致上千个服务器同时从镜像仓库拉取镜像,对镜像仓库服务和带宽带来很大的压力。因此我们开发了镜像P2P分发的功能,服务器不仅能从镜像仓库中拉取镜像,还能从其他服务器上获取镜像的分片。
资源管理与优化
优化关键技术
服务画像:对应用的CPU、内存、网络、磁盘和网络 I/O 容量和负载画像,了解应用的特征、资源规格和应用类型以及不同时间对资源的真实使用,然后从服务角度和时间维度进行相关性分析,从而进行整体调度和部署优化。
亲和性和互斥性:哪些应用放在一起使整体计算能力比较少而吞吐能力比较高,它们就存在一定亲和性;反之如果应用之间存在资源竞争或相互影响,则它们之间就存在着互斥性。
场景优先:美团点评的业务大都是基本稳定的场景,所以场景划分很有必要。例如一类业务对延迟非常敏感,即使在高峰时刻也不允许有太多的资源竞争产生,这种场景就要避免和减少资源竞争引起的延迟,保证资源充足;一类业务在有些时间段需要的CPU资源可能会突破配置的上限,我们通过CPU Set化的方式让这类业务共享这部分资源,以便能够突破申请规格的机器资源限制,不仅服务能够获得更高的性能表现,同时也把空闲的资源利用了起来,资源使用率进一步提升。
弹性伸缩:应用部署做到流量预测、自动伸缩、基于规则的高低峰伸缩以及基于机器学习的伸缩机制。
精细化资源调配:基于资源共享和隔离技术做到了精细化的资源调度和分配,例如Numa绑定、任务优先级、CPU Set化等等。
策略优化
调度策略的主要作用在两方面,一方面是按照既定策略部署目标机器;二是能做到集群资源的排布最优。
亲和性:有调用关系和依赖的应用,或哪些应用放在一起能使整体计算能力比较少、吞吐能力比较高,这些应用间就存在一定亲和性。我们的CPU Set化即是利用了对CPU的偏好构建应用的亲和性约束,让不同CPU偏好的应用互补。
互斥性:跟亲和性相对,主要是对有竞争关系或业务干扰的应用在调度时尽量分开部署。
应用优先级:应用优先级的划分是为我们解决资源竞争提供了前提。当前当容器发生资源竞争时,我们无法决策究竟应该让谁获得资源,当有了应用优先级的概念后,我们可以做到,在调度层,限制单台宿主机上重要应用的个数,减少单机的资源竞争,也为单机底层解决资源竞争提供可能;在宿主机层,根据应用优先级分配资源,保证重要应用的资源充足,同时也可运行低优先级应用。
打散性:应用的打散主要是为了容灾,在这里分为不同级别的打散。我们提供了不同级别的打散粒度,包括宿主机、Tor、机房、Zone等等。
隔离与独占:这是一类特殊的应用,必须是独立使用一台宿主机或虚拟机隔离环境部署,例如搜索团队的业务。
特殊资源:特殊资源是满足某些业务对GPU、SSD、特殊网卡等特殊硬件需求。
在线集群优化
在线集群资源的优化问题,不像离线集群那样可以通过预知资源需求从而达到非常好的效果,由于未来需求的未知性,在线集群很难在资源排布上达到离线集群的效果。针对在线集群的问题,我们从上层调度到底层的资源使用都采取了一系列的优化。
Numa绑定:主要是解决业务侧反馈服务不稳定的问题,通过绑定Numa,将同一个应用的CPU和Memory绑定到最合适的Numa Node上,减少跨Node访问的开销,提升应用性能。
CPU Set化:将一组特性互补的应用绑定在同一组CPU上,从而让他们能充分使用CPU资源。
应用错峰:基于服务画像数据为应用错开高峰,减少资源竞争和相互干扰,提升业务SLA。
重调度:资源排布优化,用更少的资源提升业务性能和SLA;解决碎片问题,提升资源的分配率。
干扰分析:基于业务监控数据指标和容器信息判断哪些容器有异常,提升业务SLA,发现并处理异常应用。
结束语
当前,在以下几个方面我们正在积极探索:
在线-离线业务混合部署,进一步提升资源使用效率。
智能化调度,业务流量和资源使用感知调度,提升服务SLA。
高性能、强隔离和更安全的容器技术。
---------- END ----------
10W+集群规模下,美团点评如何优化改造K8s?相关推荐
- 万级K8s集群背后etcd稳定性及性能优化实践
作者:唐聪, 腾讯 CSIG 后台开发工程师 本文旨在帮助大家了解 etcd集群场景下稳定性与性能优化经验引的容量,避免给后面留坑. 背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云 ...
- 如何规划 ElasticSearch 集群规模和容量?
0.引言 实战中经常遇到的问题: 问题 1:请问下大家是如何评估集群的规模?比如数据量达到百万,千万,亿万,分别需要什么级别的集群,这要怎么评估? ps:自己搭建的测试环境很难达到这一级别. 问题 2 ...
- 【elasticsearch】 Elasticsearch集群规模和容量规划的底层逻辑
1.概述 转载:https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e41 ...
- 万台 HDFS 集群规模在快手的挑战与实践
作为快手内部数据规模和机器规模最大的分布式文件存储系统,HDFS一直伴随着快手业务的飞速发展而快速成长. HDFS架构介绍 HDFS 全名 Hadoop Distributed File System ...
- quartz在集群环境下的最终解决方案
在集群环境下,大家会碰到一直困扰的问题,即多个 APP 下如何用 quartz 协调处理自动化 JOB . 大家想象一下,现在有 A , B , C3 台机器同时作为集群服务器对外统一提供 SERVI ...
- 集群空间服务器接收不到消息,解决Redis集群条件下键空间通知服务器接收不到消息的问题...
解决Redis集群条件下键空间通知服务器接收不到消息的问题 键空间通知介绍 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 可以通过对redis的 ...
- 分布式集群环境下,如何实现session共享三(环境搭建)
这是分布式集群环境下,如何实现session共享系列的第三篇.在上一篇:分布式集群环境下,如何实现session共享二(项目开发)中,准备好了一个通过原生态的servlet操作session的案例.本 ...
- Java技术分享:集群环境下的定时任务
定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz框架等. Timer+TimerTask是 ...
- strom-1.1.0模拟单词统计功能,Spout编写,Bolt编写,TopologyDriver编写,本地模式运行,集群模式运行,集群模式下看输出结果
统计文本中的单词出现的频率,其中文本内容如下: 创建项目 项目结构如下: 创建pom.xml,代码如下: <?xml version="1.0" encoding=" ...
最新文章
- win8电源图标显示不出来
- 改变Fragment的默认动画
- Going to 的将来时态_47
- 在Android上可视化TensorFlow Lite AI结果
- 移动开发—Less基础与安装
- 系统学习数字图像处理之彩色图像处理
- 【工具】Sublime Text 自动保存功能
- 基于 Google 搜索的半自动推荐
- 套用这套模板,玩转周报、月报、年报更省事
- 单例模式-序列号生成器
- 哇嘎显示等待无服务器,vagaa搜索不到资源怎么回事?vagaa哇嘎搜索没反应的解决方法...
- [verilog] 八位比较器
- Linux系统中一些目录和文件的详细解释(参照RHEL5.4)
- 【值得读】自动机器学习: 最新进展综述与开放挑战 | AutoML
- centos如何在官网下载以前的版本
- 在DJI大疆做算法的日常工作与体验~
- java 工作流表单设计器 设计方案
- 一文读懂 MySQL Explain 执行计划
- 一些数学优化计算的工具
- matlab 使用 audiorecorder、recordblocking录制声音,play 播放声音,audiowrite 保存声音