list-watch,作為k8s系統中統一的異步消息傳遞方式,對系統的性能、數據一致性起到關鍵性的作用。
list-watch操作需要做這么幾件事:
- 由組件向apiserver而不是etcd發起watch請求,在組件啟動時就進行訂閱,告訴apiserver需要知道什么數據發生變化。Watch是一個典型的發布-訂閱模式。
- 組件向apiserver發起的watch請求是可以帶條件的,例如,scheduler想要watch的是所有未被調度的Pod,也就是滿足Pod.destNode=""的Pod來進行調度操作;而kubelet只關心自己節點上的Pod列表。apiserver向etcd發起的watch是沒有條件的,只能知道某個數據發生了變化或創建、刪除,但不能過濾具體的值。也就是說對象數據的條件過濾必須在apiserver端而不是etcd端完成。
- list是watch失敗,數據太過陳舊后的彌補手段,這方面詳見 基於list-watch的Kubernetes異步事件處理框架詳解-客戶端部分。list本身是一個簡單的列表操作,和其它apiserver的增刪改操作一樣,不再多描述細節。
