在Kubernetes(K8s)中,各個模組與API Server的通訊是叢集正常運作的關鍵。以下詳細說明了各模組如何與API Server進行通訊:
1. 通訊方式
Kubernetes API Server提供了一個統一的RESTful介面,用於叢集內所有元件之間的通訊。任何想要操作叢集資源(如Pods、Services、ConfigMaps等)的元件,都會透過HTTP/HTTPS呼叫API Server的端點來傳送請求和接收響應。每個與API Server通訊的客戶端都需要進行身份驗證,並且根據其身份和許可權訪問相應的資源。這通常透過kubeconfig檔案中的證書、令牌或服務賬戶憑據實現。
對於某些內部元件間的通訊,可能採用gRPC協議而不是純RESTful API。然而,核心API Server對叢集外部以及大部分內部元件的主要介面仍然是基於HTTP/HTTPS的REST API。
2. 主要元件的通訊方式
- kubelet程序與API Server的互動:
- 每個Node上的kubelet會定期(每隔一個時間週期)呼叫API Server的REST介面報告自身狀態,如CPU使用率、記憶體使用情況等。
- API Server在接收到這些資訊後,會將節點狀態資訊更新到etcd中。
- kubelet也透過API Server的Watch介面監聽Pod資訊,如Pod的建立、刪除、修改等事件。根據這些事件,kubelet會執行相應的操作,如建立和啟動容器、刪除容器等。
- kube-controller-manager程序與API Server的互動:
- kube-controller-manager中的各個控制器(如Node Controller、Replication Controller等)透過API Server提供的Watch介面實時監控叢集中資源的狀態變化。
- 根據監控到的狀態變化,控制器會執行相應的操作,如自動重啟失敗的Pod、建立新的Pod副本以保持副本集的期望數量等。
- kube-scheduler程序與API Server的互動:
- Scheduler透過API Server的Watch介面監聽到新建Pod副本的資訊後,會檢索所有符合該Pod要求的Node列表。
- 然後,Scheduler開始執行Pod排程邏輯,在排程成功後將Pod繫結到目標節點上,並將排程結果更新到etcd中。
- 其他元件與API Server的互動:
- 其他元件(如kube-proxy、DNS外掛等)也會透過API Server獲取叢集中資源的資訊,並根據這些資訊執行相應的操作。
- 例如,kube-proxy會根據API Server中Service的資訊來配置網路代理規則,實現Service的負載均衡和跨節點通訊。
3. 通訊機制
- 認證和鑑權:
- 每個與API Server通訊的客戶端都需要進行身份驗證,以確保只有合法的客戶端才能訪問API Server。
- 身份驗證通常透過TLS證書、客戶端證書或Bearer Token等方式實現。
- 在透過身份驗證後,API Server還會根據客戶端的許可權和角色進行鑑權,以確保客戶端只能訪問其有權訪問的資源。
- Watch機制:
- 叢集內的多個元件(如kubelet、控制器管理器等)會持續監聽(Watch)API Server以獲取資源狀態的變化。
- 當API Server檢測到資源狀態發生變化時,會透過長輪詢方式通知客戶端,從而實現事件驅動的自動化處理。
- 這種Watch機制有助於減少客戶端對API Server的頻繁輪詢請求,降低叢集的網路開銷和API Server的壓力。
- 快取機制:
- 為了緩解叢集各個模組對API Server的訪問壓力並減少網路延遲,各個模組都採用快取機制來快取資料。
- 各個模組定時從API Server上獲取指定的資源物件資訊(透過LIST-Watch方法),並將這些資訊儲存到本地快取中。
- 在某些情況下,功能模組不直接訪問API Server,而是透過訪問快取資料來間接訪問API Server。
- 安全性:
- API Server與客戶端之間的通訊通常透過HTTPS協議進行加密傳輸,以確保資料傳輸的安全性。
- 在叢集內部,kube-proxy可以協助提供必要的路由規則,確保API Server能夠正確地接收和處理來自不同節點的請求。
- 對於外部元件訪問API Server的情況,可以透過NodePort、LoadBalancer Service或者Ingress等方式進行間接訪問,並配置相應的安全策略和訪問控制。
綜上所述,Kubernetes中各模組透過標準的HTTP/HTTPS請求與API Server進行互動,並透過認證和鑑權機制保證安全性。同時,利用Watch機制和快取機制實現實時的資源狀態監控與同步以及降低叢集的網路開銷和API Server的壓力。