华人澳洲中文论坛

热图推荐

    字节跳动的云原生技术历程演进

    [复制链接]

    2022-9-22 07:23:16 27 0

    以 Kubernetes 为代表的云原生技术底座撑持了字节跳动业务的疾速开展。从微办事场景开始,Kubernetes 逐步演变一致撑持了字节外部的大数据、机器学习以及存储办事等多种状态根底设施。1. 字节跳动云原生历程1.1 技术体系概览


    从技术体系的底层逻辑下去看,字节跳动采取的是一套明晰的分层技术体系。一些常见的前台业务,好比今日头条、抖音、西瓜视频等都建设在一系列同享的技术中台和根底设施办事上。
    根底架构必需不停地演变本身的平台办事才能,能力顺应业务的疾速开展。
    举个例子,字节跳动目前有超过 10 万个在线办事,在线集群中有超过一千万的 Pod,这些办事天天都有超过 2 万次的变卦。均匀来看,字节的业务零碎每五天就会更新一遍。为了处置数据报表和机器学习训练,天天有超过 1.5 亿的离线工作数量处置数十 EB 的存储资源。
    字节的根底设施面临的是一个范围微小且继续疾速变动的业务场景。
    1.2 字节云原生推动历程
    在疾速变动和范围应战下,云原生技术,特别是与云原生相干的资源调度技术在字节是如何开展的呢?
    2016 年,字节跳动云引擎 TCE(Toutiao Cloud Engine)启动建立。以 Kubernetes 作为底层容器编排引擎,提供快捷高效的运用部署计划;2018 年:微办事架构降级。实现中心业务微办事迁徙,并在 TCE 之上构建办事框架、Mesh、监控诉警等根底设施;2019 年:“推行搜”云原生。把“推行搜”的物理机办事与在线办事进行片面融会,完成一致容器化调度;2020 年:在离线调度融会、存储云原生。融会资源办理状态,简化供给链选型;优化运维效力,开启数据库、缓存等存储零碎的云原生化革新;2021 年:联邦化多集群演进。从资源多云到运用多云,完成全场景运用编排和资源办理的规范化和一致化。目前根底架构的重点建立畛域是基于联邦化的多集群资源的一致办理和一致调度
    1.3 字节云原生开展念头
    从研发和资源效力来看:
    研发效力上:云原生技术体系的底层资源模型简化了办事部署等方面的运维办理本钱,使得业务团队能够更为聚焦于本身中心业务逻辑开发,从而完成疾速的业务迭代;资源效力上:字节大规模地合并资源池,减少资源交互弹性。在大型资源池下,根底设施团队能够集中经过调度等伎俩去优化资源效力,帮忙业务团队获取更低的资源本钱。从研发和资源效力来看:


    咱们把和云原生相近的技术体系分红了 DevOps、Cloud Native 以及 Serverless 三代。
    DevOps:更多强调办理和运维的自动化。主流的办事开发模式是以虚构机作为底层的资源笼统模型,以 Jenkins 之类的一些自动化办理平台来部署单体运用,进而完成运维办理自动化;Cloud Native:以微办事模式为主。在资源方面以容器作为更小、更灵敏的资源交付单元,辅以 Kubernetes 等容器编排引擎,来办理办事的部署和运维。开发者的效力失掉了更大的释放,极大减少了业务产品本身的迭代效力;Serverless:开发者以函数或者极度简化的微办事代码来表白本身的业务逻辑,以事情作为数据模型来表白办事上上游之间的申请和响应。把容量办理、申请路由和办事治理等运维层面的需要下沉究竟层的根底设施来一致反对,办事开发者只需聚焦在本人的业务逻辑上。开发和出产的效力会进一步晋升。这三代技术整体是沿着两个门路在往前推动,分别是产品前向一体化,以及资源范围化。这两种思绪从两个角度分别推进着技术体系的演进。
    产品前向一体化:这类思绪的中心是如何规范化地把业务的计算逻辑、数据办理模型、资源办理等方面的个性需要抽掏出来,积淀到根底设施傍边,使得开发者能够用更少、更简洁的代码高效表白本身的需要;资源范围化:这类思绪更多体当初优化上,关注资源池自身的范围化劣势,经过少量的并池、资源的混用以及调度等优化伎俩,完成资源本钱升高的目的。从技术体系迭代来看,字节跳动技术体系日后迭代标的目的能够总结为上面的主题:
    无需办理的根底设施自动扩展和伸缩晋升开发效力晋升资源效力按需付费,节俭本钱咱们但愿朝这些主题标的目的致力,终究造成下一代的 Serverless 根底设施。
    2. 资源办理理论
    在少量字节业务实现了云原生革新,完成了资源一致托管之后,从全局来看,如何能力够高效地办理并运营好团体资源,这是咱们首先面临的问题。要回答好这个问题,需求先解释现实形态下的资源办理模型。
    在资源办理的现实形态下,咱们给开发者提供的是一个一致的资源入口,在这个入口下,用户能够从一致的资源池获得资源。
    面向业务和运用方面,咱们但愿开发者能够极度灵敏地获得所需资源,像获得“自来水”同样获得各种状态的资源。虽然他们本身的资源需要繁杂,有各种各样状态和要求,然而均可以做到随用随取、随取随有的形态。
    资源办理方面,咱们但愿给用户呈现的是一致的资源池场 —— 一个充沛并池混合的资源池。这个资源池具备全局最优的资源效力,可以一致办理多区域、多计算架构的资源。不同的业务状态和团队之间的资源就能灵敏分配。
    但落实到实际资源需要场景,各业务用户关于资源的需要是极度繁杂的。


    从总体来看,字节外部目前托管的平台租户包孕在线办事、机器学习平台、数据平台, FaaS 以及部份的存储业务。这些平台租户的运用模型有很大的差异,包孕无形态的运用模型、有形态的模型、批式运用等等。
    除了业务场景的繁杂需要外,平安、机能以及容灾等方面也会为底层的资源办理带来冲击:
    以机能角度为例,不同的业务零碎,关于底层的资源算力、计算平台架构都有不同水平的感知力,需求按照不同的业务状况针对性做到最优的机能优化收益;在容灾和平安隔离方面,需求联系不同的业务线常使业务零碎可以在各自的容灾域、平安规模内做到互不影响。在繁杂的业务联系诉求下,适度的资源联系不只会带来资源办理上的繁杂度,也会给一致的资源并池以及优化带来障碍。整体来看,资源一致办理有应战也会带来可观的收益。在实际履行过程当中咱们需求适量的结合经营、运维和调度等伎俩,达到无效的资源办理。
    2.1 一致资源办理应战与收益
    这里咱们总结了资源一致办理方面的应战和收益。
    应战:
    把不同状态的资源调度运用放在同一个队列、同一个集群中一致办理。好比说常驻办事和批处置工作;不同运用对底层资源的隔离才能要求不同,如何把强隔离的运用和低资源本钱需要的运用放在同一集群、节点中,给单机资源办理以及调度零碎带来不小的应战;资源一致办理后也给平台机能、平安和价钱方面带来了应战。收益:
    一致的资源池使得资源占用本钱更为通明化,能够明晰看到各个业务线在资源侧的投入状况,便利做资源运营层面的剖析;资源的交付弹性增大。不同业务线在一致的资源池上做链路治理优化以及跨业务的资源协调变得极度容易。业务状态之间的互补性,自然也会带来一些资源并池优化方面的收益空间。2.2 资源一致解决思绪
    为理解决资源一致办理这个问题,咱们提出了三个思绪:
    1)笼统可以提供的资源售卖模型,便利不同的业务线、业务零碎精确地表白本身的需要;
    2)创立一套一致的 Quota 办理平台,这个平台能够闪开发者们灵敏地办理本身的各类资源;
    3)资源分层调度零碎使得单机集群对字节外部一切计算资源做到疾速灵敏的交付。
    2.2.1 资源模型笼统:QoS & 弹性分级
    在资源模型方面,咱们给运用提供的资源状态以 CPU 维度为例一共分为三级:


    独占核/dedicated_core:以独占的方式去获取物理核,这些 core 上除了运用本身之外不会运转其余租户的过程。咱们又细分了 Numa 的拓扑调配以及疏忽拓扑构造的两个子类,提供了对微拓扑构造上的优化选项;同享核/shared_core:把不同的运用的 Pod 运转在一个同享 CPU 的 Pool 上,这样能够同时针对不同运用状态在 CPU 调度域上的划分,更细粒度地隔分开运用之间的影响;回收核/reclaimed_core:在同享核的根底上,经过混部管制零碎的形式去回收部份的低优资源,咱们能够低优混部的同享形式去提供算力的供应。目前字节外部的运用弹性资源交付也是有三类诉求:
    OnDemand 按需交付:关于运用的实际使用体验是一种对比现实的形态,属于用户随要随有的模式。然而资源办理方面,很容易诱发大批量的资源闲置问题,字节目前次要在函数类的场景下小范围使用;Reserved 资源预留交付:字节主流的资源办理状态,对繁多办事、资源的队列都可以做到资源总量上的保障;Spot 竞价交付:目前处于数据核心中高增长的资源状态,次要经过弹性扩缩、混部回收失掉部份资源,再以竞价的模式给业务方提供使用。弹性的资源交付状态搭配不同的 cores 保障等级,能够反对不同业务场景的资源售卖模型。2.2.2 分层资源调度
    如何无效地把资源诉求精确高效地交付到开发者手上需求一套残缺的调度零碎来反对。字节外部是经过一套分层的调度零碎来完成调度交付的。


    单机调度次要是扩展了 Kubernetes 的单机资源管控:资源的微拓扑构造感知和资源的调配战略,次要解决了如何让不同 cores 状态的 Pod 一致运转在一个节点之上。Kubelet 内新增的 QoS Resource Manager 这个组件,次要担任容器的资源管控链路上根据运用的微拓扑亲和性要求给 Pod 调配包罗 CPU 内存以及 GPU 网卡等装备,在单机拓扑构造上的信息能够经过 CRD 上报到调度器,以调度器核心抢占或者调度的方式把 Pod 调配到适合的节点上。同时这个组件可以在框架上灵敏的扩展。
    SysAdvisor 是一套单机层面的战略管控完成的组件,能够继续视察 Pod 在细粒度下面的零碎目标如何结合不同业务状态的资源使用模型去做预估,去决策在每一个个资源维度上如何给 Pod 调配适合的资源量。
    集群核心调度器需求解决的中心问题是如何让不同状态的运用在全部集群里自在地调度。需求知足不同的调度语义细粒度的要求,充沛升高集群空置率。在调度机能方面,同时要知足低频次和批式的大吞吐的调度场景。针对各种运用场景晋升调度场景的品质也是集群核心调度器需求解决的问题。
    下图总结了调度功用层面下不同场景关于调度器的需要:


    目前字节使用的调度器是参照 Kubernetes 框架的散布式调度器。这套调度零碎次要的核心式组件有 Dispatcher、并行式的 Scheduler 还有核心式的 Binder。
    其中,Dispatcher 次要担任把运用以及集群外部的节点资源调配到详细的 Scheduler 上。Scheduler 在主体构造和 Kubernetes 原生的调度器构造相似,次要处置的就是 predicate 和 priority 的调度计算逻辑。Binder 能够解决不同 Scheduler 视角下调度后果的冲突,而且用 SchedulingUnit 交换了原生的 Pod 语义。这样能够更为便利地处置常驻工作中 per Pod 调度以及批式场景下的 per batch 调度。


    当集群总体的资源占用水位很满的形态下,乐观并发调度中很容易泛起调度冲突的问题。咱们的解决思绪是在 Scheduler 的每次响应后果里,针对调度请求给出多个候选节点,而后一致送到 Binder 里去解决冲突,这个设计能够升高 Binder 里解决冲突的失败几率。
    过来的混部计划是基于 Kubernetes 和 Yarn 的联结零碎管控的计划,并在每一个个节点上同时运转 Kubernetes 和 YARN 的管控组件。另外还有一个居中的协调组件担任调配两套零碎分别可见的资源量。在联结管控的模式下,单机层面每个节点里 agent 占用资源量级不大,但在全部集群里是一个十分可观的资源量。假如可以完成一套一致的链路, 办理不同状态的资源,关于资源优化的架构以及成果都能失掉不错的简化和收益。


    在新的一致调度架构下,咱们的混合部署架构也做了一系列的调剂。保存了平台层 Kubernetes 的 API 以及 Yarn 的 Resource manager 两个入口部署运用的才能。底层的零碎上是整个收敛到了基于 Kubernetes 的管控零碎上,能够完成大数据零碎安稳的底层零碎的切换任务。
    在新的架构上,不管是在线办事仍是离线功课的 Pod 均可以经过一个公共的 Kubernetes API 以及一致调度器去支配资源的调度。这样不只完成了资源分级模型上管控链路的复用处径,有更大的空间斟酌在线、离线业务在同一个集群中运转时资源层应该如何调配及合作。
    2.2.3 全局调度
    斟酌到字节跳动的总体范围,繁多的集群才能缺乏以知足办理字节寰球数据核心的需要,而且在运用之间的隔离、多区域的容灾以及算力的规范化问题上字节也有更为细粒度的调度要求。
    为理解决在一百万节点的范围下处置好全局规模内资源和业务维度之间的婚配问题,字节跳动的全局调度器参加了联邦层,能够完成大颗粒度的运用和资源调度婚配逻辑。


    在运用标的目的上,咱们以运用的优先级作为主维度;在资源池方面,咱们以机房作为主维度,这两个方面穿插搭配就造成了一个运用总体粒度上能够全局调度的调配空间。运用和资源的维度是得多的,假如咱们选择过量的资源维度,全局的资源会被划分红过量的碎片,无益于办理。所以拔取主维度需求斟酌关于每一个个资源池容量的影响不克不及低于设定的节点数量。
    字节现有的全局调动器次要参考社区的 KubeFed V2 的框架。在社区的根底之上,咱们也完成了两方面的扩展,一是对于联邦层拜候语义的通明化革新。这个革新使得咱们下层平台能够使用原生的Kubernetes 资源对象去操作底层资源,从而升高平台接入联邦资源池的本钱。二是大面积革新了全局调度,使很多机房的容灾业务线之间的平安隔离,以及多代际规范算力等均可以在全局调度上一致完成。
    3. 应战与将来
    目前字节外部各种状态的计算运用都完成了全量的云原生化以及资源层面的一致,全部团体全局的计算资源利用率均匀超过 40%。
    虽然依然有晋升的空间,然而利用率在能够预见的将来里很快就会达到瓶颈。咱们以为下一代的根底设施仍然是会沿着产品前向一体化以及资源范围运营两个标的目的去发展。
    3.1 微办事治理
    在产品演进方面,以微办事治理为例,字节跳动目前有超过 10 万个微办事来撑持零碎建立,而这些微办事之间有着繁杂的依赖瓜葛。


    上图是从出产环境里抓取的子业务线办事的拓扑构造,这个图里每个节点代表一个详细的微办事,而节点之间的边就代表办事之间的依赖瓜葛。
    在办事架构治理方面,由于这些办事都是散落在不同的业务团队和零碎里,很难经过一个全局的视角去做架构层面的迭代,就会形成一些老的办事没有方法下线。
    业务和业务零碎之间的依赖瓜葛也是间接在底层办事之间经过近程调用的形式完成。在跨业务线交互的场景里间接袒露细粒度的办事接口会使得办事架构治理的繁杂度变得很大,往往需求关涉多个部门协同任务能力推动办事的架构演进。
    所以在微办事的产品层面,只需一套面向运用的解决计划去办理一个子业务线内一切的办事。
    在资源开消方面,业务零碎经过网络调用的形式完成互联,会有得多的数据资源破费在网络通讯加解密上。跟着微办事数量愈来愈多,这方面的资源开消也会变得愈来愈大。目前字节外部在推行函数类的平台,愈来愈多的办事会经过更细粒度的函数方式去表白本身的逻辑,微办事侧就会趋势于更为巨大的标的目的。那末在架构治理以及资源开消方面的应战会变得更为微小。
    3.2 资源利用率 vs. 资源无效利用率
    资源层面在以前都是环抱着集群的底层资源均匀利用率去展开优化,经过混合部署、弹性扩缩以及分时复用等多种方式取患了不错的均匀利用率的优化成果。然而底层的资源利用率和实际的业务本钱之间仍然存在很大的代沟。如何更间接地解决运用层面的容量本钱问题,是咱们下一步需求重点关注的标的目的。
    3.3 第三代根底设施产品迭代
    总结来看,下一代根底设施在微办事这个畛域有几个重点的的技术标的目的。
    更为极致地简化开发者在实际开发运用的体验,帮忙开发者办理办事容量、办事路由以及其治理托管等,特别是以函数化的方式去表白中心的逻辑;以“运用”为核心的办事办理平台,从繁多办事办理过过渡到散布式运用的间接办理;更细粒度的封装隔离单元,要斟酌到极致的代码散发、细粒度的资源封装、更强的运转时管制等;多层级的调度智能化,更多斟酌散布式运用中的调度优化问题。以上理论教训咱们把它总结成为了 KubeWharf 开源名目并反馈到社区,感兴致的同窗能够理解更多相干内容。
    同时,作为字节跳动旗下的云办事平台,火山引擎笼统了字节跳动的云原生理论思想,曾经对外推出了包孕下层解决计划和中层根底产品办事的云原生全系产品。
    其中,云原生底座包孕中心容器办事和镜像仓库两大产品,它们积淀了字节跳动数年来建立容器平台的教训,除根本运用托管才能外,还提供高不乱、高机能、自运维等才能。
    基于运用生命周期拆解,火山引擎也已推出一些包孕继续交付等晋升矫捷化和一致交付才能的产品,也有办事网格、运用观测、运用韧性这种能够从流量、监控、演练等方面保障业务安稳运转的产品。
    字节跳动宣告开源 KubeWharf,一个理论驱动的云原生名目集
    字节跳动基于大范围弹性伸缩完成拓扑感知的在离线并池
    KubeZoo:字节跳动轻量级多租户开源解决计划
    字节跳动云原生微办事多运转时架构理论

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题37

    帖子49

    积分215

    图文推荐