k8s之kubebuilder简单理解
kubebuilder流程
1、創(chuàng)建manager,ctrl.NewManager,包括設(shè)置 shemme和端口、選主信息等配置、NewCluster(用來訪問k8s,主要包括newCache和New讀寫client)、newEventRecorder。
1.1、newCache包括創(chuàng)建informerMap,分為structured、unstructured與metadata,其實(shí)最終都是調(diào)用newSpecificInformersMap,在newSpecificInformersMap中通過createListWatcher來NewListWatch對(duì)象,通過informersByGVK來記錄schema中每個(gè)GVK對(duì)象與informer的對(duì)應(yīng)關(guān)系,使用時(shí)可根據(jù)GVK得到informer再去得到litser和watcher對(duì)象。
1.2、newClient包括newApiReader和newWriteObj,apiReader直接從apiserver讀寫對(duì)象,writeObj實(shí)現(xiàn)了讀寫分離的Client,寫直接寫apiserver,讀先讀cache讀不到則通過clientset。
2、創(chuàng)建builder(controller),controller.SetupWithManager主要包括 設(shè)置配置、doController來創(chuàng)建controller、doWatch來設(shè)置需要監(jiān)聽的資源,對(duì)于監(jiān)聽資源會(huì)在informer上添加回調(diào)函數(shù)進(jìn)行filter。
2.1、doController調(diào)用controller.New來創(chuàng)建controller并添加到manager;
2.2、doWatch主要watch當(dāng)前資源,包括forInput,ownsInput(owner為當(dāng)前資源),以及watchsInput,最后調(diào)用ctrl.Watch來注冊(cè),且watch的是localStore,并且watch是加鎖的,防止并發(fā)問題。
3、啟動(dòng)manager,啟動(dòng)監(jiān)控服務(wù)、啟動(dòng)健康檢查服務(wù)、啟動(dòng)非選主服務(wù)、啟動(dòng)選主服務(wù)
3.1、對(duì)于非選主服務(wù)webhook主要包括 等待cache同步,啟動(dòng)n個(gè)worker,每個(gè)Worker不斷從workerQueue的req數(shù)據(jù),之后調(diào)用c.Do.Reconcile來調(diào)諧處理取到的req對(duì)象。
3.2、對(duì)于選主服務(wù)controller,最前邊加了一步 加入到選主服務(wù)隊(duì)列,其他的和webhook完全相同。(若開啟多節(jié)點(diǎn)競(jìng)爭(zhēng)選主服務(wù)則只有主節(jié)點(diǎn)會(huì)啟動(dòng)控制器執(zhí)行reconcile,而從節(jié)點(diǎn)只是用于實(shí)現(xiàn)高可用,并會(huì)不斷競(jìng)爭(zhēng)選主,關(guān)閉選主服務(wù)則誰先啟動(dòng)誰一直占據(jù)主節(jié)點(diǎn))
controller配置選項(xiàng):
Owns:監(jiān)聽dengployment且該deployment的Owner是當(dāng)前資源,deployment發(fā)生變化則將當(dāng)前資源owner重新入隊(duì)workqueue。使用全局的eventfilter+own的predicates;
For:監(jiān)聽owner當(dāng)前資源,使用全局eventfilter;
Watches:監(jiān)聽dengployment,使用全局的eventfilter+watches自己實(shí)現(xiàn)的入隊(duì)器EventHandler,設(shè)置該資源的獨(dú)有的事件監(jiān)聽規(guī)則,并能夠自定義入隊(duì)的資源類型;
EventFilter:變更過濾器,是添加在informer的回調(diào)函數(shù),可以針對(duì)watch的所有資源統(tǒng)一地設(shè)置事件監(jiān)聽規(guī)則;
Options:worker數(shù)量、ratelamiter等參數(shù)設(shè)置;
最佳實(shí)踐:
1、不應(yīng)該在一個(gè)reconciler邏輯中進(jìn)行兩次資源的update(update status除外),否則會(huì)引發(fā)版本不一致的報(bào)錯(cuò)。
總結(jié)
以上是生活随笔為你收集整理的k8s之kubebuilder简单理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang之pprof使用
- 下一篇: 41款常用APP被爆过度索取权限、数据共