上一篇Docker集群管理方案Kubernetes之部署,通過在線安裝的方式搭建了Kubernetes的集群,本文將對(duì)Kubernetes的組件進(jìn)行描述,以進(jìn)一步了解Kubernetes。
下圖列出了Kubernetes的組件:

master節(jié)點(diǎn)組件
在master上運(yùn)行有etcd、api server、controller manager、scheduler四個(gè)組件,負(fù)責(zé)對(duì)集群中的所有資源進(jìn)行管控和調(diào)度。
etcd
由CoreOS團(tuán)隊(duì)開發(fā)的一個(gè)輕量級(jí)分布式鍵值存儲(chǔ)系統(tǒng),主要用于配置共享和服務(wù)的注冊(cè)以及發(fā)現(xiàn)。是Kubernetes賴以運(yùn)行的基礎(chǔ)組件,為Kubernetes提供全局的高可用配置存儲(chǔ),負(fù)責(zé)存儲(chǔ)Kubernetes所有對(duì)象的生命周期。
etcd作為整個(gè)Kubernetes集群的中心數(shù)據(jù)庫,通常需要以集群的方式進(jìn)行部署,如規(guī)劃一個(gè)至少三臺(tái)服務(wù)器的etcd集群。
etcd提供了HTTP/JSON API,可以非常方便地設(shè)置或獲取值。
在master節(jié)點(diǎn)上運(yùn)行etcd --version可以查看使用的etcd版本。API Server
是資源對(duì)象的唯一操作入口。
用于驗(yàn)證和配置pods、services、replicationcontrollers等對(duì)象的數(shù)據(jù),封裝了以上對(duì)象的CRUD操作并以Restful形式提供給外部或內(nèi)部調(diào)用。大多數(shù)的接口都是直接讀寫etcd。
kubectl實(shí)際上就是調(diào)用了API Server的接口。Controller Manager
controller包括replication controller, endpoints controller, namespace controller, serviceaccounts controllers, token controller, node controller, resourcequota controller, server controller等。這些controller通過調(diào)用API Server的接口監(jiān)控集群的共享狀態(tài),并將當(dāng)前狀態(tài)改變?yōu)槠谕臓顟B(tài)。
controller manager作為守護(hù)程序,負(fù)責(zé)管理和執(zhí)行這些controller。Scheduler
scheduler用來分派pods到集群中的指定minion節(jié)點(diǎn)。
scheduler跟蹤每個(gè)minion節(jié)點(diǎn)上的資源利用率,以確保工作負(fù)載調(diào)度不超過可用資源限制。scheduler必須知道每個(gè)minion節(jié)點(diǎn)上的所有可用資源,以及節(jié)點(diǎn)上已經(jīng)分配負(fù)載的資源。
minion節(jié)點(diǎn)組件
在minion上運(yùn)行有docker daemon、kubelet、proxy三個(gè)組件,負(fù)責(zé)對(duì)節(jié)點(diǎn)上的pod的生命周期進(jìn)行管理,以及實(shí)現(xiàn)服務(wù)代理的功能。
Docker
minion節(jié)點(diǎn)上必須運(yùn)行docker引擎。Kubelet
可以把kubelet看做是集群中minion節(jié)點(diǎn)的代理。kubelet負(fù)責(zé)轉(zhuǎn)發(fā)來自或去往master節(jié)點(diǎn)的信息,讀取或?qū)懭雃tcd數(shù)據(jù)。
kubelet負(fù)責(zé)節(jié)點(diǎn)上的pod的創(chuàng)建、修改、監(jiān)控、刪除等全生命周期管理,同時(shí)定時(shí)上報(bào)節(jié)點(diǎn)的狀態(tài)信息到API Server。Proxy
proxy負(fù)責(zé)整個(gè)網(wǎng)絡(luò)規(guī)則的連接與轉(zhuǎn)發(fā),實(shí)現(xiàn)了service的代理以及負(fù)載均衡。
工作單元
Pods
pod是Kubernetes最基本的操作單元。
通常將相互關(guān)聯(lián)的容器組合在一起放入一個(gè)pod中。這些容器可以理解為一個(gè)單個(gè)的“應(yīng)用”。這些容器在同一個(gè)主機(jī)上被調(diào)度,共享一個(gè)運(yùn)行環(huán)境。一個(gè)pod中的容器共享同一組資源如磁盤卷和網(wǎng)絡(luò)命名空間等,比如容器之間可以通過localhost相互通信。
在設(shè)計(jì)pod時(shí)通常包含一個(gè)主容器,擔(dān)當(dāng)該pod的主要用途,再加一些輔助類容器以協(xié)助完成相關(guān)的工作,這些輔助容器中的應(yīng)用程序雖然運(yùn)行和管理在自己的容器中,但是同主容器中的應(yīng)用緊密關(guān)聯(lián)。
通過Yaml或Json格式的配置文件來定義pod。pod的生命周期通過replication controller來管理。Services
Kubernetes中service是一個(gè)負(fù)載均衡器,用以調(diào)度后端的容器。一個(gè)service可以看作是一組提供相同服務(wù)的pod的訪問接口。這樣外部調(diào)用方僅需要關(guān)注service這一個(gè)訪問點(diǎn),而無需了解后面是一個(gè)容器還是一個(gè)高可用容器集群。
通過部署一個(gè)service,就輕易的具備了動(dòng)態(tài)服務(wù)發(fā)現(xiàn)的能力。
通過Yaml或Json格式的配置文件來定義service。Replication Controller
replication controller用于定義pod副本的數(shù)量,解決了pod的伸縮性問題,大大減少了此前系統(tǒng)管理員的手工運(yùn)維工作。
通過Yaml或Json格式的配置文件來定義replication controller。在master節(jié)點(diǎn)上,controller manager通過replication controller的定義來完成pod的創(chuàng)建、監(jiān)控、啟動(dòng)、停止等操作。
當(dāng)一個(gè)容器掛掉時(shí),replication controller可以啟動(dòng)另一個(gè)容器,當(dāng)掛掉的容器恢復(fù)后,replication controller會(huì)關(guān)掉運(yùn)行中的一個(gè)容器。以確保集群中運(yùn)行的容器數(shù)量用戶期望的一致。Labels
label是一個(gè)鍵值對(duì),附加到pod、service、replication controller等對(duì)象上,用于識(shí)別這些對(duì)象。
對(duì)象可以有多個(gè)label,通常為了更細(xì)粒度的控制,可以給對(duì)象指定多個(gè)label。
使用label可以給對(duì)象創(chuàng)建多組標(biāo)簽,service、replication controller通過label selector選擇對(duì)象范圍。label selector采用基于等式的或基于集合的方式對(duì)label進(jìn)行篩選從而篩選對(duì)象,如replication controller通過label selector選擇要管理的pod。
label是service和replication controller的基礎(chǔ)。