Kubernetes的整體架構

語言: CN / TW / HK

K8s將叢集中的機器劃分為一個主節點和一群工作節點,在主節點上執行著叢集管理相關的一組程序kube-apiserver、kube-controller-manager 和 kube-scheduler,這些程序實現了整個叢集的資源管理、pod 排程、彈性伸縮、安全控制、系統監控和糾錯等管理功能,並且都是全自動完成的。叢集中的工作節點執行真正的應用程式,各自又通過若干元件的組合來實現。在節點上,K8s管理的最小執行單元是pod。負載均衡模式需要通過kubelet、kube-proxy等這些服務程序實現,下 圖是 K8s的整體架構

主節點即 中央控制節點是 K8s 叢集 的管理節點,管理叢集當中資料的介面、狀態監測和回滾、狀態更新、排程等功能,kubectl是K8s的命令列工具集,用於通過命令列與API server進行互動,而對K8s進行操作,實現在叢集中進行各種資源的管理控制等操作,通過節點控制器來與工作節點互動。主節點內部架構如下圖所示:

上圖可以看出主節點的核心元件以及內部的互動流程,主節點提供的核心元件如下。

(1) etcd 是叢集的狀態 K8s 預設使用分散式的etcd叢集整體儲存用來實現發現服務和 共享配置叢集的所有狀態都儲存在 etcd 例項中,並具有 監控的能力,因此當 etcd中的資訊發生變化時,能夠快速地通知叢集中相關的元件。

(2) API server提供了叢集閘道器,API server在客戶端 對叢集進行訪問, 客戶端需要通過認證, 並使用 API server作為訪問節點和 pod (以及服務)的堡壘和代理/通道。

(3) Scheduler 主要功能是資源排程,講 pod排程到對應的主機上。 依據請求資源的可用性、服務請求的質量等約束條件, K8s也支援使用者自己提供的排程器。

4)controller負責維護叢集的狀態,比如故障檢測、記憶體垃圾回收、滾動更新等,也執行API業務邏輯;K8s預設提供replication controller、controller、daemonset controller等控制器。

5)kube-ui為可選元件,自帶的一套用來檢視叢集狀態的Web介面。

6)kube-dns 為可選元件,記錄啟動的pod和服務地址,提供域名到地址的轉換對映。

7)其他元件包括容器資源使用監控、日誌記錄等。這些管理元件可以任意部署在相同或者不同的機器上,只要可以通過標準的HTTP介面相互訪問即可。這意味著K8s的管理元件進行擴充套件將變得十分簡單。在建立K8s叢集過程中,都要預裝一些必要的軟體來響應主節點的管理 ,另外還有負責網路和負載均衡的接入代理。節點具體負責真正的容器的啟停、狀態監測、執行結果上報等工作。工作節點內部元件如下圖所示:

工作節點主要由以下核心元件組成:

1)本地的容器執行時環境,負責映象管理以及pod和容器的真正執行。K8s本身並不提供容器執行時環境,但提供了介面,可以插入所選擇的容器執行時環境,目前支援Docker和rkt。

2)kubelet是節點上最主要的工作代理,用於彙報節點狀態並負責維護pod的生命週期,也負責volume(CVI)和網路(CNI)的管理。kubelet是pod和節點API的主要實現者,負責驅動容器執行層。作為基本的執行單元,pod可以擁有多個容器和儲存卷,能夠方便地在每個容器中打包一個單一的應用,從而解耦了應用構建時和部署時所關心的事項,方便在物理機或虛擬機器之間進行遷移。

3)kube-proxy代理對抽象的應用地址的訪問,服務提供了一種訪問一群pod的途徑, kube-proxy負責為服務提供叢集內部的服務發現和應用的負載均衡(通常利用iptables規則),實現服務到pod的路由和轉發。此方式通過建立一個虛擬的IP來實現,客戶端能夠訪問此IP,並能夠將服務透明地代理至pod。

4)輔助元件,可選,Supervisord用來保持kubelet和Docker程序執行,Fluentd用來轉發日誌等。節點的重要屬性有地址資訊、狀態、資源容量、節點資訊。這些屬性用來標識節點的執行狀態,並可以被外部元件訪問識別。

基本上這 4類服務就能涵蓋所有的線上交易類業務場景。