那我们现在开始今天的这个session然后首先感谢大家这个在临近饭店的时候然后参加我们的这个今天那个最后的一个session不是 那个中午之前然后另外的话在开始这个演讲之前我需要隆重地向大家介绍一下我们的这个这个嘉宾Victor然后可能大家在之前就是上午的那个keynote上面已经有比较深的一个印象了然后一个非常impressive这样的一个keynoteSo Victor do you want to say hi to our audience?Yeah, yeah, sure.Thank you, thank you so much.Ok, 所以大家如果待会比如说Q&A的时候想有一些问题啊什么的Just ask Victor.Ok, let's get started.那首先自我介绍一下就是我是来自于ibm然后目前是在crosspan的这个社区里面是一个作为mantana这样的一个身份所以今天这个crosspan的这个讲座的话其实也是想跟大家快速的过一下就是关于crosspan的一些basic knowledge以及一些advance如果时间允许的话因为我们应该只有35分钟的时间对吧然后所以这个deck的前半部分是for beginner的然后呢后半部分时间允许的话会给大家讲两个就是新的feature再下一个releasecrosspan release里面的新的feature并且可能会有一个小的一个demo给大家演示一下Ok首先来说一下what is crosspan那以我的理解crosspan它是以cubernetes native的方式去集中的统一的对多音或者是混合音环境下的各种想服务啊资源啊这样的一些内容进行部署编排还管理这样的一个功能所有的cubernetes native可能后面大家会不断地看到就是本质上讲就是采用这种cubernetesdecorative的这样的一种声明性的这样一种方式decorative API那更重要的一点就是crosspan它可以帮助你构建属于自己的这样的一个control plan你可以定制自己的control plan也就是所谓的self service并且这种高度的定制化的能力是不需要任何代码或者是只需要很少量的代码那这个很少量的代码为什么那后面我们会看到Ok那稍微介绍一下这个crosspan项目的一个历史那crosspan的项目实际上是在2018年的12月份launch的它的crater实际上也是我们CNCEF有的同学可能了解就是那个CNCEF的另一个graduate的一个项目就是rook然后同样也是这个的crater所以它们在这个2020年6月份的时候被CNCEF接受为sandbox project然后在2020年的12月份是第一个1.0的release第一年就进入到incurbation然后目前最近的一个版本的话是1.13然后很快10月下旬的话会有一个1.14目前的话正在向graduate的这个project在努力Ok这个是目前的crosspan的社区的一些一些活跃度的一些状态然后从里面大家可以看到实际上目前还是一个非常活跃的一个项目sandbox的项目接下来就跟大家购注一下就是一些basic的一些信息那首先了解crosspan的话最基本的一个core concept应该就是managed resource那在我们因为我们知道这个前面提到crosspan它的目的是去orchestrate这些个public cloud或者是一些oprm的这种service的一些这种编排那我们举一个例子比如说AWS可能是一个非常典型的这样的一个例子AWS它有很多的服务和资源从网络到数据库到这个EKS等等还有一些infrastructure的一些这种service那所有的这些service在crosspan的这个上下文里面其实都可以对印象的这样的一个所谓的managed resource或者说受控的或者是拖管的这样的一个资源那这个是一个例子我们可以看到就是它实际上是一个典型的cubanized resource这样的一个格式来定义的这个是Advast S3 bucket这样的一个resource然后在底下我们可以看到有很多的这些metadata的一些数据实际上是用来描述这个bucket的一些信息的所以它在cubanized的世界里面在crosspan的世界里面远端的这个Advast相应的这个bucket这个资源或者这个服务是有一个一对一的一个关系的接下来除了这个之外我们当然还会看到就是因为它是一个cubanized resource所以它有status有events那这些的话呢我们是可以通过status和events来反映这个managed resource在运行时的阶段的一些变化的状况还有一点就是reconciliation这个在cubanized的这个世界里面大家应该很熟悉了在cubanized里面我们是通过controllercubanized controller来控制对资源的一些管理的操作的它是一种就是reconciliation的这样的一个不断的retreat的这样的一个方式所以还是前面那个例子我们可以看到就是如果我们把一个前面这样的一个bucket这样的一个resource谈到cubanized cluster上面之后那么通过API server就会被一个专门的这个s3的这样的controller被它watch到然后因为这个controller里面包含了一些逻辑能够知道怎么样去解析这个cubanized resource然后再去调用相应的events的API去操纵这个远端的这个s3的这个service所以这就完成了一个整个的一个端端端的一个链这张图实际上是用来就是给大家一个印象就是说crossplane在整个cubanized的这个生态里面的一个位置那我们可以看到前面讲的这些个一些crossplane的一些能力的话实际上它很大重度上依赖于底层的cubanized的一些机制包括它的这个round time还有controller的这个round timeAPI machinery 等等这样的一些然后crossplane的round time实际上是在它至上的很薄的这么一层所以它是非常轻量的然后再加上一些我们的一些customer logic可能会后面会讲到就是比如说一些provider等等那这个上面的两层构成了一个完整的这个crossplane的这样的一个结构ok那下一部分的话就是讲怎么样另外一个很重要的概念就是composition利用composition我们可以去构建我们真正的这样的一个control plan那在crossplane里面composition它的目的就是要把一些我们前面讲的managed resource组合起来然后呢再以cubanized原生的这种方式暴露出来一组更high level的这样一组API供用户来使用那意思就是说同样它还是composition暴露出来的那个接口还是decorative的声明式的然后呢并且它会把一些就是底层的managed resource的相关的一些细节能够隐藏掉所以这样的话用户它主要关心我们希望它定制的部分就可以了所以这是它的主要的一个目的而且呢这个过程呢是不需要有任何代码的这个设计的就编写的只需要编写一些压抹的文件就可以了接下来我们来看一个例子这个例子的左边实际上就是一个我们前面的那个bucket就是一个我们把它叫做claim但用户apply了这样一个claim之后那么这里面有一个重要的概念xrd大家可以理解就是xrd是类似于这个kubernetes里面的这个crd所以claim和xrd的关系就像是crd和cr的关系cr就是kubernetes的custom resource然后呢有了这个xrd来去定义这个claim的它的一些schema的这种属性之后呢在配合待会我们会看到composition会长什么样子在配合composition之后那么这个crossplane它就知道怎么样根据这个claim翻译成相应的一些managed resource然后呢再由相应的controller去操纵远端地真正的那些比如说AWS的service这是一个完整的过程所以底下这一页实际上就是一个对应的一个实际的例子左边claim是一个postgresicle然后呢通过xrd加上一个针对于AWS的这样一个composition的定义然后它可以把这个postgresicle的这个claim翻译成相应的一组managed resource包括什么secure groupdbpremediate group还有rdsinstance等等等等这个是一个更细一点的力度的这样一个例子就是给大家看一下就是xrd会长什么样子大家可以看到里面其实长得非常像crd因为你可以看到这下边从这个地方开始schemaopen api v3schema实际上就是crd里面也是有类似的这样的一个定义的然后这个composition也是刚才说的一个具体的一个例子从这里面我们可以看到就是它首先有一个reference指向前面我们定义的那个xrd然后从这开始resources再往下是一个managed resource的定义的一个列表如果我们再往下看的话你可以看到就是某一个resource里面它会有一些像patches这样的一些字段那这个是什么意思呢我们举个例子比如说像这个实际上它是在说告诉crossplane你去从claim里面spec read capacity这个字段里面把那个值取出来然后再设置到我们的managed resource里面相应的这个字段里面所以它实际上是做了一个translation的这样一个过程有一些这种transformationtransform或者是会更复杂一些像这个例子就是它用了一个map我们在这个claim里面看到的这个location是像EUUS这样的一些可读性更好的一些值这个地方它会把它做一个翻译根据这个mapping table然后把它翻译成真正的实际的LBS的service所认的这样的一个值所以这是有这么一个transform的一个过程OK然后我们再来看一下怎么样去extendcrossplane来构住我们的control plan这里面要提到两个概念在crossplane里面一个是provider一个是configuration我们可以看到这个provider它实际上就是我们前面提到的直接跟那些controller直接跟这些外部的service去打交道的这样的一个一个部件一个组件然后configuration实际上它是一个package里面包含了我们刚才定义的这些composition以及XRD等等这样一些资源而所有的这些都是可以被打包成遵循OCI规范的这样的一个image意思就是说我们可以把它push到像普通的container image一样push到container registry里面然后再去把它push下来OK这个是讲的就是目前crossplane provider这样的ecosystem我们可以看到这里面有好多的这些已经supported的一些比如说公有云上面的一些服务以及一些某个特定领域的一些像比如argo cd然后glib等等卡夫卡等等这样的一些一些支持的这些back end或者是外部的一些服务还有一个就是这个大家可以点一下那个是目前在crossplane社区里面的这样的一个market place然后在这上面大家不仅可以找到provider也可以找到一些configuration它相当于是一个汇集就是所有的这些社区里面包括一些official的这样的一些provider这样的一个地方OK这个目前为止就是basic的部分然后接下来我看还有时间所以我会继续讲advanced的部分那这个今天想跟大家讲的是两个一个是叫composition functions这个可以认为是我们前面讲的那个composition一个升级版然后还有一个是我们讲到就是叫order的delition然后这个其实也是挺重要的一个feature在下个月的这个版本里面会有首先composition functions先说一下这个背景为什么会有这个东西我们前面看到的这个composition它实际上我们知道它典型的是一种yaml的这种文件的格式来去编写的那么它实际上会有一些limitation尤其是我们在就是描述这些manage to resource的这种compose的这种能力的时候如果需要有一些这种动态的这种特征的话那么目前的这个composition它是全部都是static所以这个是没有办法支持的比如说它没有这种循环没有这种条件没有包括像类似于这种helm template这样的这种模板机制如果有这些的话那么会使得这个composition再定义起来会更加的灵活所以这是它目前的一个缺陷那为了解决这个缺陷呢我们就引入了这样的一个function这样的一个能力那实际上在1.11的这个版本里面实际上这个composition functions已经released那是一个alpha的一个版本那我记得在今年上半年的这个欧洲的copcon上面其实有已经大家已经看到了这样的一个feature了当然下一个版本就是1.14的版本会进入到beta那这个应该是会一个更加成熟的这样的一个feature那么如果我们看它的composition functions的这个基本的这个做法的话你会发现它实际上是一个pipeline一个通过一个定义在你的composition这个压膜里面去定一个pipeline然后呢去把一些function以step的方式给它串起来那待会我们会看一个例子然后呢更重要的是你可以用你喜欢的或者擅长的这个语言编程语言去写你的function的逻辑那么并且的话甚至你可能不需要就是从头写你的function因为有很多reusable的这种function可以你直接可以去拿来用比如像harm或者go的这种template的待会会有个例子给大家看所以有了这个之后呢我们来看一下怎么样去这个function它是怎么工作的那么首先呢就是和前面的providal和configuration类似的这个function其实它也是可以被打包成一个container image然后它本质上来讲实际上就是一个deployment在kubernetes里面是一个deployment并且呢我们可以看一下下面这个图这个其实就是一个例子就是我们左边是cross-plan的这个call的部分然后在一个k8的这个机群里面然后它的右边是有一系列的这种function然后每一个function都是一个deployment然后彼此之间它彼此之间是通过gipc的方式来进行通信的所以有了这个之后那么我们会发现在我们去compose这些managed resource的时候呢经过这个pipeline上面的所有的这些function它会一步一步的就是把比如说当前这个function会接收来自上面这个function的upput然后呢再去做一些处理或者是做一些validate一些验证的工作然后再把它交给下一个如果一些顺利的话把它交给下一个function当所有的这个这条链上都走完之后那么它会返回给cross-plan然后再由cross-plan去做后续的处理所以这是它的一个基本的逻辑OK怎么样build的这个function那这个时尚是现在有很多就是比如像sdk的一些支持以及包括一些command line的这种tooling的支持比如说像这个例子就是我们可以通过couple cartel然后去run一个init function的命令来去出实化一些这个框架代码一个function的框架代码还有呢我可以通过类似的命令去build的然后呢push到一个register里面或者我们还可以做一些local的一些test都可以通过命令来实现使用这个function的话那首先同样的因为我们看到其实cross-plan的一个非常明显的一个特征就是couplenaceeverything iscouplenace resource所以呢这个function同样也是通过这种couplenace resource的方式来体现的所以首先我要install这个function的时候会deploy这样的一个类型叫function的这样的一个couplenace resource然后呢然后呢在这个我们定义的某个composition里面去一个引用指向这个function然后再去提供在这个composition里面去提供相应的这个input给这个function这样就ok了还有一点就是这两者之间实际上是可以可以就是我们前面讲的这种就是声明式的这种定义composition这种方式我们把它叫patch and transform或者pnt的逻辑和这个composition function实际上是可以组合在一起来就是非常灵活这个其实就是一个例子我们可以看到就是同样还是composition然后呢它体现的是一个for loop它用的是一个叫gold template这是一个现成的一个gold template这样的一个function然后底下这一段大家应该很熟悉就是let's use help template里面去做一个for each的这样一个loop然后指定有多少个managed resource这种instance类型的managed resource然后动态的它会根据你这个需求来rander出来若干个相应的managed resource所以这个是它的动态特征的一个体现ok下一个例子就是新的feature就叫order the deletion我想说的就是order the deletion在我看来它是一个非常有意义的feature因为我们前面看到的所有的这些crosspan的feature好像都讲的是how to provision但是没有deprevision因为我们知道在deprevision的时候尤其是这种resource和resource之间有这种依赖关系的时候其实有可能你会fail那么我们可以看一下为什么会有order the deletion这样的feature就是因为我们知道我们所熟悉的kubernetes的最终一致性的这个特征它是通过不断的retry然后一开始的时候可能会有这些resource的一些failure最终它会success但是如果说你的resource和resource之间有dependency的话那么当我们去反向操作的时候做delete的时候那么举个例子比如说我有个hammer release然后它被deploy到了EKS这个cluster上面这个cluster也是一个kubernetes resource那就意味着这个hammer release和这个cluster之间是有依赖关系的但如果我去直接先删除这个cluster的时候那么大家可以想象一下这个hammer release就会变成一个就是offend的就有一个孤立的这样的resource就留在那了就变成一个垃圾了所以这个是在order the deletion出现之前的这样的一个问题OK 然后有了这个有了这个叫usage API的这样一个新的功能之后那么我们可以看到就是crossplane又向前进了一步它把它的scope又extended到Deprovision的这样的一个阶段那么这个usage API它是怎么做的呢这里面可以看一下首先现在应该是在十月份下旬的时候一点意思的版本里面它会有一个offend release然后它实际上同样也是一种decoration的方式去声明resource之间的这样一个dependency那这个relationship是怎么声明的这个后面我们待会儿会看到有一点就是说有了这个usage之后那么我们借助CubernetesNative Admission Webhook我们就可以让crossplane来帮助我们去检查当我们去做一些危险的操作的时候那么它会如果我根据这个usage判断发现这个是invalid这样一个操作是危险的操作那么它会denyok 那这就是一个usage这个例子我们可以看到这里面最核心的部分是两块一块是offoff代表的就是被依赖的那个资源就是我们前面那个例子里面的clustereksclusterby就是我们依赖的那个资源harm release 依赖与cluster所以有了这个之后那么我们就定义好了两者之间的一个依赖关系还有种特殊的一个使用方法就是如果我们省略了这个by的话只留这个off的话那么就意味着这个resource是永远都不会被删除的在某些特殊的场景下会有这样的一个需求ok 那下面就是一个小的demo了这个demo的话底下这个link大家可以看一下的就是它在k-hub上面会有然后它想做的一个事情的话稍等一下我把这个我还是我们先来看一下这个图吧就是这个图实际上是它里面那个例子就是说我们有一个claim就是这个然后这个呢实际上是一个database然后带有一个这种User的定义的这样的一个依赖所以User这个资源是依赖于这个database的然后呢当这个claim被provenin到这个Kubernetes的环境里面之后它后面会有一些我们前面讲到这个provider里面有Harm providerKubernetes providerSecure provider也是用来就是做具体的创建这些资源的操作的像这个Harm provider它会去创建出来一个MerleDB的这样的一个instance然后呢最重要的一点就是说这里面会有一个secure user这个secure user它是依赖于这个这个database的所以然后实际的这个instance在这里我们可以看到就是在那个database system的这个namespace下面会有相应的这样的MerleDB的instance所以我们看一下这个video这个是我在我的local的Macbook上面装的一个看的这样一个小的Kubernetes环境然后可以看到这个上面其实已经deploy了我们刚才说那个claim以及就是它相应了一些个资源然后我们可以看到这里面有这个像最上面那个是Harm的release然后下边是那个有个Kubernetes的一个object这个是它是一个secret看的那个地方应该能看到然后最下边那个就是那个那个user然后如果这个是可以看到就是在这个环境里面就是有一个MerleDB被launch起来最上面那个地方MerleGunlin如果我们现在去删除这个cluster就是我们刚才说那个serverxdatabase这个server的话那么你会发现它会有一个error就告诉你说这个当天你要删的这个资源是被另外一个inuse by one usage就最下面这一行可能有点有啥然后会告诉你它是哪个资源用的这个resource所以它会拒绝你那如果我们看一下这个就是如果我们看这个可能打不出来就是如果我们看一下它那个定义的话你会发现就是它的就在这里浪费时间了就是浪费那个resource如果你去output它的那个yaml的话你会看到它有一个off然后里面会定义好就是相应的这个relationship那我的这个demo就到这了然后我不知道后面还有多少时间然后接下来就是Q&A环节然后大家如果有什么问题的话欢迎提问感谢您分享我对这个crossplay过来很期待然后我有个实际的一个我有个实际的我们公司的一个问题就是像我们公司在这个terraform上已经花费了很多的精力那我感觉像crossplay未来可以就是说处理这个terraform类似的一些需求那我的一个疑问是crossplay上面的这个provider它对这个因为我看比方说像AWS像Azure或者是这个Google Cloud它的知识已经比较完善了它像对国内的一些cloud可能没有这么完整那是不是这些resource还是完全依赖就是说这些云场上自己来开发然后的话还有个问题就是如果说是这个情况的话那是不是我前面也在查有那个composite resource是支持这个terraform的是不是说我们可以用那个composite resource去用这个terraform的这个module来变相的支持这个像国内的这个云场上好 谢谢谢谢这个刚才你有两个问题首先第一个问题我想说的是说我的印象当中在因为crosspan的这个provider在这个社区里面其实是一个非常活跃的这样的一个领域然后国内国外的一些这种开发者应该都在里边然后我记得也是会有些国内的一些并且的话它是open就是对所有的这些开发者都是open的所以如果说任何人如果有兴趣的话其实都可以在里面去参与然后去开发自己的像我本人其实有一个provider是ansible的其实也是personally去放到里面去然后现在也在 marketplace里面能够看到这个其实是open to everyone不一定是限定在某个这个就是厂商来提供对然后你刚才说那个terraform的话实际上在那个crosspan里面其实它是有一个就是for terraform的这样的provider的我的理解就是说你如果说prefercrosspan这种方式的话其实完全可以用crosspanpreercrosspan这种方式去做而且它可以适配很多的这种就是外部这种服务以及这些tooling所以不一定要去做一些很就是绕的这种方式对希望能回答您的问题喂Santa我第一个问题就是说crosspan它做这么多proider的就设施的pro-waying但是我觉得可能像微服一样它有血量观测性我们有没有工具可以说看到说我所有的就设施的比如我的就设施有那些位置然后它的健康状况然后它的甚至比如它的费用做过一个全球了解这是第一个问题第二个问题就是说这个小问题第二个问题是比如经常有时候我们去AWS去创建一个什么东西删除之后发现会有一点小坑你的资源它故意让你也不是故意吧就是有可能删不了然后你就发现过几天之后它就又费用就这个crossplan我不知道删除一个资源之后会不会有可能在云城然后或者什么地方有遗留的一些潜带的一些东西会导致你产生费用我觉得我简单回答你第二个问题就是我觉得今天我们看到那个像usage API这个其实就是一个很好的一个方式来去帮助你去解决你说的那种offend或者dangling这种resource就是我声明的比如说我去创建个集群我在KBS上AWS上创建个集群其实我可能还有一些资源是帮我潜在它帮我创建的但是我删的时候还要用我眼睛潜去删我说这种情况并不是说我自己定义出来了你只要定义出来我肯定会删的是这样的就是我觉得这里面就是没有银弹no magic然后如果你了解它的这些依赖关系的话那么实际上在crosspan这个层面我的理解它能做到的就是说刚才那个我没有演示就是它可以就是你删那个claim的时候那么crosspan只要你告诉它这个dependency的话那么它会帮你去安序地去把这个做一个清理所以这个可能是一定程度地来解决你的那个问题然后你刚才提的那个第一个问题是吧是关于那个可观测性是吧那个Victor我觉得你是最好的回答这个问题对了这个问题是关于 whether or not a crosspan可以帮助一些可观测性可能在未来的可观测性因为所以一点点英语好所以刚才那个Microsoft application你需要一些可观测性在你的标准然后可观测性可观测性I'm usingHow many clusterin different regionsandthe healthy statusandeven the costso I want to knowI want to have a last touch boardI can'tmanage thethe potential problemmaybe the financialsomething like thatSoI will also answer it in a slightly more generic waybecause I think it's importantone of the big advantagesof crossplaneis that it iscovenetist nativeand what thatreally meansis thatcrossplane itselfas a projectdoes not need tobuild the toolingfor everythingfor observabilityfor loggingfor this or thatright orsynchronizationrighteverything thatis built forcovenetistshould work wellwith anything elsemeaningyou mentionedobservabilitythere is acubestate matrixa projectthat works wellwithprometheusthat getsevents fromyour resourcesincovenetistclustercrossplaneevents alreadycontainedprobably mostyeahexactlybut thatavailabilityavailabilityof yourinfrastructureisconstantlystoredand updatedinthe statusfieldsof yourso all those thingsareavailable asstatusesin specificresourcesyou can getthosestatusesput them inprometheusdatadogwhateverandthen dowhateveryou wantto dowith themI don't knowpromeqlcountthis or thatthat hasthis valueput it in agraph and allthose thingsrightand thesame thing appliesso theshort answer isyesisyeahso data is thereit's up to youto getthat dataand put it whereveryou would put itand you would getthat datasimilarlyit's a similar thinglike for exampleif you wouldlike toknow thestatusesof yourpodsrightyou wouldget thestatusestruefalsewhateverspecificallyare you going to askme for moneyI don't have thatthanks Victorbecause Iwatch a couplevideos onyoutubesoand I dounderstandyou promotingcrossplaying heavilyandcorrectyeah correctthere wasa couple of us came fromAustraliawe do run our owncloudfor theacademic in Australiasothisrightthis momentwe are decidingwhetherwe're going tousecluster apiorcrossplayingthanks forthe demothis morningandbyattendingthis sessionherewe kind ofaremoreleaningpowardscluster apithe veryverydecisionwe aremakingyouunderstandandmost of the userthey arefamiliar withthe normalcoispecary withteriformorso-calledopen codeand thenthey willbuild theclusterand werunathing calledmagnumbecause werun onopen stacksolooks likefrom ourforcrossplayingthe userobviously needssnowcobernatebefore himthat is thekind ofslightly disadvantageI guessin both casessomebody needsto knowcobernatein bothin case ofcluster apiand crossplayingwhensomething runsin cobernatesomebody needsto knowabout cobernatethat somebodydoes not needto bethe end userand thenyou're goingto havetea or coffeerightthe rest isscandled bythe systemmargo cdsoflux or whateveryou're usingrightso I don'tthink thatthat's aproblemand I'mnot goingto tell youwhat isbetter thanversebecause Inevercomparethings kindofandthe otherone isnotandboth caseshavegood andbad sidesrightwithcluster apiyou havea productionready clusterlike thisrightwithcrossplayingyou needtoinvest timethe end resultsothepositivethingaboutcluster apiisactuallywhat you needyou're in troublerightnowit all dependsreally it'sit's a question ofI would sayI'm going to ignorenotcrossplayingand cluster apiif avendoropinionitysolutionworks for youuse thatalwaysit's alwaysbetterto sayI don't knowthis vendoroffers methisI click a buttonit's outthe alternative solutionsare goodwhen that does not workfor yourightlike crossplayingif cluster apidoes not dowhat you needto docrossplaying is a good optionif cluster apiis creating clustersthe way you wantthemgo for cluster apiyou'll come tocrossplayingfor something elsebecause itmanages other stuffso it's no problemat allthe challenge we haveis actuallybecause as I mentionedbeforecluster apiis theacademicsothey actuallyhave tocustomize their kernelsand aswell aswe have toruncustomize theGPU codeetc.sotheclusterthe nodehas averyspecificconfigurationthat iswherewe kindof hesitateuse thecluster apiis becauseuse itand thenuse the case as wellthat iswhere ourchallenge you arecrossplaying requiresworkbut it allowsyou to doexactly what you wantif what youwant is alreadyprovided by somebody elsecluster apiplease use itdon't go forcrossplayingis thisrecording?I might nothave a jobafter theshangaibut yeahthat's theshort projectIwhat I'mreally keentotell people is thatI think that weshould be movingtowardsmanagingwhatever it'swe are managingthrough Kubernetes apito me that'sthe most important thingright becauseit offersbenefits that wedon't have without itnow whetherwhat youmanage through Kubernetes apiclustercluster apiorcrossplayingorI don't knowwhat elsecavernoorthis or thatvery good