天天看點

開源容器叢集管理系統Kubernetes架構及元件介紹

together we will ensure that kubernetes is a strong and open container management framework for any application and in any environment, whether in a private, public or hybrid cloud. --urs hölzle, google

接下來我們一起探索kubernetes是什麼、能做什麼以及怎麼做。

kubernetes是google開源的容器叢集管理系統,使用golang開發,其提供應用部署、維護、擴充機制等功能,利用kubernetes能友善地管理跨機器運作容器化的應用,其主要功能如下:

使用docker對應用程式包裝(package)、執行個體化(instantiate)、運作(run)。

以叢集的方式運作、管理跨機器的容器。

解決docker跨機器容器之間的通訊問題。

kubernetes的自我修複機制使得容器叢集總是運作在使用者期望的狀态。

目前kubernetes支援gce、vshpere、coreos、openshift、azure等平台,除此之外,也可以直接運作在實體機上。

這個官方給出的完整的架構圖:(可放大看)

開源容器叢集管理系統Kubernetes架構及元件介紹

在kubernetes系統中,排程的最小顆粒不是單純的容器,而是抽象成一個pod,pod是一個可以被建立、銷毀、排程、管理的最小的部署單元。把相關的一個或多個容器(container)構成一個pod,通常pod裡的容器運作相同的應用。pod包含的容器運作在同一個minion(host)上,看作一個統一管理單元,共享相同的volumes和network namespace/ip和port空間。

services也是kubernetes的基本操作單元,是真實應用服務的抽象,每一個服務後面都有很多對應的容器來支援,通過proxy的port和服務selector決定服務請求傳遞給後端提供服務的容器,對外表現為一個單一通路位址,外部不需要了解後端如何運作,這給擴充或維護後端帶來很大的好處。

replication controller,了解成更複雜形式的pods,它確定任何時候kubernetes叢集中有指定數量的pod副本(replicas)在運作,如果少于指定數量的pod副本(replicas),replication controller會啟動新的container,反之會殺死多餘的以保證數量不變。replication controller使用預先定義的pod模闆建立pods,一旦建立成功,pod 模闆和建立的pods沒有任何關聯,可以修改 pod 模闆而不會對已建立pods有任何影響,也可以直接更新通過replication controller建立的pods。對于利用 pod 模闆建立的pods,replication controller根據 label selector 來關聯,通過修改pods的label可以删除對應的pods。replication controller主要有如下用法:

rescheduling

如上所述,replication controller會確定kubernetes叢集中指定的pod副本(replicas)在運作, 即使在節點出錯時。

scaling

通過修改replication controller的副本(replicas)數量來水準擴充或者縮小運作的pods。

rolling updates

replication controller的設計原則使得可以一個一個地替換pods來滾動更新(rolling updates)服務。

multiple release tracks

如果需要在系統中運作multiple release的服務,replication controller使用labels來區分multiple release tracks。

以上三個概念便是使用者可操作的rest對象。kubernetes以restfull api形式開放的接口來處理。

service和replicationcontroller隻是建立在pod之上的抽象,最終是要作用于pod的,那麼它們如何跟pod聯系起來呢?這就引入了label的概念:label其實很好了解,就是為pod加上可用于搜尋或關聯的一組key/value标簽,而service和replicationcontroller正是通過label來與pod關聯的。為了将通路service的請求轉發給後端提供服務的多個容器,正是通過辨別容器的labels來選擇正确的容器;replication controller也使用labels來管理通過 pod 模闆建立的一組容器,這樣replication controller可以更加容易,友善地管理多個容器。

如下圖所示,有三個pod都有label為"app=backend",建立service和replicationcontroller時可以指定同樣的label:"app=backend",再通過label selector機制,就将它們與這三個pod關聯起來了。例如,當有其他frontend pod通路該service時,自動會轉發到其中的一個backend pod。

開源容器叢集管理系統Kubernetes架構及元件介紹

kubenetes整體架構如下圖,主要包括kubecfg、master api server、kubelet、minion(host)以及proxy。

開源容器叢集管理系統Kubernetes架構及元件介紹

master定義了kubernetes 叢集master/api server的主要聲明,包括pod registry、controller registry、service registry、endpoint registry、minion registry、binding registry、reststorage以及client, 是client(kubecfg)調用kubernetes api,管理kubernetes主要構件pods、services、minions、容器的入口。master由api server、scheduler以及registry等組成。從下圖可知master的工作流主要分以下步驟:

kubecfg将特定的請求,比如建立pod,發送給kubernetes client。

kubernetes client将請求發送給api server。

api server根據請求的類型,比如建立pod時storage類型是pods,然後依此選擇何種rest storage api對請求作出處理。

rest storage api對的請求作相應的處理。

将處理的結果存入高可用鍵值存儲系統etcd中。

在api server響應kubecfg的請求後,scheduler會根據kubernetes client擷取叢集中運作pod及minion資訊。

依據從kubernetes client擷取的資訊,scheduler将未分發的pod分發到可用的minion節點上。

開源容器叢集管理系統Kubernetes架構及元件介紹

下面是master的主要構件的詳細介紹。

minion registry負責跟蹤kubernetes 叢集中有多少minion(host)。kubernetes封裝minion registry成實作kubernetes api server的restful api接口rest,通過這些api,我們可以對minion registry做create、get、list、delete操作,由于minon隻能被建立或删除,是以不支援update操作,并把minion的相關配置資訊存儲到etcd。除此之外,scheduler算法根據minion的資源容量來确定是否将建立pod分發到該minion節點。

可以通過<code>curl http://{master-apiserver-ip}:4001/v2/keys/registry/minions/</code>來驗證etcd中存儲的内容。

pod registry負責跟蹤kubernetes叢集中有多少pod在運作,以及這些pod跟minion是如何的映射關系。将pod registry和cloud provider資訊及其他相關資訊封裝成實作kubernetes api server的restful api接口rest。通過這些api,我們可以對pod進行create、get、list、update、delete操作,并将pod的資訊存儲到etcd中,而且可以通過watch接口監視pod的變化情況,比如一個pod被建立、删除或者更新。

service registry負責跟蹤kubernetes叢集中運作的所有服務。根據提供的cloud provider及minion registry資訊把service registry封裝成實作kubernetes api server需要的restful api接口rest。利用這些接口,我們可以對service進行create、get、list、update、delete操作,以及監視service變化情況的watch操作,并把service資訊存儲到etcd。

controller registry負責跟蹤kubernetes叢集中所有的replication controller,replication controller維護着指定數量的pod 副本(replicas)拷貝,如果其中的一個容器死掉,replication controller會自動啟動一個新的容器,如果死掉的容器恢複,其會殺死多出的容器以保證指定的拷貝不變。通過封裝controller registry為實作kubernetes api server的restful api接口rest, 利用這些接口,我們可以對replication controller進行create、get、list、update、delete操作,以及監視replication controller變化情況的watch操作,并把replication controller資訊存儲到etcd。

endpoints registry負責收集service的endpoint,比如name:"mysql",endpoints: ["10.10.1.1:1909","10.10.2.2:8834"],同pod registry,controller registry也實作了kubernetes api server的restful api接口,可以做create、get、list、update、delete以及watch操作。

binding包括一個需要綁定pod的id和pod被綁定的host,scheduler寫binding registry後,需綁定的pod被綁定到一個host。binding registry也實作了kubernetes api server的restful api接口,但binding registry是一個write-only對象,所有隻有create操作可以使用, 否則會引起錯誤。

scheduler收集和分析目前kubernetes叢集中所有minion節點的資源(記憶體、cpu)負載情況,然後依此分發建立的pod到kubernetes叢集中可用的節點。由于一旦minion節點的資源被配置設定給pod,那這些資源就不能再配置設定給其他pod, 除非這些pod被删除或者退出, 是以,kubernetes需要分析叢集中所有minion的資源使用情況,保證分發的工作負載不會超出目前該minion節點的可用資源範圍。具體來說,scheduler做以下工作:

實時監測kubernetes叢集中未分發的pod。

實時監測kubernetes叢集中所有運作的pod,scheduler需要根據這些pod的資源狀況安全地将未分發的pod分發到指定的minion節點上。

scheduler也監測minion節點資訊,由于會頻繁查找minion節點,scheduler會緩存一份最新的資訊在本地。

最後,scheduler在分發pod到指定的minion節點後,會把pod相關的資訊binding寫回api server。

開源容器叢集管理系統Kubernetes架構及元件介紹

根據上圖可知kubelet是kubernetes叢集中每個minion和master api server的連接配接點,kubelet運作在每個minion上,是master api server和minion之間的橋梁,接收master api server配置設定給它的commands和work,與持久性鍵值存儲etcd、file、server和http進行互動,讀取配置資訊。kubelet的主要工作是管理pod和容器的生命周期,其包括docker client、root directory、pod workers、etcd client、cadvisor client以及health checker元件,具體工作如下:

通過worker給pod異步運作特定的action

設定容器的環境變量

給容器綁定volume

給容器綁定port

根據指定的pod運作一個單一容器

殺死容器

給指定的pod建立network 容器

删除pod的所有容器

同步pod的狀态

從cadvisor擷取container info、 pod info、 root info、 machine info

檢測pod的容器健康狀态資訊

在容器中運作指令。

proxy是為了解決外部網絡能夠通路跨機器叢集中容器提供的應用服務而設計的,運作在每個minion上。proxy提供tcp/udp sockets的proxy,每建立一種service,proxy主要從etcd擷取services和endpoints的配置資訊(也可以從file擷取),然後根據配置資訊在minion上啟動一個proxy的程序并監聽相應的服務端口,當外部請求發生時,proxy會根據load balancer将請求分發到後端正确的容器處理。

繼續閱讀