# kubebuilder(2)-原理

導(dǎo)讀:上一篇blog主要是簡(jiǎn)單介紹了一下kubebuilder的使用,這里再分析一下kubebuilder的代碼邏輯娄徊。

1.kubebuilder的基礎(chǔ):controller

首先介紹一下k8s的一個(gè)controller的邏輯考余,下圖主要參考client-go給的一個(gè)workQueue的例子

controller

這里我把代碼分為通用的Common partSpecial Part。前者是client-go的基本流程,而后者部分是controller自身邏輯部分蔽午。具體過(guò)程包含8個(gè)步驟:

1.Reflector通過(guò)ListAndWatch方法去監(jiān)聽指定的Object;

func (r *Reflector) Run(stopCh <-chan struct{}) {
    klog.V(3).Infof("Starting reflector %v (%s) from %s", r.expectedTypeName, r.resyncPeriod, r.name)
    wait.Until(func() {
        if err := r.ListAndWatch(stopCh); err != nil {
            utilruntime.HandleError(err)
        }
    }, r.period, stopCh)
}

2.Reflector會(huì)將所監(jiān)聽到的event酬蹋,包括對(duì)object的Add及老,UpdateDelete的操作push到DeltaFIFO這個(gè)queue中范抓;
3.Informer首先會(huì)解析event中的action和object骄恶;
4.Informer將解析的object更新到local store,也就是本地cache中的數(shù)據(jù)更新匕垫;
5.然后Informer會(huì)執(zhí)行Controller在初始化Infromer時(shí)注冊(cè)的ResourceEventHandler(這些callback是可以自己修改的)僧鲁;
6.ResourceEventHandler中注冊(cè)的callback會(huì)將對(duì)應(yīng)變化的object的key存入其初始化的一個(gè)workQueue;
7.最終controller會(huì)循環(huán)進(jìn)行reconcile象泵,就是從workQueue不停地pop key寞秃,然后去local store中取到對(duì)應(yīng)的object,然后進(jìn)行處理单芜,最終多數(shù)情況會(huì)再通過(guò)client去更新這個(gè)object蜕该。

上面這個(gè)具體過(guò)程,我看網(wǎng)上大佬們也都分析過(guò)很多次了洲鸠,但是根據(jù)我的經(jīng)驗(yàn)?zāi)靥玫€是需要去看一遍代碼心里才有底。以后出問(wèn)題或者二次開發(fā)的時(shí)候扒腕,都是需要知道重要的結(jié)構(gòu)體和API的绢淀。

2.kubebuilder的封裝

想說(shuō)明一下kubebuilder實(shí)際上是提供了對(duì)client-go進(jìn)行封裝的library(準(zhǔn)確來(lái)說(shuō)是runtime-controller),更加便利我們來(lái)開發(fā)k8s的operator瘾腰。

我上面提到的workQueue的例子已經(jīng)實(shí)現(xiàn)了一個(gè)controller的邏輯皆的。而kubebuilder還幫我們做了以下的額外工作:

  1. kubebuilder引入了manager這個(gè)概念,一個(gè)manager可以管理多個(gè)controller蹋盆,而這些controller會(huì)共享manager的client费薄;
  2. 如果manager掛掉或者停止了硝全,所有的controller也會(huì)隨之停止;
  3. kubebuilder使用一個(gè)map[GroupVersionKind]informer來(lái)管理這些controller楞抡,所以每個(gè)controller還是擁有其獨(dú)立的workQueue伟众,deltaFIFO,并且kubebuilder也已經(jīng)幫我們實(shí)現(xiàn)了這部分代碼召廷;
  4. 我們主要需要做的開發(fā)凳厢,就是寫Reconcile中的邏輯。

1.Manager通過(guò)map[GroupVersionKind]informer啟動(dòng)所有controller:

func (ip *specificInformersMap) Start(stop <-chan struct{}) {
...
        for _, informer := range ip.informersByGVK {
            go informer.Informer.Run(stop)
        }
...
    <-stop
}

2.Controller處理event的邏輯都在https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/internal/controller/controller.go這個(gè)文件里面竞慢,其實(shí)它就是實(shí)現(xiàn)了workqueue這個(gè)例子的大部分代碼先紫,推薦先看懂這個(gè)例子再來(lái)分析這個(gè)文件。

3.小結(jié)

寫這篇blog本來(lái)想講一下kubebuilder的代碼流程的筹煮,但是發(fā)現(xiàn)要理解kubebuilder必須先理解client-go遮精,基本上client-go代碼熟悉之后再來(lái)分析kubebuilder就easy了...我自己太笨了,花了很多時(shí)間去啃client-go寺谤,假期余額緊張仑鸥,所以關(guān)于kubebuilder自身的分析就沒(méi)寫太多了吮播,有時(shí)間再補(bǔ)充吧变屁。網(wǎng)上有一篇關(guān)于kubebuilder的分析,有興趣的同學(xué)可以參考一下吧意狠,但是我覺得做二次開發(fā)一定要看自己親自看和分析一遍粟关。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市环戈,隨后出現(xiàn)的幾起案子闷板,更是在濱河造成了極大的恐慌,老刑警劉巖院塞,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遮晚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拦止,警方通過(guò)查閱死者的電腦和手機(jī)县遣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)汹族,“玉大人萧求,你說(shuō)我怎么就攤上這事《ヂ鳎” “怎么了夸政?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)榴徐。 經(jīng)常有香客問(wèn)我守问,道長(zhǎng)匀归,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任耗帕,我火速辦了婚禮朋譬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兴垦。我一直安慰自己徙赢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布探越。 她就那樣靜靜地躺著狡赐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钦幔。 梳的紋絲不亂的頭發(fā)上枕屉,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音鲤氢,去河邊找鬼搀擂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卷玉,可吹牛的內(nèi)容都是我干的哨颂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼相种,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼威恼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寝并,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箫措,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后衬潦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斤蔓,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年镀岛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弦牡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哎媚,死狀恐怖喇伯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拨与,我是刑警寧澤稻据,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響捻悯,放射性物質(zhì)發(fā)生泄漏匆赃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一今缚、第九天 我趴在偏房一處隱蔽的房頂上張望算柳。 院中可真熱鬧,春花似錦姓言、人聲如沸瞬项。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)囱淋。三九已至,卻和暖如春餐塘,著一層夾襖步出監(jiān)牢的瞬間妥衣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工戒傻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留税手,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓需纳,卻偏偏與公主長(zhǎng)得像芦倒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子候齿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容