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所接收到的所有的事件;
相關閱讀:
- RainMans love - CSDN博客
推薦閱讀:
※聊聊調度框架,K8S、Mesos、Swarm 一個都不能少
※Coding-Job:從研發到生產的容器化融合實踐
※Kubernetes v1.7新特性解析-CustomResourceDefinition
※Kubernetes v1.7新特性解析-本地數據卷
※Kubernetes漏洞搞垮了應用程序!癱瘓 1 個小時
TAG:Kubernetes |