Hello 大家好欢迎大家来听这次的演示我们演示的主题是Sake InstrumentationIntral Deep Dive and Recent Development就是instrumentation这个Sake的深入探讨以及最近的发展然后这次演讲人是我刘孟娇的旁边这位十碗书然后这是关于我们然后我是刘孟娇来自Doclode然后一直工作在对KBUS的贡献方向是Sake Instrumentation和文档方向现在是Sake Instrumentation的神乐者以及Sake Dolls的神乐者和中文本地画的Owner下面是我的BitHub地址和Twitter大家有问题的话可以直接通过这两种方式找到我然后旁边是我的CodeSpeaker十碗书这是我们的一题主要分为这四个部分第一部分我会介绍一下Sake Instrumentation是什么第二部分是它包含的子项目第三部分是它最近的发展以及第四部分是怎么样去贡献以及怎么参与什么是Sake InstrumentationSake Instrumentation在中文翻译上Instrumentation不太好用中文翻译然后在翻译程仪器一表是不太准确的用一个词它可能就是用检测或者说是检测一个集群的状态的变化的一系列的工具都可以称为Sake Instrumentation这个Sake的范畴是包含日治 事件Mitrace以及追踪都在Sake Instrumentation的范畴内它包含的子项目是Cubos States Mitrex K-LogMitrex ServerCubos States Mitrex Collector有很多然后下面的章节我们也会介绍它的一些子项目How do we do it?我们怎么来运行或者维护这个子项目的主要我们平常的工作是分类和修复相关的Instrumentation的一些如果你发生了一些问题就是关于日治指标或者事件的然后在K8S的一锈上提出你的问题然后我们发现了这个提出的问题之后会进行相应的修复然后这个是Sake Instrumentation属于Sake Instrumentation的一些一锈的链接可以点去看一下然后还有一些PR第二部分是审约提出的代码关于Mitrex Log Events and Trace第三部分是开发新的功能然后开发功能的流程是在都遵循K8S的KEP的流程第四部分是维护和支持子项目因为Sake Instrumentation刚才我们也提到了它有非常多的子项目所以维护这些子项目也是它的职责之一第五部分就是直到新的贡献者去参与新的贡献让这个Sake能够一直保持活力下面的话我会介绍一下Sake的子项目Sake的子项目因为有很多所以这里我们选了一些比较有重要的大家可能平常比较熟悉的一些项目来进行介绍主要有KLOG,Coup of States,Mitrex,Mitrex Server,Holomex,Use Adapter,UseMitrex Collector现在我们看到的是KLOGKLOG库的话如果是作为K8S的开发者或者是作为K8S集群的运萎者可能会比较熟悉一点因为平常我们排账我们都会用到日治来进行日治的排查KLOG库是Folk的GLOG因为K8S需要的日治库需要它自己定义的一些功能但是GLOG开发不是很积极所以他们Folk出来了KLOG来支持很多K8S需要的一些日治的功能在下面我们讲到的上下文日治以及结构话日治中使用的库就是KLOG库在后续的章节我们会让石碗书详细介绍一下相关的内容这个是库Bus States Mitrex库这个库我感觉大家应该会比较熟悉一些因为如果我们想要监测K8S内部的资源的话我们一般都会用到这个库Bus States Mitrex然后比如说我们要收集PoE的是否启动然后PoE的Deployment是否它的复本数有几个是否运营成功的话都会使用库Bus States Mitrex然后来暴露出来它的指标它暴露出来指标格式就是和普罗米修斯格式的可以跟我们普罗米修斯去抓取左侧是库Bus States Mitrex和K8S APS Solar以及普罗米修斯的一个交互基本上是上面一个流程库Bus States Mitrex会List WatchAPS Solar当发现一些资源发生状态改变的时候它会进行相应的计算然后普罗米修斯可以从中抓取它暴露出来的接口就是我们平常的高Metrex这个APS这是它的视力基本上如果你访问8080-Metrex接口你可以看到下面的视力是符合普罗米修斯格式的Metrex SolarMetrex Solar主要是用于自动扩展自动扩展用的然后它主要的服务对象是Cuba Control Top和HPA以及VPAHPA就是水平扩展VPA就是垂直扩展然后因为平常如果我们想要看比如说一个POD或者Note它使用了多少CPU和内存排第一的是谁谁就是用的资源非常的多然后导致集群或者是Note的节点非常的资源不足导致什么问题的时候我们可以用Cuba Control Top来进行看一下的时候我们如果你没有安装Metrex Solar那么这时候APS Solar会给你发挥一条日日告诉你需要安装Metrex Solar如果你安装了已经安装了它那么它就会将Metrex这个API重调度到Metrex Solar它的应用中KBS APS Solar本身是不实现具体的逻辑的然后Metrex Solar它会使用Metrex Gaunt Results这个and the pointer去从Cuba Light去调用你去调用就是比如说CPU和内存的一些数据然后在它本身去进行存储OK下面这个是Prolomix AdapterProlomix Adapter其实和Metrex Solar有一定的相似之处但它俩的不同可能是Metrex Solar主要集中的是CPU和内存这两个指标如果你想要自定义更多的指标就是可能你自己的应用需要的是其他的指标的话那么Metrex Solar就不能满足这个需要了那我们可以使用Prolomix Adapter进行一个自定义我们可以看到从这个价格图上可以看到它跟Metrex Solar的区别就是相当于是它在Prolomix修斯中间加了一个Adapter做了一个Cuba Saps Solar和Prolomix修斯之间的一个适配器Prolomix修斯可以从各种各样的途径获得从Po的Node获得指标之后然后可以供可以把Prolomix修斯Adapter进行数据转化之后然后再供Aps Solar来使用USH Metrex Collector这个仓库是今年新加的这是它的仓库地址现在它也是处于在开发之中它主要的是计算一些计算量比较高的一些数据比如说P95P50P99这种的因为它的计算量比较高它可以在这个数据库这个应用本身进行计算然后根据计算出来的结果在定期的推送到推送到Prolomix修斯从从这个视力图我们可以看一下就是它还有一个优点就是我们平常如果使用过Prolomix修斯的人都知道Prolomix修斯QL其实是对初学者来讲是我感觉是稍微有一点点难入门的然后它的各种各种的方程式还是比较难记的如果这个库的话就你只需要修改一些压某然后它就会相当给你计算就不用你增加你学习Prolomix修斯ProlomixQL的成本然后它的输出结果我们也可以看到就是也是遵循Prolomix修斯的这个格式的它会进行各种的组合来计算然后Metrex这部分的话子项目的库就结束完毕了然后下一部分是最近的发展这一部分最近的发展的话我们就是分为基本上分为三大部分吧Metrex日治以及追踪Metrex这部分由我来介绍一下Metrex Stability也就是指标的稳定性如果我们作为一个K8S集讯管理员可能会遇到一个问题就是K8S有很多组件然后每个组件又有很多的指标但是在之前我们是没有一个地方能够查询到它有哪些指标的只能够是比如说你运行了一个K8S集讯然后你去实际的访问它的端口然后访问它的GalMetrex的端口然后去看一下是否有这个指标当它还有一个问题就是如果说开发者觉得之前的指标从名称有问题或者需要添加新的Label的情况下可能会去修改这个指标的指标的名称以及Label但这时候作为下游的使用者可能就会觉得我发现不了我之前使用的指标了然后造成了图物的中断或者什么的就会很麻烦之前是没有这样一个机制来保证的所以就是为了应对上面我提出的两个问题遇到的两个问题所以就是出现了这个Initial Maintenance提出了这个扩展Metrex稳定性的这样一个功能也就是说我们会把会扩展Metrex的稳定性让它基本上也遵循一个升级的流程就是RF2 BetaStable让开发者和使用者都能够意识到这个指标到底属于什么样的级别对它的信任级别有多少然后还有就是增加了一个自动生存的文档在每次版本发布之后都会生成新的对应的版本的Metrex参考文档然后在K8的光可以看到稍后我们可以看一下它是什么样的然后它现在的这个增强功能的状态是它是1.26被引入的然后1.27进入Beta1.28的话就达到了Stable的状态也就是这个还是推进的比较快的一个然后现在的话我们看一下它具体的稳定性氛围的级别它氛围四类级别Internal和Alpha基本上可以算同一级别的然后之后是Beta和StableInternal和Alpha的区别主要就是Internal主要是用来说明一些不太好形容的不符合特性功能的那种状态的这样一个指标但是其实这部分指标在K8S的那个代码里面其实是很少的只有CII的一个指标反正就是为了让为了有一些指标不好形容的就加到这个Internal但是实际上是很少使用的然后基本上都是如果你新加了一个Metrex的话基本上就是Alpha级别Alpha级别的话它没有任何的稳定性保障就是K8S可以随时的删除以及废弃Metrex但是这个也是可以在Metrex的参考文档中找到的但是Internal是不会在K8S官网可以查寻不到Beta的话是有一定性的稳定性保障如果你需要你需要一个发布的时间段或者更多的时间段让用户能够知道这个事情它会有一个前向兼容性就是这个Level你可以只能添加Level你不能移除它然后它也会包含在Metrex Reference文档里然后下一个级别就是经过了比如说一两个版本的迭代我们发现这个指标已经非常稳定了那么我把它升级为Stable它有这个稳定性的保障它会遵循一个弃用的策略如果你想要弃用它你必须要经过12个月或者3个发布版本的时间才能够移除它而且在它的弃用期间或者说它的稳定性的期间你是不可能不可以改变它的Level也不可以改变它的名称的Alpha, Beta, and Stable现在都可以在KBS官网里查询这是一个截图关于KBS官网就是Metrex Reference参考的一个截图就是在上面你可以看到它的级别类型Level以及它的简短的描述Metrex的部分基本上到这下面的是Logs and Trace的部分然后有我的Cosmica试完书来进行介绍所以我会谈谈我们怎么做以及我们现在的设计程序如果我们谈谈未来的观众这不是人们的体系这就是自己的技术如果有什么错这是我们需要的设计程序所以我们可以谈谈LogsEvent Stresses然后有设计程序所以我们知道是否有错的所以我们的努力在设计程序是让Logs更加合适基本上发展Logs自己的技术在设计程序就在Logs自己的技术在设计程序在设计程序by introducing new K-LOG methodsthat could generate structured logs in KubernetesSo in upstream Kubernetes codewe use K-LOG as logging librarySo we made some changes thereso that we can have structured and contextual logssimplifying ingestion of logsso when if you are managing your Kubernetes on your ownthen ingestion of kubelet, kubepair server, kubeproxy logs is a taskso how we can make the ingestionso that's where we introduce json formatso non-goals where we are not changing the legacy logging libraryin Kubernetes K-LOGwe have made some enhancement thereso that we can have the structured and contextual logsso this is how it looks likeso we have a message and a key value pairso that you can parse the logsyou don't have to parse on your ownby using a parser it's just a structured logso you can filter out bases on attributeswhat resource it is and everythingthat comes in the structured formatimplementation details around the structured logging involvesthe log message structuredefining the log message structure itselfreferencing two different Kubernetes objectsintroducing the json formatand logging configurationthe performance how it is impacting the overall performance of Kubernetesat scaleand what are the migration detailsthat upstream Kubernetes contributor needs to take care ofwhen they are writing new codeor maybe making changes in the legacy codeso to give an examplethis is howyou can reference a Kubernetes K objectso you don't have towrite the name of thecubinities object itselfyou can just use thelibraries that we have created inside klogso that you can referencecubinities native objectsjust like thisso for exampleifyou are logging cube dnsyou just have to parsethe cube dns referencein the k object referenceand it would give you the name spaced object in this waysimilarly if theobject is non name spacedit would give the complete namefor example in the cluster it's given hereand the output fornamespace and namespace would be something like thisand if we try to take a look at the complete log messageit would be key value pairswhich you canif you are looking a log collectionlog collection agentyou can filter based on of the key value pairsand you can embedcustom keysso for exampleif you are writing a custom controlleror you are extending Kubernetesyou can haveyour own structand you can embed the destruct in thestructured logso this is how a requestcan be embedded insidethe structuredkeylog objectand essentiallyin the info sand all the otherloggingfunction that is availablesoto enablestructured loggingand contextual loggingyou just have to configure logging formatby default it's text basedso if you are upgradingcubinities to1.24and onwardsthere is no changeonly thing thatwill bring the changesconfiguring thislogging formatflagand if you put that to jsonit will give you a structured andconnected logsthis is some basicperformance that we didin wgstructured loggingso info simplementation takesis around 9% slowerthan the text basedimplementationwhich is I think acceptablegiven the advantageof using a logcollection agenton top of itand the cpu performanceisoverallit takes2% of the overall cputhat is allocatedtocubinitiesloggingso that is alsoan acceptable matrixin terms ofconsumptionswe went GAin 1.27and we introducedthe structuredlogging first timein 1.19as alphaand most of the componentshave been migratedtodayand the remainingcomponentsaregetting migratedto contextuallogging directlyand let'salso talka little bitabout contextualloggingso the ideais toif thegiven codeishave a structurein whichevery leavesis differentin a waybutif you wantcorrelation betweenthe mainand the child threadsand you want correlationbetween the child threadsyou may wantto havecontextualloggingimplementationtherein that wayyou cancorrelatethecurrenthow therequest isgetting spansarounddifferent methodsfrom the parentto the childand thenthe subsequentchildso this is howyou haveto remainthe contextfrom the mainthreadto the childthreadsthis isand that'swhere thecontextualloggingis importantso the waywe do itwepass theparent contextto the childand thenthe subsequent childso thateveryleafnodehasitsowncontextso whiledebuggingyoucancorrelatewhichparticularthreadit'scomingfromwe madesome changesinthekiloglibraryitselfso thatit'seasiertoforfordevelopersto usethe existinglibrariesweintroducedfromcontextbackgroundandto doso thatyou cancreatenewcontextoruseparentcontextso this ishowafromcontextlooklikesitcantakethecontextfromtheparentbackgroundcangiveyouanewcontextforififit'sparentandyesso thisishowyoucanattachallthecontextforcontextureloggingweintroduceit'sand againonedottwofourasalphaandwewentbetainonedottwoateandcubecontrollermanagercubeshutterareother components are being convertedso if you are a contributorpleasefeel free to open up herefor traceswe have introducedAPS server tracingand cubelet tracingand they are bothbeta inone dottwosevensoif you can have tracingin a yeager formator you can also configureit to emit as logsso this isthe formatoutput when itwhen you emit the tracinginformation in logsand this is howcubeAPS servertracing would look likeso you can see thetransition happeningfrom the APS serverand thenthe span isspend aroundatcdfromand the totalduration it tookand the duration it tookin theatcdwe have a demoforAPS server tracingwe will come to thatsowe have added supportforAPS server tracingand cubelet tracingand this is importantso thatso for exampleif you are runningcubenitiesat a scaleandfor some reasonyour applicationisresponsesgetting slowsobut you don't knowif this isactualthe applicationproblemorcubeAPS serveris gettingthrottleandthe problemis atcubeAPS serverso if you havetracing informationavailable atcubeAPS serverand you havetracing informationavailable foryour applicationyou canfigure outif it'sthe infrastructureproblemor applicationproblemso I would liketogive youa demoaround thissoyou know喂啊嗯上面那個那個十萬數十萬數是講了一下那個APSAPSAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPScubeAPS怎麼在k8s裡面就是這個是怎麼一個流程ok就是k8sk8stestintincreation這個測試裡面是有測試怎麼去調度這個調度APItracing的在它的交互測試裡面我們可以看到兩個文件一個是tracing testgo和那個ETCDgo我們我們需要修改一下這個這兩個文件嗯就是我們需要修改的一航在這個地方就是它的endpoint因為我們需要有一個接收這個因為等於我們的demo是需要把數據發送到yagerUI上所以就是我們把這個它的地址改成我們本地的4317這個地址然後在ETCD的話我們需要改的是ETCD的話追蹤還不是它的那個默認的功能所以需要加一個你加這三個flex去讓它ETCD來啟用追蹤相當於是在本地測試一下我們需要在本地就是你可以用dalker啟動一下那個yager因為我已經安裝過了所以就是所以的話已經運行的本地了我可以給大家看一下我的那個需要安裝的那個YAMO的文檔大家如果想要去安裝一下yager的話可以直接去它的那個官網然後它會給你直接有一個安裝的YAMO然後現在的話大家直接可以看一下它就是用dalker運行了一個yager然後一些一些flag的一些一些環境變量的聲明基本上就可以了暴露的端口如果你安裝yager安裝成功的話你會在你的本地的16686這個接口上看到一個這種UI現在的話我們已經修改了就是K8SK8S的一個測試的文件現在的話我們只需要去運行一下它就可以了我們需要大概等一分鐘不到一分鐘然後讓它就是輸出一下一個運行結果基本上我們如果等會運行命令成功的話它看到的就是剛才十萬數上面兩張ppt演講就是展示的那張圖然後它整個是服務數據從數據從APS-O到達ETCD的這個一個追蹤的一個圖現在我們已經能看到日治了然後現在我們再到這個UI上來看一下它的OK我們可以把這個時間確定一下最近五分鐘的比如說以這個這個為例吧基本上它就是這個樣子的一個流程圖如果假如說你的應用出現了一個非常阻塞的問題然後它的這個時間啊什麼的就會可以讓你有一個直觀的展示出來你哪一個鏈路出了問題API Tracing這個功能還是在不斷的因為剛才我們也能看的在1.2的時候它只有幾個SPAN以及就是加的不是很多在1.26的時候已經新加了很多現在它還在不斷的發展在其他的組件在以後也會加上API Tracing加上那個Tracing的功能演示的話基本上是這樣大家可以就是如果如果作為開發者有興趣的話可以自己去試一下好的最後一部分是我們的Guide Invoid就是怎麼去參與怎麼去參與K8S的貢獻以及怎麼去參與Seg Intrubmentation這個貢獻你可以就是加入我們的Seg Intrubmentation這個Slike然後如果有任何問題可以在上面進行回答第二個就是可以參與我們的周會它的周會時間對於對於我們對於中國可能不是特別的早就是它可能是晚上12點但是它是它是每周都有一個會議但是它是輪著的一周是那個Seg的會議如果你有任何的建議或者想討論的可以寫在文檔上進行討論然後第二周是那個Track會就是會看一下是否有一些依秀或者PR需要去reveal需要去解決的然後會進行在這會議上會進行一個討論以及分配還可以訂閱我們的郵件組列表以及參與審閱依秀以及文檔最後的話就是如果你想要參與Seg implementation的一些功能的話可以就是點擊這個鏈接看一下它現在有哪些功能以及未來會做哪些功能都可以進行參與和參與就是還有最後一點就我講的是我們就是非常非常歡迎有更多的貢獻者來為Seg implementation做出貢獻而且如果你想要去貢獻做一個開發者的話我覺得Seg implementation也是一個非常好的開始因為它是跨越所有的KPA-S的組件和Seg的因為每個組件都需要日治追蹤和事件所以你可以通過日治通過Seg implementation作為你出事的起點然後再去深入瞭解其他組件而且我做其他的審閱者和Menten也是非常熱情地去歡迎大家去來加入我們OK基本上我們的演講就到所謂到此結束了然後大家有什麼問題嗎Thank you everyoneThank you for comingYeah, thank you for sharing說中文吧Can I speak Chinese?Yeah就是我如果想加一個指標的話就比如那個村市裡面我想加一個指標的話我應該怎麼做呢你加一個指標的因為那個KPA-S相當於它有一個Stage下面的有一個Mitrex就是它那個目錄下相當於有一個指標庫然後你可以直接遵循這個規範直接加就可以了當然是直接註冊一下就跟你使用自己就是你如果單獨的一個組件註冊到普羅米修的基本上沒有什麼太大的差別就是已經提供了一個庫然後你直接可以參考實力就可以添加進去但是你要遵循就比如我們剛才講的那個Mitrex的規範然後比如說就是它是什麼級別它的描述什麼的就遵循一下規範就可以了就基本上一致的OK OK OKAny more questions?And be useful other projectsin CSF or any otherYeah, so KLOG is made on top of SLOGLibertySo it's kind of enhanced SLOGdesigned for KubernetesSo I think I would say it's designed for KubernetesBut if anything which is kind of very correlatedwith Kubernetes and its componentsIt can be used for them as well如果大家沒有其他問題的話那我們的演講就結束了謝謝大家