Kubernetes系統架構簡介

Kubernetes系統架構簡介

【摘要】

         Together we will ensure that Kubernetes is astrong and open container management framework for any application and in anyenvironment, whether in a private, public or hybrid cloud.

Urs Hlzle, Google

         Kubernetes作爲Docker生態圈中重要一員,是Google多年大規模容器管理技術的開源版本。如Urs Hlzle所說,無論是共有云還是私有云甚至混合雲,Kubernetes將作爲一個爲任何應用,任何環境的容器管理框架無處不在。正因爲如此,目前受到各大巨頭及初創公司的青睞,如MicrosoftVMWareRed HatCoreOSMesos等,紛紛加入給Kubernetes貢獻代碼。隨着Kubernetes社區及各大廠商的不斷完善、改進、發展,Kuberentes將成爲容器管理領域的領導者。

         接下來本文會對Kubernetes的主要概念、MasterAPI ServerKubeletProxy構件的詳細介紹,後期用一系列文章帶領大家逐一詳細地探索Kubernetes的深層原理。

1.   什麼是Kubernetes

KubernetesGoogle開源的容器集羣管理系統,其提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能如下:

  • 使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run)

  • 以集羣的方式運行、管理跨機器的容器。

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

  • Kubernetes的自我修復機制使得容器集羣總是運行在用戶期望的狀態。

 

當前Kubernetes支持GCEvShpereCoreOSOpenShiftAzure等平臺,除此之外,也可以直接運行在物理機上。

2.   Kubernetes主要概念

2.1.      Pods

PodKubernetes的基本操作單元,把相關的一個或多個容器構成一個Pod,通常Pod裏的容器運行相同的應用。Pod包含的容器運行在同一個Minion(Host)上,看作一個統一管理單元,共享相同的volumesnetwork namespace/IPPort空間。

2.2.      Services

Services也是Kubernetes的基本操作單元,是真實應用服務的抽象,每一個服務後面都有很多對應的容器來支持,通過Proxyport和服務selector決定服務請求傳遞給後端提供服務的容器,對外表現爲一個單一訪問接口,外部不需要了解後端如何運行,這給擴展或維護後端帶來很大的好處。

2.3.      Replication Controllers

ReplicationController確保任何時候Kubernetes集羣中有指定數量的pod副本(replicas)在運行,如果少於指定數量的pod副本(replicas)Replication Controller會啓動新的Container,反之會殺死多餘的以保證數量不變。Replication Controller使用預先定義的pod模板創建pods,一旦創建成功,pod 模板和創建的pods沒有任何關聯,可以修改pod 模板而不會對已創建pods有任何影響,也可以直接更新通過Replication Controller創建的pods。對於利用pod 模板創建的podsReplication Controller根據label selector來關聯,通過修改podslabel可以刪除對應的podsReplication Controller主要有如下用法:

  • Rescheduling

如上所述,ReplicationController會確保Kubernetes集羣中指定的pod副本(replicas)在運行,即使在節點出錯時。

  • Scaling

通過修改ReplicationController的副本(replicas)數量來水平擴展或者縮小運行的pods

  • Rolling updates

ReplicationController的設計原則使得可以一個一個地替換podsrolling updates服務。

  • Multiple release tracks

如果需要在系統中運行multiplerelease的服務,Replication Controller使用labels來區分multiple release tracks

2.4.      Labels

Labels是用於區分PodServiceReplicationControllerkey/value鍵值對,PodService Replication Controller可以有多個label,但是每個labelkey只能對應一個valueLabelsServiceReplicationController運行的基礎,爲了將訪問Service的請求轉發給後端提供服務的多個容器,正是通過標識容器的labels來選擇正確的容器。同樣,Replication Controller也使用labels來管理通過pod 模板創建的一組容器,這樣Replication Controller可以更加容易,方便地管理多個容器,無論有多少容器。

3.   Kubernetes構件

Kubenetes整體框架如下圖3-1,主要包括kubecfgMaster APIServerKubeletMinion(Host)以及Proxy

wKioL1Rx2t2guFfpAAEeJZOyYe0836.jpg

3-1 KubernetesHigh Level構件

3.1.      Master

         Master定義了Kubernetes集羣Master/API Server的主要聲明,包括Pod RegistryController RegistryService RegistryEndpoint RegistryMinion RegistryBinding RegistryRESTStorage以及Client, client(Kubecfg)調用Kubernetes API,管理Kubernetes主要構件PodsServicesMinions、容器的入口。MasterAPI ServerScheduler以及Registry等組成。從下圖3-2可知Master的工作流主要分以下步驟:

  • Kubecfg將特定的請求,比如創建Pod,發送給KubernetesClient

  • Kubernetes Client將請求發送給APIserver

  • API Server根據請求的類型,比如創建Podstorage類型是pods,然後依此選擇何種RESTStorage API對請求作出處理。

  • REST Storage API對的請求作相應的處理。

  • 將處理的結果存入高可用鍵值存儲系統Etcd中。

  • API Server響應Kubecfg的請求後,Scheduler會根據Kubernetes Client獲取集羣中運行PodMinion信息。

  • 依據從Kubernetes Client獲取的信息,Scheduler將未分發的Pod分發到可用的Minion節點上。

下面是Master的主要構件的詳細介紹:

wKioL1Rx2wLQNM0jAAJBqjnGqyY005.jpg

3-2 Master主要構件及工作流

3.1.1. Minion Registry

Minion Registry負責跟蹤Kubernetes集羣中有多少Minion(Host)Kubernetes封裝Minion Registry成實現Kubernetes API ServerRESTful API接口REST,通過這些API,我們可以對Minion RegistryCreateGetListDelete操作,由於Minon只能被創建或刪除,所以不支持Update操作,並把Minion的相關配置信息存儲到etcd。除此之外,Scheduler算法根據Minion的資源容量來確定是否將新建Pod分發到該Minion節點。

3.1.2. Pod Registry

Pod Registry負責跟蹤Kubernetes集羣中有多少Pod在運行,以及這些PodMinion是如何的映射關係。將PodRegistryCloud Provider信息及其他相關信息封裝成實現Kubernetes API ServerRESTful API接口REST。通過這些API,我們可以對Pod進行CreateGetListUpdateDelete操作,並將Pod的信息存儲到etcd中,而且可以通過Watch接口監視Pod的變化情況,比如一個Pod被新建、刪除或者更新。

3.1.3. Service Registry

Service Registry負責跟蹤Kubernetes集羣中運行的所有服務。根據提供的Cloud ProviderMinion Registry信息把Service Registry封裝成實現Kubernetes API Server需要的RESTful API接口REST。利用這些接口,我們可以對Service進行CreateGetListUpdateDelete操作,以及監視Service變化情況的watch操作,並把Service信息存儲到etcd

3.1.4. Controller Registry

ControllerRegistry負責跟蹤Kubernetes集羣中所有的Replication ControllerReplication Controller維護着指定數量的pod 副本(replicas)拷貝,如果其中的一個容器死掉,Replication Controller會自動啓動一個新的容器,如果死掉的容器恢復,其會殺死多出的容器以保證指定的拷貝不變。通過封裝Controller Registry爲實現Kubernetes API ServerRESTful API接口REST利用這些接口,我們可以對Replication Controller進行CreateGetListUpdateDelete操作,以及監視Replication Controller變化情況的watch操作,並把Replication Controller信息存儲到etcd

3.1.5. Endpoints Registry

         EndpointsRegistry負責收集Serviceendpoint,比如Name"mysql"Endpoints: ["10.10.1.1:1909""10.10.2.2:8834"],同PodRegistryController Registry也實現了Kubernetes API ServerRESTful API接口,可以做CreateGetListUpdateDelete以及watch操作。

3.1.6. Binding Registry

Binding包括一個需要綁定PodIDPod被綁定的HostSchedulerBindingRegistry後,需綁定的Pod被綁定到一個hostBinding Registry也實現了Kubernetes API ServerRESTful API接口,但Binding Registry是一個write-only對象,所有隻有Create操作可以使用,否則會引起錯誤。

3.1.7. Scheduler

Scheduler收集和分析當前Kubernetes集羣中所有Minion節點的資源(內存、CPU)負載情況,然後依此分發新建的PodKubernetes集羣中可用的節點。由於一旦Minion節點的資源被分配給Pod,那這些資源就不能再分配給其他Pod除非這些Pod被刪除或者退出,因此,Kubernetes需要分析集羣中所有Minion的資源使用情況,保證分發的工作負載不會超出當前該Minion節點的可用資源範圍。具體來說,Scheduler做以下工作:

  • 實時監測Kubernetes集羣中未分發的Pod

  • 實時監測Kubernetes集羣中所有運行的PodScheduler需要根據這些Pod的資源狀況安全地將未分發的Pod分發到指定的Minion節點上。

  • Scheduler也監測Minion節點信息,由於會頻繁查找Minion節點,Scheduler會緩存一份最新的信息在本地。

  • 最後,Scheduler在分發Pod到指定的Minion節點後,會把Pod相關的信息Binding寫回API Server

  •       Kubelet

         wKioL1Rx2yjgHKfoAAGURuh1NPY893.jpg

3-3 Kubernetes詳細構件

         根據上圖3-3可知KubeletKubernetes集羣中每個MinionMaster APIServer的連接點,Kubelet運行在每個Minion上,是Master API ServerMinion之間的橋樑,接收Master API Server分配給它的commandswork,與持久性鍵值存儲etcdfileserverhttp進行交互,讀取配置信息。Kubelet的主要工作是管理Pod和容器的生命週期,其包括Docker ClientRoot DirectoryPod WorkersEtcd ClientCadvisor Client以及Health Checker組件,具體工作如下:

  • 通過WorkerPod異步運行特定的Action

  • 設置容器的環境變量。

  • 給容器綁定Volume

  • 給容器綁定Port

  • 根據指定的Pod運行一個單一容器。

  • 殺死容器。

  • 給指定的Pod創建network 容器。

  • 刪除Pod的所有容器。

  • 同步Pod的狀態。

  • Cadvisor獲取container info pod inforoot infomachine info

  • 檢測Pod的容器健康狀態信息。

  • 在容器中運行命令。

  •       Proxy

Proxy是爲了解決外部網絡能夠訪問跨機器集羣中容器提供的應用服務而設計的,從上圖3-3可知Proxy服務也運行在每個Minion上。Proxy提供TCP/UDP socketsproxy,每創建一種ServiceProxy主要從etcd獲取ServicesEndpoints的配置信息,或者也可以從file獲取,然後根據配置信息在Minion上啓動一個Proxy的進程並監聽相應的服務端口,當外部請求發生時,Proxy會根據Load Balancer將請求分發到後端正確的容器處理。

4.   下篇主題

    下篇講述在CentOS7上用Kubernetes來管理容器。

5.   參考資料

  1. https://github.com/GoogleCloudPlatform/kubernetes/tree/master/docs

  2. http://www.slideshare.net/rajdeep

  3. http://www.docker.com

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章