Kubernetes 1.23.6 版本中,API Server 的 **List-Watch 機制** 是集群狀態同步的核心機制,其設計目標是高效、實時地將資源變更通知到各組件(如 kubelet、controller-manager等)。以下是其詳細原理和工作機制:
1. 核心概念
- List:客戶端(如 kubelet)通過 `List()` 從 API Server 獲取資源的全量數據(首次同步或斷線重連時使用)。
- Watch:客戶端通過 `Watch()` 監聽資源的增量變更(如 Pod 創建、更新、刪除)。
- ResourceVersion:每個資源對象的版本號,由 etcd 的 MVCC 機制生成,用于標識數據的新舊狀態。
2. 工作機制
(1)List 階段(全量同步)
1. 客戶端發起 List 請求
???pods, err := client.CoreV1().Pods("").List(ctx, metav1.ListOptions{})
???-首次請求時,`ResourceVersion` 為 `0`,表示獲取最新數據。
???- API Server 從 **etcd** 查詢全量數據,并返回給客戶端。
2. 關鍵行為
???- API Server 可能從 **Watch 緩存** 返回數據(若緩存命中)。
???-客戶端記錄返回的 `ResourceVersion`,作為后續 Watch 的起始點。
(2)Watch 階段(增量監聽)
1. 客戶端發起 Watch 請求 ?
??????
???watcher, err := client.CoreV1().Pods("").Watch(ctx, metav1.ListOptions{
???????ResourceVersion: "12345", // 從 List 階段獲取的版本號
???})
???- 基于 `ResourceVersion` 監聽此版本之后的變更。
2. API Server 處理流程 ?
???-緩存查詢:優先從內存中的 **Watch 緩存** 返回事件(由 `--default-watch-cache-size` 控制緩存大小)。 ?
???- etcd 監聽:若緩存不命中,則通過 etcd 的 Watch API 監聽 `/registry/pods` 等鍵前綴的變更。 ?
???-事件推送:通過 **HTTP 分塊傳輸(chunked encoding)** 持續向客戶端推送事件流。
3. 事件類型 ?
???- `ADDED`(新增資源)、`MODIFIED`(修改資源)、`DELETED`(刪除資源)、`BOOKMARK`(心跳事件,攜帶最新 `ResourceVersion`)。
(3)連接維護與故障恢復
- 超時處理: ?
??- Watch 連接默認由 `--min-request-timeout`(默認 1800s)控制超時時間。 ?
??- 客戶端需處理連接中斷,并通過新的 `List+Watch` 重新同步。 ?
- 歷史版本壓縮: ?
??- 若客戶端請求的 `ResourceVersion` 已被 etcd 壓縮(超出 `--etcd-compaction-interval`),API Server 返回 `410 Gone`,強制客戶端全量同步。???
3. 關鍵優化設計(1.23.6 版本特性)
(1)Watch 緩存
- 作用:緩存最近事件,減少對 etcd 的直接訪問。 ?
- 調優參數: ?
??- `--default-watch-cache-size`:默認值 `100`,建議在大集群中調大(如 `1000`)。 ?
??- `--watch-cache-sizes`:按資源類型定制緩存大小(如 `pods=5000`)。 ?
(2)Bookmark 機制
- 用途:定期發送 `BOOKMARK` 事件,攜帶最新 `ResourceVersion`,避免客戶端因長時間無事件而超時。 ?
- 參數:`--watch-bookmark-frequency`(默認 1m 發送一次)。
(3)分頁與限流
- List 分頁:大容量 List 請求自動分頁,由 `--max-requests-inflight` 控制并發。 ?
- Watch 限流:通過 `--max-watch-connections` 限制總 Watch 連接數。
4. 性能影響
(1)API Server 負載
-?內存占用:每個 Watch 連接約占用 **100KB 內存**(參考測試數據)。 ?
- CPU開銷:事件序列化與流式傳輸消耗 CPU 資源。
(2)etcd 負載
- 讀壓力:List 請求直接訪問 etcd,可能觸發大范圍掃描。 ?
- 寫放大:頻繁的資源變更導致 Watch 事件激增。
(3)監控指標
5. 故障場景與調優建議
(1)Watch頻繁斷開
- 原因:網絡問題、etcd 歷史版本壓縮。 ?
- 解決:客戶端實現重試邏輯,重新發起 `List+Watch`。
(2)高延遲或事件丟失
- 調優參數: ?
??# API Server 啟動參數示例
??--default-watch-cache-size=2000
??--watch-cache-sizes=pods=5000
??--etcd-compaction-interval=10m ?# 調整 etcd 壓縮間隔
(3)大規模集群建議
- 為高頻資源(如 Pod、ConfigMap)單獨設置較大的 Watch 緩存。 ?
- 監控 `apiserver_cache_miss_total`,確保緩存命中率 >90%。
6. 與其他版本的差異
- 1.23.6 特性: ?
??- 支持 `BOOKMARK` 機制,減少不必要的全量同步。 ?
??- Watch 緩存優化,支持按資源類型動態調整大小。 ?
- 與 1.22 對比: ?
??- 1.23.6 進一步降低了 etcd 的 Watch 事件處理延遲。