1. 程式人生 > >kubernetes1.9原始碼閱讀 kubernetes的watch包_Kubernetes中文社群

kubernetes1.9原始碼閱讀 kubernetes的watch包_Kubernetes中文社群

要理解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所接收到的所有的事件;