標籤:

kubernetes1.9源碼閱讀 kubernetes的watch包

要理解kubernetes的list-watch機制,首先應該熟悉理解kubernetes的watch包中的各種實現以及原理。這篇文章將從代碼實現看看kubernetes的watch包實現。從kubernetes1.6之後,kubernetes的watch包抽取到了apimachinery這個項目下。

watch包文件說明

watch包主要包含5個文件:watch.go,mux.go,filter.go,streamwatch.go,util.go。下面是對這五個文件作簡單的說明:

1. watch.go 主要是介面定義及對interface的三種實現的封裝。

2. mux.go 主要是事件廣播器。

3. filter.go 主要是對事件的過濾。

4. streamwatch.go 主要是對decoder介面實現的封裝。

5. util.go 主要是對滿足條件時間的過濾。

watch.go文件

watch.go定義了介面,k8s中說有的event事件統一都實現了interface介面,interface介面的定義如下:

1. Event結構體,主要包括:事件類型Type和事件發生的對象Object,k8s中所有的對象(比如:pod、service、rc、dp....)都是runtime.Object;

2. watch.Interface中主要有兩個方法:分別是對事件的監聽結果ResultChan()和停止監聽Stop()方法;

3. watch.go還包括對Interface的三種實現的封裝:emptyWatch、fakerWatch

、racefreeWatch,fakerWatch和racefreeWatch是線程安全的;

mux.go文件

mux.go文件中主要包括了事件廣播器Broadcaster和廣播器的觀察者broadcasterWatcher;

1. Broadcaster包括watchers,當創建一個Broadcaster時,Broadcaster會開一個協程接收所有的事件及發送事件到所有註冊的watcher。保證Broadcaster的所有的watcher一直都能不斷的接收到Broadcaster發送過來的事件;

2. broadcastWatcher實現了watch.Interface,包括:resultChan方法和stop方法;

3. 在kube-scheduler中,會創建record.NewBroadcaster(),發送event到logging函數,參見之前的文章:kubernetes1.8 kube-scheduler源碼閱讀

filter.go文件

filter.go文件也是主要對interface的的實現,加上了事件過濾的方法,這樣的話,就可以只watcher滿足一定條件的事件了;

同時,filter.go中的Recorder結構體,記錄watcher所接收到的所有的事件;

相關閱讀:

  1. RainMans love - CSDN博客

推薦閱讀:

聊聊調度框架,K8S、Mesos、Swarm 一個都不能少
Coding-Job:從研發到生產的容器化融合實踐
Kubernetes v1.7新特性解析-CustomResourceDefinition
Kubernetes v1.7新特性解析-本地數據卷
Kubernetes漏洞搞垮了應用程序!癱瘓 1 個小時

TAG:Kubernetes |