1. Borg的架構
Kubernetes是Borg的Go語言的編譯版本,在認識Kubernetes採用的架構之前不妨先了解Borg的架構:BorgMaster負責請求分發,工作節點是Borglet。爲了防止BorgMaster發生單點故障、保證高可用集羣,高可用節點最好保證三個以上的奇數個
。scheduler是調度器組件,用來確定請求交給誰處理。scheduler不會直接和Borglet交互,而是把數據寫入到Paxos數據庫(Google),Borglet會監聽數據庫,如果有自己的請求會處理自己的請求。
2. Kubernetes的架構
Kubernetes相較於Borg在某些地方是有不同的。請求的任務到來之後scheduler把請求的任務交給api server,api server負責把請求寫入到etcd,scheduler並不會和etcd直接交互。
etcd的官方將它定義一個可信賴(爲了etcd持久化不造成單點故障,所以讓它本身支持集羣化,不需要使用其它的中間件)的分佈式鍵值存儲服務,它能夠爲整個分佈式集羣存儲一些關鍵數據,協助分佈式集羣的正常運轉(保存整個分佈式集羣的需要持久化的配置文件)。
rc,用來維護副本的數目或期望值,如果不滿足期望值,負責把副本數改寫爲期望值。api server是主服務的核心,是一切服務的訪問入口,scheduler、rc、kubectl、web UI、etcd都需要和api server交互。爲了減輕api server的壓力,每個組件還可以在本地生成緩存。
Kubernetes會使用ETCD做持久化方案,ETCD存儲有兩個版本,v2和v3版,v2版本會把所有數據寫入到內存中,v3版本會引入本地的持久化操作。服務器關機後,數據可以從磁盤恢復。
理論上會選擇v3版本,因爲不會造成數據丟失。Kubernetes 1.11版本以及之前的版本不支持v3版的功能。
3. ETCD組件
ETCD採用HTTP協議進行CS的構建服務,Kubernetes也採用採用HTTP協議進行CS的構建服務
。所有的信息都存放在Raft中,爲了防止信息損壞,還設置了wal預寫日誌。如果你想對數據進行更新,首先生成日誌存儲起來,日誌還會被定時完整地備份。完整備份是因爲增量的備份比較多,還原比較費時。日誌和數據還會被實時寫入到本地磁盤中,進行持久化實施。
4. 組件綜述
API SERVER:所有服務訪問統一入口
CrontrollerManager:維持副本期望數目
Scheduler:負責接受任務,選擇合適的節點(節點的某些特性分配給Pod)進行分配任務
ETCD:鍵值對數據庫,儲存K8S集羣所有重要信息(持久化)
kubelet:直接跟容器引擎(Docker)交互,實現容器的生命週期管理
kube-proxy:實現Pob與Pod之間的訪問和負載均衡。默認是操作防火牆,負責寫入規則至 IPTABLES 實現服務映射,新版中還支持IPVS
COREDNS:可以爲集羣中的SVC創建一個域名IP的對應關係解析(重要組件,實現負載均衡其中的功能)
DASHBOARD:給 K8S 集羣提供一個 B/S 結構訪問體系
INGRESS CONTROLLER:官方只能實現四層代理,INGRESS 可以實現七層代理(可以根據域名負載均衡)
FEDERATION:提供一個可以跨集羣中心多K8S統一管理的功能
PROMETHEUS:提供K8S集羣的監控能力
ELK:提供 K8S 集羣日誌統一分析接入平臺