美团集群调度系统HULK技术演进

本文根据美团基础架构部/弹性策略团队负责人涂扬在2019 QCon(全球软件开发大会)上的演讲内容整理而成。本文涉及Kubernetes集群管理技术,美团相关的技术实践可参考此前发布的《美团点评Kubernetes集群管理实践》。

一、背景

HULK是美团的容器集群管理平台。在HULK之前,美团的在线服务大部分部署都是在VM上,在此期间,我们遇到了很大的挑战,主要包括以下两点:

  • 环境配置信息不一致:部分业务线下验证正常,但线上验证却不正常。
  • 业务扩容流程长:从申请机器、资源审核到服务部署,需要5分钟才能完成。

因为美团很多业务都具有明显的高低峰特性,大家一般会根据最高峰的流量情况来部署机器资源,然而在业务低峰期的时候,往往用不了那么多的资源。在这种背景下,我们希望打造一个容器集群管理平台来解决上述的痛点问题,于是HULK项目就应运而生了。

HULK平台包含容器以及弹性调度系统,容器可以统一运行环境、提升交付效率,而弹性调度可以提升业务的资源利用率。在漫威里有个叫HULK的英雄,在情绪激动的时候会变成“绿巨人”,情绪平稳后则恢复人身,这一点跟我们容器的”弹性伸缩“特性比较相像,所以我们的系统就取名为”HULK“。

总的来讲,美团HULK的演进可以分为1.0和2.0两个阶段,如下图所示:

在早期,HULK 1.0是基于OpenStack演进的一个集群调度系统版本。这个阶段工作的重点是将容器和美团的基础设施进行融合,比如打通CMDB系统、公司内部的服务治理平台、发布平台以及监控平台等等,并验证容器在生产环境的可行性。2018年,基础架构部将底层的OpenStack升级为容器编排标准Kubernetes,然后我们把这个版本称之为HULK 2.0,新版本还针对在1.0运营过程中遇到的一些问题,对系统专门进行了优化和打磨,主要包括以下几个方面:

  • 进一步打磨了弹性策略和调度系统。
  • 构建了一站式容器运营平台。
  • 对基础系统软件进行加强,自研内核,提升安全隔离能力。

截止发稿时,美团生产环境超过1万个应用在使用容器,容器数过10万。

二、HULK2.0集群调度系统总体架构图

上图中,最上层是集群调度系统对接的各个平台,包括服务治理、发布平台、测试部署平台、CMDB系统、监控平台等,我们将这些系统打通,业务就可以无感知地从VM迁移到容器中。其中:

  • 容器弹性:可以让接入的业务按需使用容器实例。
  • 服务画像:负责应用运行情况的搜集和统计,如CPU/IO使用、服务高峰期、上下游等信息,为弹性伸缩、调度系统提供支持。
  • 容器编排和镜像管理:负责对实例进行调度与应用实例构建。

最底层的HULK Agent是我们在每个Node上的代理程序。此前,在美团技术团队官方博客上,我们也分享过底层的镜像管理和容器运行时相关内容,参见《美团容器技术研发实践》一文。而本文将重点阐述容器编排(调度系统)和容器弹性(弹性伸缩平台),以及团队遇到的一些问题以及对应的解决方案,希望对大家能有所启发。

三、调度系统痛点、解法

3.1 业务扩缩容异常

痛点:集群运维人员排查成本较高。

为了解决这个问题,我们可以先看一下调度系统的简化版架构,如下图所示:

可以看到,一次扩缩容请求基本上会经历以下这些流程:

a. 用户或者上层系统发起扩缩容请求。 b. 扩缩容组件从策略配置中心获取对应服务的配置信息。 c. 将对应的配置信息提交到美团自研的一个API服务(扩展的K8s组件),然后K8s各Master组件就按照原生的工作流程开始Work。 d. 当某个实例调度到具体的Node上的时候,开始通过IP分配服务获取对应的Hostname和IP。 e. Container-init是一号进程,在容器内部拉起各个Agent,然后启动应用程序。针对已经标准化接入的应用,会自动进行服务注册,从而承载流量。

而这些模块是由美团内部的不同同学分别进行维护,每次遇到问题时,就需要多个同学分别核对日志信息。可想而知,这种排查问题的方式的成本会有多高。

解法:类似于分布式调用链中的traceId,每次扩缩容会生成一个TaskId,我们在关键链路上进行打点的同时带上TaskId,并按照约定的格式统一接入到美团点评日志中心,然后在可视化平台HULK Portal进行展示。

落地效果

  • 问题排查提效:之前排查类似问题,多人累计耗时平均需要半个小时。目前,1个管理员通过可视化的界面即可达到分钟级定位到问题。
  • 系统瓶颈可视化:全链路上每个时段的平均耗时信息一览无遗。

3.2 业务定制化需求

痛点:每次业务的特殊配置都可能变更核心链路代码,导致整体系统的灵活性不够。

具体业务场景如下:

  • 业务希望能够去设置一些系统参数,比如开启swap,设置memlock、ulimit等。
  • 环境变量配置,比如应用名、ZooKeeper地址等。

解法:建设一体化的调度策略配置中心,通过调度策略配置中心,可定制化调度规则。

  • 实例基本配置,比如业务想给机器加Set化、泳道标识。
  • 实例的扩展配置:如部分业务,比如某些服务想将实例部署在包含特定硬件的宿主机,会对核心业务有N+1的容灾需求,并且还需要将实例部署在不同的IDC上。
  • 相同配置的应用可以创建一个组,将应用和组进行关联。

在策略配置中心,我们会将这些策略进行Manifest组装,然后转换成Kubernetes可识别的YAML文件。

落地效果:实现了平台自动化配置,运维人员得到解放。

3.3 调度策略优化

接下来,介绍一下Kubernetes调度器Scheduler的默认行为:它启动之后,会一直监听ApiServer,通过ApiServer去查看未Bind的Pod列表,然后根据特定的算法和策略选出一个合适的Node,并进行Bind操作。具体的调度策略分为两个阶段:Predicates预选阶段和Priorities打分阶段。

Predicates 预选阶段(一堆的预选条件):PodFitsResources检查是否有足够的资源(比如CPU、内存)来满足一个Pod的运行需求,如果不满足,就直接过滤掉这个Node。

Priorities 打分阶段(一堆的优先级函数):

  • LeastRequested:CPU和内存具有相同的权重,资源空闲比越高的节点得分越高。
  • BalancedResourcesAllocation:CPU和内存使用率越接近的节点得分越高。

将以上优先级函数算出来的值加权平均算出来一个得分(0-10),分数越高,节点越优。

痛点一:当集群达到3000台规模的时候,一次Pod调度耗时5s左右(K8s 1.6版本)。如果在预选阶段,当前Node不符合过滤条件,依然会判断后续的过滤条件是否符合。假设有上万台Node节点,这种判断逻辑便会浪费较多时间,造成调度器的性能下降。

解法:当前Node中,如果遇到一个预选条件不满足(比较像是短路径原则),就将这个Node过滤掉,大大减少了计算量,调度性能也得到大幅提升。

成效:生产环境验证,提升了40%的性能。这个方案目前已经成为社区1.10版本默认的调度策略,技术细节可以参考GitHub上的PR。

痛点二:资源利用率最大化和服务SLA保障之间的权衡。

解法:我们基于服务的行为数据构建了服务画像系统,下图是我们针对某个应用进行服务画像后的树图展现。

调度前:可以将有调用关系的Pod设置亲和性,竞争相同资源的Pod设置反亲和性,相同宿主机上最多包含N个核心应用。 调度后:经过上述规则调度后,在宿主机上如果依然出现了资源竞争,优先保障高优先级应用的SLA。

3.4 重编排问题

痛点

(1)容器重启/迁移场景:

  • 容器和系统盘的信息丢失。
  • 容器的IP变更。

(2)驱逐场景:Kubelet会自动杀死一些违例容器,但有可能是非常核心的业务。

解法

(1)容器重启/迁移场景:

  • 新增Reuse策略,保留原生重启策略(Rebuild)。
  • 定制化CNI插件,基于Pod标识申请和复用IP。

(2)关闭原生的驱逐策略,通过外部组件来做决策。

四、弹性伸缩平台痛点、解法

弹性伸缩平台整体架构图如下:

注:Raptor是美团点评内部的大监控平台,整合了CAT、Falcon等监控产品。

在弹性伸缩平台演进的过程中,我们主要遇到了以下5个问题。

4.1 多策略决策不一致

如上图所示,一个业务配置了2条监控策略和1条周期策略:

  • 监控策略:当某个指标(比如QPS、CPU)超过阈值上限后开始扩容,低于阈值下限后开始缩容。
  • 周期策略:在某个固定的时间开始扩容,另外一个固定的时间开始缩容。

早期的设计是各条策略独自决策,扩容顺序有可能是:缩5台、缩2台、扩10台,也有可能是:扩10台、缩5台、缩2台,就可能造成一些无效的扩缩行为。

解法:增加了一个聚合层(或者把它称之为策略协商层),提供一些聚合策略:默认策略(多扩少缩)和权重策略(权重高的来决策扩缩行为),减少了大量的无效扩缩现象。

4.2 扩缩不幂等

如上图所示,聚合层发起具体扩缩容的时候,因之前采用的是增量扩容方式,在一些场景下会出现频繁扩缩现象。比如,原先12台,这个时候弹性伸缩平台告诉调度系统要扩容8台,在返回TaskId的过程中超时或保存TaskId失败了,这个时候弹性伸缩平台会继续发起扩容8台的操作,最后导致服务下有28台实例(不幂等)。

解法:采用按目标扩容方式,直接告诉对端,希望能扩容到20台,避免了短时间内的频繁扩缩容现象。

4.3 线上代码多版本

如上图所示,一个业务线上有30台机器,存在3个版本(A、B、C)。之前我们弹性扩容的做法是采用业务构建的最新镜像进行扩容,但在实际生产环境运行过程中却遇到问题。比如一些业务构建的最新镜像是用来做小流量测试的,本身的稳定性没有保障,高峰期扩容的时候会提升这个版本在线上机器中的比例,低峰期的时候又把之前稳定版本给缩容了,经过一段时间的频繁扩缩之后,最后线上遗留的实例可能都存在问题。

解法:基于约定优于配置原则,我们采用业务的稳定镜像(采用灰度发布流程将线上所有实例均覆盖过一遍的镜像,会自动标记为稳定镜像)进行扩容,这样就比较好地解决了这个问题。

4.4 资源保障问题

如上图所示,存量中有2个服务,一个需要扩容20台,一个需要扩容15台,这个时候如果新接入一个服务,同一时间需要扩容30台,但是资源池只剩余50台实例了。这个时候就意味着,谁先扩容谁就可以获得资源保障,后发起的请求就无法获得资源保障。

解法

(1)存量资源水位检测:当存量资源的使用水位超过阈值的时候,比如达到80%的时候会有报警,告诉我们需要做资源补充操作。 (2)增量服务弹性资源预估:如果这个服务通过预判算法评估,接入之后可能会导致存量服务的扩容得不到保障,则拒绝或者补充资源后,再让这个业务接入。

4.5 端到端时效问题

如图所示,我们的分钟级监控时延(比如1:00:00~1:01:00的监控数据,大概需要到1:01:10后可将采集到的所有数据聚合完成)是70s+,调度链路时延是30s+,整体需要上100s+,在生产环境的业务往往会比较关注扩容时延。

解法:监控系统这块已经建设秒级监控功能。基于这些做法都属于后验性扩容,存在一定的延迟性,目前我们也在探索基于历史行为数据进行服务预测,在监控指标达到扩容阈值前的1~2分钟进行提前扩容。

五、经验总结

技术侧

  • 开源产品“本土化”: 原生的Kubernetes需要和内部已有的基础设施,如服务树、发布系统、服务治理平台、监控系统等做融合,才能更容易在公司内进行落地。
  • 调度决策:增量的调度均使用新策略来进行规范化,存量的可采用重调度器进行治理。
  • 弹性伸缩:公有云在弹性伸缩这块是没有SLA保障的,但是做内部私有云,就需要做好扩容成功率、端到端时延这两块的SLA保障。

业务侧

  • 业务迁移:建设了全自动化迁移平台,帮助业务从VM自动迁移到容器,极大地降低了因迁移而带来的人力投入。
  • 业务成本:使用HULK可较好地提升业务运维效率(HULK具备资源利用率更高、弹性扩容、一键扩容等特点),降低了业务成本。

作者简介

涂扬,美团点评技术专家,现任基础架构部弹性策略团队负责人。

招聘信息

美团点评基础架构团队诚招高级、资深技术专家,Base北京、上海。我们致力于建设美团点评全公司统一的高并发高性能分布式基础架构平台,涵盖数据库、分布式监控、服务治理、高性能通信、消息中间件、基础存储、容器化、集群调度等基础架构主要的技术领域。欢迎有兴趣的同学投送简历到 tech@meituan.com(邮件标题注明:基础架构部弹性策略团队)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1079. 活字印刷(全排列回溯)

文章目录1. 题目2. 解题类似题目 78 子集、 90 子集 II1. 题目 你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。 示例 1:输入:"AAB" 输出:8 解释:…

EdgeBERT:极限压缩,比ALBERT再轻13倍!树莓派上跑BERT的日子要来了?

文 | Sheryc_王苏本文首发于NLP宝藏公号【夕小瑶的卖萌屋】,疯狂暗示!这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的GPT-3;而另一种恰恰相反,…

论文浅尝 | 用于开放领域的问题生成

作者 | 黄焱晖单位 | 东南大学硕士研究方向 | 自然语言处理,知识图谱Learning to AskQuestions in Open-domain Conversational Systems with Typed Decoders动机本文的问题生成用于开放领域的问题生成,与传统的问题生成不同的是,在开放领域对…

Android官方开发文档Training系列课程中文版:构建第一款安卓应用之创建用户界面

原文地址:http://android.xsoftlab.net/training/basics/firstapp/building-ui.html 在这节课中,你会创建一个xml的布局文件,它包含一个Text成员和一个Button成员。在下节课中,你会学习到当Button按下后启动并发送Text成员的内容…

字节码增强技术探索

1.字节码 1.1 什么是字节码? Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM…

LeetCode 1137. 第 N 个泰波那契数

文章目录1. 题目2. 解题1. 题目 泰波那契序列 Tn 定义如下: T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n,请返回第 n 个泰波那契数 Tn 的值。 示例 1:输入:n 4 输出:4 解释&#…

Calibration: 一个工业价值极大,学术界却鲜有研究的问题!

文 | kid丶(知乎作者)编 | 夕小瑶尽管深度学习给工业界带来了一波上线春天,但是总有很多比较难的业务,模型反复迭代后准确率依然达不到预期的产品标准,难以满足用户期望。以下为工业界常见讨(si)论(b&#…

肖仰华 | 大规模、高质量的金融知识图谱,如何自动化构建?

本文转载自公众号:恒生技术之眼。◆本文根据2019恒生技术开放日肖仰华教授演讲整理◆肖仰华:复旦大学教授、博士生导师,复旦大学知识工场实验室创始人。知识图谱(Knowledge Graph, KG)本质上是一种大规模语义网络&…

Android官方开发文档Training系列课程中文版:构建第一款安卓应用之启动另一个Activity

原文地址:http://android.xsoftlab.net/training/basics/firstapp/starting-activity.html#CreateActivity 在完成了上一节课之后,你有了一个带有输入框和按钮的单屏幕Activity。在这节课中,你将会在MyActivity中添加一些代码,以…

美团点评Kubernetes集群管理实践

背景 作为国内领先的生活服务平台,美团点评很多业务都具有非常显著、规律的”高峰“和”低谷“特征。尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长。这对集群中心的资源弹性和可用性有非常高的要求,同时也会使系统在支撑业务…

论文浅尝 | 基于知识图谱 Embedding 的问答

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识图谱问答。来源:WSDM 2019链接:https://dl.acm.org/citation.cfm?doid3289600.3290956目前知识图谱问答(本文简写为QA-KG,question answeri…

NeurIPS 2020 | 没有乘法的神经网络,照样起飞?

文:苏剑林编:兔子酱单位:追一科技今天给大家介绍一篇1962年的论文《Computer Multiplication and Division Using Binary Logarithms》[1],作者是John N. Mitchell,他在里边提出了一个相当有意思的算法:在二…

LeetCode 1160. 拼写单词

文章目录1. 题目2. 解题1. 题目 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串&…

MTFlexbox自动化埋点探索

1. 背景 跨平台动态化技术是目前移动互联网领域的重点关注方向,它既能节约人力,又能实现业务快速上线的需求。经过十年的发展,美团App已经变成了一个承载众多业务的超级平台,众多的业务方对业务形态的快速迭代和更新提出了越来越高…

Android官方开发文档Training系列课程中文版:添加ActionBar之设置ActionBar

导言- 添加ActionBar 原文地址:http://android.xsoftlab.net/training/basics/actionbar/index.html ActionBar是很多重要的特性之一,你可以用它实现用户的自定义行为。它提供了若干的用户界面特性,以便你的应用可以很快的提供与其它应用很…

论文浅尝 | 具有图卷积网络和顺序注意力机制的应用于目标导向的对话系统

论文笔记整理:吴涵,天津大学硕士,研究方向:自然语言处理。来源:2019 Association for Computational Linguistics论文链接:https://www.mitpressjournals.org/doi/full/10.1162/tacl_a_00284开放源码&#…

Docker的基本使用(部署python项目)+两个奇技淫巧,将 Docker 镜像体积减小 99%

两个奇技淫巧,将 Docker 镜像体积减小 99% 使用Docker运行程序 Docker的基本使用(部署python项目) 一、准备项目 我写的是一个爬取某ppt网站的代码,就一个ppt1.py是爬虫,然后,ppts是存放下载的ppt的 二、准备requirement.txt文件…

Pytorch与Tensorflow,哪个更适合你?

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

LeetCode 500. 键盘行

文章目录1. 题目2. 解题1. 题目 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。 示例: 输入: ["Hello", "Alaska", "Dad", "Peace"] 输出: ["Alaska", &quo…

XGBoost缺失值引发的问题及其深度分析

1. 背景 XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域,XGBoost官方也提供了可运行于各种平台和环境的对应代码,如适用于Spark分布式训练的XGBoost on Spark。然而,在XGBoost on Spark的官方实现中…