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類服務就能涵蓋所有的線上交易類業務場景。