今天为大家分享的主题是classnet多级寻价购设计在Boss执聘的落地实践围绕四个方面进行今天的分享个人简介Boss执聘的业务发展阶段然后多级寻管理以及总结和规划首先是个人简介我目前是在Boss执聘技术价购然后担任技术负责人然后曾经先后在那个360腾讯也都工作过然后擅长的领域是DiOps原生以及技术架构方向并且目前是多个开源项目的一个代码供应者包括就是今天的这个要跟大家分享的这个classnet多级寻管理KBS多级寻管理的这么一个项目然后是Boss执聘的业务发展阶段首先是Boss执聘业务发展经历的一个周期他分为四个周期首先是前期的一个业务的一个探索期他符合一个小公司向中型公司的这么一个发展的这么一个趋势吧然后第二个周期是在我们的那个邀请明星代言然后在央视投放那个洗脑的那个广告之后然后经过了一轮爆发期的这么一个增长然后在疫情的这几年然后经历了一个稳定期然后在去年那个世界杯然后我们投放广告然后又经历了一个业务的一个爆发期然后叫叫创业出息吧我们的业务的一个规模增长量是将近130倍然后这么大的一个业务体量然后我们是怎么去对他进行那个落地比较通用的一个业务的业务架构的应用架构的一个全景图吧然后并且他是站在我们的基础设施团队以及或者说叫基础架构团队然后来看的视角来看然后我们把它分为几层吧首先最最上面的是那个接入层业务的接入层然后我们我们第二个第二层是那个工具链层就我们需要做一些那个CICD的工具然后一些那个像API网关一些配置中心在这样的一些工具以及DNS服务这样的一些工具吧还有一些运萎方面的一些工具然后再下一层是业务层然后最下面一层是我们的那个基础设施层也就是我们的容器编排调度层然后站在业务应用研发的角度来看就他在业务上云之后他其实不用关心我们的那个基础设施层对吧然后我们的那个中间键层以及我们的工具链层比如说CICD他只需要去使用就ok了他并不需要关心底层的一些原理啊和一些实现是怎么样的这是站在业务研发的一个视角看待这个我们的这个上云之后我们希望达到这样的一个效果然后介绍一下Boss子品业务上云就是上从那个虚机物理机然后签到K8S然后这边一共规划的三个阶段吧首先第一个阶段当然是围绕我们的容器平台在做建设然后以及我们的工具链在做建设工具链就包含了CICD然后API网关应用网关以及我们的日子平台监控告警这样的一些平台然后到了这是第一个阶段我们需要着手建设这样的一些工具一些平台然后到了第二个阶段我们核心围绕的就是我们的业务的一个高可用也就是这一块前面两组老师然后就是着重关注的这一块也是然后第二阶段我们主要围绕的是业务的那个高可用然后以及流量高可用之后流量的一个治理层面然后包括高可用之后成为分布式加购之后它的一个链路追踪然后第三个阶段也就是我们现在所处的阶段是在围绕业务的一个稳定性然后再做建设稳定性这个可以跟大家简单的介绍一下它大概包括就是我们的业务的服务的画像然后以及成本优化还有可观色性以及稳定性的这么一个度量指标包括用到了一些工具就是全联入的一个压射平台犯OPS对吧这个是一直最近几年业界一直很火的一个数语然后还有就是我们的可观色性然后OpenTitleman Trins是这样的一些那个时间标准以及OpenSL这样的一个标准化的这么一个体系那么今天呢着重介绍的是那个ClassNet的组件它本身在里面的定位就是咱们的这个多级循建设以及混合运建设的这么一个组件然后进入到我们今天的那个重点就是多级循管理怎么用ClassNet来进行我们的多级循管理首先说一下多级循管理的一个本质就是我们要做到怎么样的一个地步就证明我们是在做成了多级循管理这件事情以及或者说我们做成了就是混合运的一个统一管理这么一个事情其本质就是我认为就是用一套管理手段或者说一个工具Kamalana比如说Kubo CTL对吧或者说我们希望通过接口通过KBISKlanego这么一个库然后去管理多个级循就统一的这么去管理多个级循而级循维度可能是我们资源带着的一个属性然后通过这样的方式然后去统一的纳管我们的资源就实现了这样的一个地步就我们就说前期的多级循管理已经算落地了然后这个是一些定义就是KBIS多级循管理的一个这里的标准首先我们是分为了五个标准第一个标准是集群的一个基础设施的管理就我们要统一集群的一个基础设施我们要统一它的运行时它的网络接口它的存储接口因为你只有统一了这样的一些底层的一些接口这样的一些基础设施你才能去说我们做统一的调度和统一的纳管然后第二点是多级群的一个生命周期的一个管理然后其实现在在KBIS社区KBIS集群本身是已经是被当成一个资源在看待的也就是它提供了KBIS社区它提供了一个官方的一个接口是class的API也就是说它通过class的API你能够对集群本身进行增商改查以及添加节点或者是这样都形成了一种自动化的这样的一种接口接口化的这么一种方式这是KBIS本身的一个生命周期的一个管理然后第三个标准是集群配置策略的管理我们不同的业务可能会导致我们的KBIS集群它有不同的配置启动配置对吧比如说API Server的配置或者说其他一些组建的配置那这样的多集群里面这样的配置我们怎么做统一化的纳管其实这个在KBIS社区也有相应的一些治理的一些标准然后第四个和第五个就是今天想说的class NAT它所关注的一个核心的点就是分别是应用的编排管理也就是说我应用怎么调度我我clo的怎么编排然后调度到哪一些集群里面去调度到哪一些区域里面去然后第五个就是你调度部署编排完之后那你正在运行中的这些应用你怎么进行运维管理这是我们class NAT关注的核心的点就是第四个和第五个然后这个是我在知乎上找的关于多集群管理然后讨论就是影响你比较比较大的这么一篇帖子吧就是你要做到就业界对多集群管理之前事情本身然后要做到什么样的一些维度然后进行了一些深入的探讨吧这是知乎上列出来的一些那个调调调调矿矿然后我我把它给抽象一下吧就是它主要是两个我把它抽象成两个方面第一个方面是在多集群的那个架构之下我们对我们的资源如何进行统一的那个调度然后第二点是如何进行差异化的配置所谓差异化的配置就比如说我有一个资源一个workload 一个deployment我想部署到北京和广州的集群但是我部署的副本数不像一样对吧然后我打上的那个集群的标签跟那个资源打上的标签也不一样比如说我在北京的集群我的那个ROM可能要写成APPROM写成可能要写成北京对吧在那个上海可能写成上海然后以及我想部署在北京跟上海它的那个resource queue就是它的那个资源的那个容量可能也不一样对吧比如说我想在北京部部署两盒两剂或者在上海部署一盒一剂这样的一种差异化的配置怎么实现这是它描述的这个这一类问题然后第二类问题主要是在我们回到我们刚刚说的那个话题就是它部署完之后我们怎么对部署的资源数据进行统一的这么一个查看是这么一个可观之性对这是它想强调到第二个方面然后这是我们classnet的一个整体架构这里想介绍一下的是它跟其他的一些组件的一个主要的区别在于它本身的设计是不需要controller的然后它是附属在就是你的一个某一个业务集群的cube API server上或者说你不希望就是你的那个管控集群跟你的业务集群在一起你可以用一个单独的集群就反总的来说它是通过那个k8s本身的aggrated API server这么一个接口来实现的一个服务端也就是我们的classnet harbor它本质是你不需要启动任何额外的进程也就是它附属在本身k8s的API server的那个643端口上也就是说你把这个组件classnet harbor这个组件安装之后你只需要请求你以前的那个API server的643端口你就可以去通过它去创建资源去通信这也回答了刚刚那个有一个同学在那问过的一个问题吧就是他这个如果是我要选择一个多级群的一个管理组件他的一个性能究竟如何相当于我们我们做的这样一层抽象之后就相当于把性能彻底交给了k8s比如说k8s的性能如何我们这个组件的性能就如何就这样的ok这是关于我们的那个服务端的这个组件classnet harbor然后在指级群中我们会分别部署一个那个classnet agent这么一个组件然后它的主要功能是跟classnet harbor服务端然后去通信它有两种通信模式第一种是通过API server去通信直接通过API server的组织群的API server的643端口去通信然后去建立连接去进行那个走k8s原生的那个接口走资源的增长改查然后第二种方式是刚刚说的那个classnet harbor它除了这种提供的就是依附于这个k8s API server的那个643端口之外它还会提供一个websocket的一个常连接的接口就包括我们的那个rancher它它内部其实也是这样一个实现机制就是它的最多继续的一个管理然后提供一个websocket的接口它通过跟客户端去建连agent去建连然后建连之后实现客户端的那个新调上报健康检查以及比如说你你继续版本或者说你进行了升级对吧或者说你继续健康不状态健康你继续状态不健康了它会进行这样的一些数据的一些商报对这是websocket的这么一条通道的一个主要的能力然后这个是classnet资源调度模型的一个设计主要就是我们我们用户需要参与的就是主要是这个绿色的这个部分嘛然后就是这个像这个这个这个纸色这个这个这个base和这个description都是那个集群自动生成的一些资源就我们要参与的从左往右看就第一个是原生的资源你肯定需要自己创建比如说你是harmchat因为我们刚说的我们的那个组件是依附于那个APS server的也就是说对于classnet对于那个k8s的任何资源内型包括cld你都是不需要经过任何改造你直接可以创建的然后比如说像harmchat然后deployment以及namespace还有那个你自己的一些cld比如说我们boss直屏用到的是现在目前用到了好几个cld吧决定来说就是那个阿里开源的那个open cruise对吧它增强了一些那个优雅的启停然后这样的一些功能的这样的一些组件吧然后通过这样的一些组件你不需要不需要做任何的改造和计算你只需要把这些组件部署在相应的集群它就能够自动的去纳管这样的一些资源内型然后第二个那个资源定义是saboscrapsing然后这个东西它就是一个scadial的这么一个资源它相当于是会集成cldnet集成了好几种那个调度算法然后这个资源主要是围绕那些调度算法的一个封装然后这个后面会进行详细的一个讲解然后选择出最最优的一个集群或者说几个集群去进行资源的部署然后它你创建完saboscrapsing之后它会形成一个bass资源bass资源然后再会融合这个bass资源是carsnet自己生成的刚刚说的这个颜色的是我们carsnet自己生成的资源然后这边需要人为参与的也可以不用参与的这个是那个刚刚说的那个配置差异化的这么一个资源它分为全局的这么一个配置差异化也就是说我所有集群我定义的策略在所有集群里中均升效并且它有一个优先级的一个参数然后localization它说的是我在单个集群中就我为单个集群指定它的一个配置差异化的这么一个配置然后以及它也有一个优先级然后结合你开始的一个调度策略然后以及你这个配置差异化的这一个配置它最终会在我们的carsnet harbour中生成一个叫description的这么一个资源这个描述性的资源它就是说的是我们通过调度算法以及优先级多优先级阶段的这么一个匹配全局优先级以及那个单级群的localization这么一个优先级匹配完之后我生成了一个最终的一个资源存储在这个description中然后carsnet harbour会将这个description资源里面它就是存储的真正的资源比如说是你的deployment它会被分配具体分配在哪一个集群中它会存出这样的一些信息它会带着这样的一些信息然后给你推送到相应的集群这是它整个一个资源调度的一个架构设计然后我们制定一资源它如何能够集成进那个carsnet调度器呢目前carsnet调度器是该有这么一个组件它默认只是实现了k8s beauty-ing的一些资源deployment state for set job current job这样的一些资源的一些调度但是你比如说像三方的资源刚说的open cruise clone set这种资源它是没有实现这样的这样的调度你只需要实现极为简单的几行代码就是这几行代码主要是为了干什么呢主要是为了指定你的资源的replay case set那个制断在你的资源的哪一个层级比如说spec点replay case set对吧然后以及你的resourcecute它是你的资源容量它是在哪一个制断为了指定这样的一个层级这个是carsnet组件的一个介绍carsnet一共当前一共分为了四个组件carsnet agent然后这个是部署在子局行动的carsnet schedule这个是我们刚刚说的那个调度算法的那个组件然后它然后是carsnet controller manager最后是那个刚刚说的那个依附于那个APS server的以及那个提供那个web-circuit的进程的这么一个组件carsnet harbor然后详细介绍一下这块它们负责的功能就是carsnet agent它主要是自动的将你你当前的这个子集群注册到附集群中然后作为子集群让附集群能够认识你并且建立起web-circuit的这么一个通道然后它会周期性的报告当前集群的心跳就我是否存我这条链接是否存活以及包括kbs的版本然后运行的平台以及健康状态就序状态以及存活状态这样一些状态然后carsnet schedule它主要是负责定义就是你要你要用哪一种调度算法当然它也是插件化的就是你你如果说对它类似的那个调度算法你觉得功能不够用对吧你可以去扩展你自己的调度算法然后这个carsnet controller melange是后来新增的一个组件它实际上是从harbor里面拆出来的一个组件也就是为了让这个harbor更清亮级那这个controller melange才组件功能也非常的明确它就是为了你刚刚子集群注册上来的那些信息然后我进行批准然后我去为你这些为子集群创建单独的那个命名空间也就是说我们的harbor对子集群的管理是通过namespace来做为每个子群子集群会建立单独的namespace然后下面去对它子集群的一些信息进行一些存储和管理然后carsnet harbor这个核心的组件它是作为Agrity的APS Server这么一个服务然后集成在我们的那个k8s本身的APS Server之上的然后它并且它提供shadow API这shadow API就是其实也是k8s本身的功能就是你的资源可以以giron的形式运行在k8s集群中就是你干运行然后并不会真正的去执行这个资源然后它会提供那个webisocket的服务器然后维护与子集群建立的连接词这是harbor的一个主要的一个功能没电了诶 老师 这个比没电了OK 那继续carsnet agent它跟harbor通信有三种模式这是为了解决网络不通的一些场景它有pushy模式就是我可以主动的我的harbor主动的向agint就刚刚那个description支援生成之后我主动的向agint去pushy某一个支援这是pushy模式然后它还可以去由子集群去pull子集群pull它主要是连接的是那个伏击群的APS7 6443端口然后去拿归属于自己的那些支援下来去进行创建部署或者更新这样的一些行为以及就是结合了pushy跟pull的两种模式的一个结合然后官方现在默认配置的就是这个这个这种模式它是为了主要是为了就是防止在可能有一些比如说哪一条通道不通的情况下然后它可以默认自动的做切换ok 那简单的聊一下classnet的多集群应用分发的几个场景吧首先是复制调度复制调度也就是说我们明确知道某一个资源要部署到哪一个集群我可以指定那个集群的veid或者集群内幕通过你们可以看到这个调度策略是通过这个标签标签选择器的这种形式K8兼容了K8S原生的标签选择器的这种形式你只需要指定特定的那个集群名称或者集群ID你就能分发下去这是复制调度然后第二种模式是静态权重调度比如说我有一个资源副本有一个资源我可漏的我希望部署在上海部署一个副本部署在北京部署两个副本你只需要把它的权重veid改为1和2然后它就会实现这样的一个功能然后第三个是第三个场景是动态扩散调度那这种场景实际上说的就是它会因为是动态它会默认地去计算ABC三个集群它的一个资源的剩余的一个容量然后根据容量的一个配比来决定将你这个比如说你要调度9个副本分别一共要调度到这三个集群然后它会将这个9这个数字去进行分拆这是它里面的一种调度算法的一个实现就比如说你的资源剩余配比是1比2比3那它就会把9按照1比2比3的这么一个资源的配比然后分别调度到这三个集群之中这个是我为官方提供的一个贡献的一个功能就是动态分组调度因为在很多情况下我们需要先对集群先进行第一轮分组然后对集群分组后的集群然后再进行权重调度或者静态调度然后进行调度也就是说大家可以看到这个一个核心就是我们会首先对集群分为北京和广州两个这么一个分组然后我会决定往北京的集群里面是选择是挑选一个集群去调度还是两个集群去调度往广州挑选一个或者两个集群去调度然后它会根据刚刚的那个第三步那个动态的调度规则然后去进行调度这是一种就是相当于更深层次的一种抽象对于那个动态调度当然它也支持权重就比如说我我是我虽然说我要给北京分为两个集群北京要调度到两个集群之上上海要调度到一个集群之上但是我北京两个集群我可能只是调度权重为三的这么一个副本下去然后我到那个另一个分区里面我想调度更多的一个副本到那个集群下面去所以它就会非常的灵活然后这是克拉斯那特多集群调度完之后它的一个状态的一个聚合你们可以看到它调度完之后它会有非常详尽的一个数据的一个总拿就是我现在一共多少个集群是就绪的然后分别往哪些集群分别调度了多少个副本上去然后并且那些副本哪些是可用的哪些现在是不可用的哪一些是未就绪的然后以及我总共调的副本是多少个下面是绑定Biden class就是我经过一系列的调度算法我最终决定调度到哪一些集群上去这是那个classnet资源创建的步骤我们支持的那个刚刚说的那个classcubrcdl那个命令然后是通过它的命令的一个拓展就是cubrcdl后面跟classnet然后通过这两个命令的一个会总然后去执行我们classnet相关的命令比如说我们怎么创建一个资源呢就我们classnetcubrcdl classnet我们去查询一个getlemnspace发现没有资源然后我们通过cubrcdl classnet去create一个lemnspace abc然后我们再通过cubrcdl classnet去getlemnspace发现有一个lemnspace但是我们通过cubrcdlgetlemnspace直接getlemnspace发现没有资源这就是我刚刚说的它的影子API相当于它创建的是以干运以drive run的这么一种资源的运行方式运行在那个副集群之中的它并没有真正的去创建资源然后后续你定义了subscription才会对这个资源进行下一步的调度它是这么一个原理总结与规划就是我们classnet预期吧就将来我们还需要在哪些方面去做拓展努力的地方也就是灾难的恢复然后以及资源的动态的再平衡然后是那个跨集群的一个流量的一个管控因为classnet本身是兼容的KBSKBS本身的那些API比如说class的API以及mcs的API就是那个多service多集群多service的这么一个API对 我分享了就这么多谢谢大家谢谢秦老师的精彩分享大家有什么问题吗可以去找其他老师也很好我们问个问题就是Rinsor Sauer建立得起来它不是支持一个自建的K3S吗我可以在它的本集群上再拉一个Rinsor Agent这个时候它相当于就是有一个K3S的集群有一个标准的集群这个时候我去部署这个classnet的时候它有两套抗费的文件这个时候我如何去做它的复制机切换呢我每天听得太清楚那个问题你是说K3S里面部署一个Rinsor是吧不是 就是部署一个Rinsor Sauer的时候它自带了一个K3S的集群这个时候我可以在当前的Rinsor Sauer里面再建一个标准的集群叫Rinsor Agent这个时候相当于我这个集群上面有两套环境一个是K3S的环境一个是标准的K8S的环境这个时候我去安装当前的classnet的时候我跑在了底层的K3S的环境这个时候我要去把它调度到标准上的K8S我该怎么处理那个K3S我不太熟悉我换一个 就看的我更熟一点就以看的举例比如说我在本集麦克斯上我部署了几个看的集群你只要在网络通的情况下就说K3S它官方的classnet的官方是支持的就是它作为Parent或者它作为Agent都是支持的但是前提是你要管理的集群和你被管理的集群它的网一定是通的那我以看的举例就比如说我在本地麦克斯上我创建两个集群看的一和看的二这两个集群其实你只要它俩的网是通的你看的一 无论谁是Parent谁是Agent其实这个是无所谓的就是我的意思是一个机器上现在有两道config文件这个时候我部署了到某一个节点的时候我要做当前多集群的调度的时候我怎么把K3S里面的跑到指向当前标准的你是说节点的选择器是吗对就是你那个选择器节点的选择器是这样就是classnet它针对这一块做了一个过滤器服务就是现在集成到classnet的concernal melange里面的它是做一件什么事呢在你所有的集群刚刚说的它只是采集集集群的健康状态以及集群的版本信息其实不止这些东西它还能采集你纸集群的所有node的标签然后它会为你的这些node这个集群然后这个load打上相应的一个标签到classnet harbor之上也就是说你现在决定要用node snack的这种比如说节点挑选器 选择器这样的一些方式的话然后它会通首先第一步classnet harbor它会去选择你这个节点选择器这个标签是在哪一些集群上的它会第一步选择那些集群然后在第二步才是根据我刚刚说的那几类那个调度算法然后去调度也就是说它有一个标签汇总聚合了这么一个功能对就比如说我一个机器上现在有两套kbs的集群这个时候我通过它去部署的时候一个集群上面它就会有两个choreconfigure的文件这个时候我去调度的时候我指向同一个集群的时候它打标签其实都是一样的这个时候我怎么去来区分它是标准的还是另外的环境你这个问题实际上是一个中间地带就是classnet它会基于你不同的agent你如果两套集群虽然说你用的物理机是一样的但是它会区分它会生成一个唯一的classdaid就为不同的集群生成唯一的classdaid它还是会识别为不同的集群也就是两个集群但是只不过你现在的资源它是一样的对吧对于它的调度模型来说你的资源是一样的资源是一样的它就会走一个随机分配就比如说你是决定把这个资源给一个集群的话它会走一个随机分配如果你是走静态调度那相当于是你需要去指定你调度到哪个集群上如果你是走动态调度并且你化规的是你只需要调度到一个集群上它就会走轮旋的方式这种对轮旋的时候它还会去找某一个集群的Config文件去连它的APS3.2进行调度是吧它不会刚刚说了它是会通过两种方式去跟主集群跟子集群通信一种是Webersock的那个长连接还有一种方式是这是那个push的方式就是主集群续往那个子集群去推消息还有一种模式是那个子集群主动的去拿消息拿消息就是它会子集群会调度会调那个副集群的那个KBS的那个APS server然后6443端口通过HTPS的这么一个方式去通信所以你Client Go的这么一个底层的一个本质就是封装的那个调那个接口的6443接口嘛对就这样子对 就是你通过Client Go去连的时候你肯定会指向一个talking或者指向一个couple content别的文件然后去调度我明白你的意思了其实不会我们刚刚说的那个Client Go在classnet里面它会有一层封装就是你现在用的是classnet.client.go就是那个东西它会去挑选它会它去做资源分发的时候它会挑选你你是哪一个websocket的长连接是这样子的就是两个集群里面必须有个agent然后去连接对也就是说集群里面必须得有agent就是你必须得部署这个agent然后那个classnetHUB才能感知到你就是另外的图件还是可以某一个集群去部署是吧是所有的紫集群都需要部署一个classnet.agent这样子然后它是注册到组织群它以注册的方式然后组织群能够发现这些所有的紫集群就是不可以跟那个Runcher一样就是说我Runcher Sorry一个界面只是他做的管理然后我其余的所有KBS集群它都是一个agent可以跑在所有的集集上明白不太一样就是Runcher它更多的是偏向于那个就是你coupleconfig我也能管理对吧你要是用别的那个方式这个是我们是要对就是我的组集群要对所有的紫集群进行统一的拉管所以这个场景是不一样的ok 想好对