Kubernetes 整體架構圖
Kubernetes 各元件介紹
Kube-Master「控制節點」
Kube-Master 的工作流程圖
Kubecfg 將特定的請求傳送給 Kubernetes Client(比如:建立 Pod 的請求)。
Kubernetes Client 將請求傳送給 API Server。
API Server 會根據請求的型別選擇用何種 REST API 對請求作出處理(比如:建立 Pod 時 Storage 型別是 Pods 時,其對應的就是 REST Storage API)。
REST Storage API 會對請求作相應的處理並將處理的結果存入高可用鍵值儲存系統 Etcd 中。
在 API Server 響應 Kubecfg 的請求後,Scheduler 會根據 Kubernetes Client 獲取的叢集中執行 Pod 及 Minion / Node 資訊將未分發的 Pod 分發到可用的 Minion / Node 節點上。
API Server 「資源操作入口」
API Server 提供了資源物件的唯一操作入口,其它所有元件都必須通過它提供的 API 來操作資源資料。只有 API Server 會與儲存通訊,其它模組都必須通過 API Server 訪問叢集狀態。
API Server 作為 Kubernetes 系統的入口,封裝了核心物件的增刪改查操作。API Server 以 RESTFul 介面方式提供給外部客戶和內部元件呼叫,API Server 再對相關的資源資料(全量查詢 + 變化監聽)進行操作,以達到實時完成相關的業務功能。
以 API Server 為 Kubernetes 入口的設計主要有以下好處:1. 保證了叢集狀態訪問的安全。2. API Server 隔離了叢集狀態訪問和後端儲存實現,這樣 API Server 狀態訪問的方式不會因為後端儲存技術 Etcd 的改變而改變,讓後端儲存方式選擇更加靈活,方便了整個架構的擴充套件。
Controller Manager 「內部管理控制中心」
Controller Manager 用於實現 Kubernetes 叢集故障檢測和恢復的自動化工作。Controller Manager 主要負責執行以下各種控制器:
Replication Controller
Replication Controller 的作用主要是定期關聯 Replication Controller (RC) 和 Pod,以保證叢集中一個 RC (一種資源物件) 所關聯的 Pod 副本數始終保持為與預設值一致。
Node Controller
Kubelet 在啟動時會通過 API Server 註冊自身的節點資訊,並定時向 API Server 彙報狀態資訊。API Server 在接收到資訊後將資訊更新到 Etcd 中。
Node Controller 通過 API Server 實時獲取 Node 的相關資訊,實現管理和監控叢集中的各個 Node 節點的相關控制功能。
ResourceQuota Controller
資源配額管理控制器用於確保指定的資源物件在任何時候都不會超量佔用系統上物理資源。
Namespace Controller
使用者通過 API Server 可以建立新的 Namespace 並儲存在 Etcd 中,Namespace Controller 定時通過 API Server 讀取這些 Namespace 資訊來操作 Namespace。
比如:Namespace 被 API 標記為優雅刪除,則將該 Namespace 狀態設定為 Terminating 並儲存到 Etcd 中。同時 Namespace Controller 刪除該 Namespace 下的 ServiceAccount、RC、Pod 等資源物件。
Service Account Controller
Service Account Controller (服務賬號控制器),主要在名稱空間內管理 ServiceAccount,以保證名為 default 的 ServiceAccount 在每個名稱空間中存在。
Token Controller
Token Controller(令牌控制器)作為 Controller Manager 的一部分,主要用作:監聽 serviceAccount 的建立和刪除動作以及監聽 secret 的新增、刪除動作。
Service Controller
Service Controller 是屬於 Kubernetes 叢集與外部平臺之間的一個介面控制器,Service Controller 主要用作監聽 Service 的變化。
比如:建立的是一個 LoadBalancer 型別的 Service,Service Controller 則要確保外部的雲平臺上對該 Service 對應的 LoadBalancer 例項被建立、刪除以及相應的路由轉發表被更新。
Endpoint Controller
Endpoints 表示了一個 Service 對應的所有 Pod 副本的訪問地址,而 Endpoints Controller 是負責生成和維護所有 Endpoints 物件的控制器。
Endpoint Controller 負責監聽 Service 和對應的 Pod 副本的變化。定期關聯 Service 和 Pod (關聯資訊由 Endpoint 物件維護),以保證 Service 到 Pod 的對映總是最新的。
Scheduler「叢集分發排程器」
Scheduler 主要用於收集和分析當前 Kubernetes 叢集中所有 Minion / Node 節點的資源 (包括記憶體、CPU 等) 負載情況,然後依據資源佔用情況分發新建的 Pod 到 Kubernetes 叢集中可用的節點。
Scheduler 會實時監測 Kubernetes 叢集中未分發和已分發的所有執行的 Pod。
Scheduler 會實時監測 Minion / Node 節點資訊,由於會頻繁查詢 Minion/Node 節點,Scheduler 同時會快取一份最新的資訊在本地。
Scheduler 在分發 Pod 到指定的 Minion / Node 節點後,會把 Pod 相關的資訊 Binding 寫回 API Server,以方便其它元件使用。
Kube-Node「服務節點」
Kubelet 結構圖
Kubelet 「節點上的 Pod 管家」
負責 Node 節點上 Pod 的建立、修改、監控、刪除等全生命週期的管理。
定時上報本地 Node 的狀態資訊給 API Server。
Kubelet 是 Master API Server 和 Minion / Node 之間的橋樑,接收 Master API Server 分配給它的 Commands 和 Work。
Kubelet 通過 Kube ApiServer 間接與 Etcd 叢集互動來讀取叢集配置資訊。
Kubelet 在 Node 上做的主要工作具體如下:1. 設定容器的環境變數、給容器繫結 Volume、給容器繫結 Port、根據指定的 Pod 執行一個單一容器、給指定的 Pod 建立 Network 容器。2. 同步 Pod 的狀態,從 cAdvisor 獲取 Container Info、 Pod Info、 Root Info、 Machine info。3. 在容器中執行命令、殺死容器、刪除 Pod 的所有容器。
Proxy「負載均衡、路由轉發」
Proxy 是為了解決外部網路能夠訪問叢集中容器提供的應用服務而設計的,Proxy 執行在每個 Minion / Node 上。
Proxy 提供 TCP / UDP 兩種 Sockets 連線方式 。每建立一個 Service,Proxy 就會從 Etcd 獲取 Services 和 Endpoints 的配置資訊(也可以從 File 獲取),然後根據其配置資訊在 Minion / Node 上啟動一個 Proxy 的程式並監聽相應的服務埠。當外部請求發生時,Proxy 會根據 Load Balancer 將請求分發到後端正確的容器處理。
Proxy 不但解決了同一宿主機相同服務埠衝突的問題,還提供了 Service 轉發服務埠對外提供服務的能力。Proxy 後端使用隨機、輪循等負載均衡演算法進行排程。
Kubectl 「叢集管理命令列工具集」
Kubectl 是 Kubernetes 的 客戶端的工具。 通過 Kubectl 命令對 API Server 進行操作,API Server 響應並返回對應的命令結果,從而達到對 Kubernetes 叢集的管理。
本文在 「Kubernetes 總架構圖」的基礎上整理和修改。
參考文件
http://www.google.com
http://t.cn/RdHiHXX
http://t.cn/RdHimG5
http://t.cn/RdHRDq8