Docker系列(八)Kubernetes介紹

Kubernetes組件功能圖算法

image 

各組件說明:docker

節點

節點在Kubernetes由虛擬機或者實體機表示,常稱爲Minion,即從屬主機。當一個節點加入到Kubernetes系統中時,它將會建立一個數據結構來記錄節點信息(元數據),且不是全部節點都可以加入到Kubernetes系統中,只有經過驗證後的節點纔可以成爲Kubernetes階段。目前管理節點有兩種方式分別爲:節點管理器(Node Controller)和經過命令手動管理。後端

Pod

在Kubernetes中,Pod是最小的可建立、調度和管理的部署單元,它是容器化環境中的「邏輯主機」,能夠包含一個或多個有關聯的容器,而且容器間能夠共享數據卷。api

容器存在於Pod之中,而Pod又存在於節點中。緩存

Pod主要功能:同一Pod中的容器資源共享和通訊。網絡

Service

pod的路由代理抽象,用於解決pod之間的服務發現問題。由於pod的運行狀態可動態變化(好比切換機器了、縮容過程當中被終止了等),因此訪問端不能以寫死IP的方式去訪問該pod提供的服務。service的引入旨在保證pod的動態變化對訪問端透明,訪問端只須要知道service的地址,由service來提供代理。數據結構

replicationController

pod的複製抽象,用於解決pod的擴容縮容問題。一般,分佈式應用爲了性能或高可用性的考慮,須要複製多份資源,而且根據負載狀況動態伸縮。經過replicationController,咱們能夠指定一個應用須要幾份複製,Kubernetes將爲每份複製建立一個pod,而且保證明際運行pod數量老是與該複製數量相等(例如,當前某個pod宕機時,自動建立新的pod來替換)。負載均衡

Label

Labe是一組附加在對象上的鍵值對,用於區分Pod、Service、Replication Controller的key/value鍵值對,Pod、Service、 Replication Controller能夠有多個label,可是每一個label的key只能對應一個value。Labels是Service和Replication Controller運行的基礎,爲了將訪問Service的請求轉發給後端提供服務的多個容器,正是經過標識容器的labels來選擇正確的容器。一樣,Replication Controller也使用labels來管理經過pod 模板建立的一組容器,這樣Replication Controller能夠更加容易,方便地管理多個容器,不管有多少容器。分佈式

Proxy

Proxy不但解決了同一主宿機相同服務端口衝突的問題,還提供了Service轉發服務端口對外提供服務的能力,Proxy後端使用了隨機、輪循負載均衡算法。函數

Kubelet

用來監管Pod裏面容器運行狀況的。一旦某個Pod裏面的容器發生意外掛掉了,就由Kubelet來完成對其的重建。

 

apiserver

做爲kubernetes系統的入口,封裝了核心對象的增刪改查操做,以RESTFul接口方式提供給外部客戶和內部組件調用。它維護的REST對象將持久化到etcd(一個分佈式強一致性的key/value存儲)。

Scheduler

負責集羣的資源調度,爲新建的pod分配機器。這部分工做分出來變成一個組件,意味着能夠很方便地替換成其餘的調度器。

controller-manager

負責執行各類控制器,目前有兩類:

endpoint-controller:按期關聯service和pod(關聯信息由endpoint對象維護),保證service到pod的映射老是最新的。

replication-controller:按期關聯replicationController和pod,保證replicationController定義的複製數量與實際運行pod的數量老是一致的。

slave(稱做minion)運行兩個組件:

kubelet

負責管控docker容器,如啓動/中止、監控運行狀態等。它會按期從etcd獲取分配到本機的pod,並根據pod信息啓動或中止相應的容器。同時,它也會接收apiserver的HTTP請求,彙報pod的運行狀態。

Proxy

負責爲pod提供代理。它會按期從etcd獲取全部的service,並根據service信息建立代理。當某個客戶pod要訪問其餘pod時,訪問請求會通過本機proxy作轉發。

Kubernetes調度說明
Scheduler負責Pods在各個節點上的分配。Scheduler是插件式的,Kubernetes未來能夠支持用戶自定義的scheduler

調度流程:
一、從緩存待調度pod對象的隊列PodQueue中彈出一個pod對象。
二、該pod和存儲全部minion對象的鏈表MinionLister做爲調度算法的輸入,運行調度算法選擇一個minion做爲pod的調度目的地dest。若是沒法選擇一個可用的minion則輸出一個event信息,說明pod調度失敗。若是成功選擇一個可用的minion,則使用該pod的namespace、pod名、選擇的minion這三個屬性新建一個Binding對象。
三、將pod分派到指定的minion上運行,這個動做也叫綁定(bind),bind就是向apiserver返回一個Binding對象,該Binding對象最終由apiserver調用etcd接口進行持久化存儲。若是綁定失敗,則輸出綁定被拒絕的event信息,反之輸出調度成功的event信息。

調度規則
調度策略分爲兩大類:Predicates和Priorities,其中Predicates回答"能不能"的問題,即可否將pod調度到特定minion上運行,而Priorities則是在Predicates的答案基礎上回答"到底有多適合"的問題,即給特定minion打分評價優先級。

Predicates類
一、PodFitsPorts對應的實現函數是PodFitsPorts,他的評估依據就是端口是否衝突,即檢測待調度的pod中全部容器要用到的端口集對應的HostPort集與minion上已使用的端口是否衝突。
二、PodFitsResources對應的實現函數是PodFitsResources,他的評估依據就是資源是否夠用,即檢測minion上已經運行的全部pod對資源的需求總量與待調度pod對資源的需求量之和是否超出minion的資源容量。
三、NoDiskConflict對應的實現函數是NoDiskConflict,他的評估依據就是掛載的磁盤(volume)是否衝突。
四、MatchNodeSelector對應的實現函數是PodSelectorMatches,他的評估依據就是minion是否被pod的NodeSelector選中。
五、HostNamer對應的實現函數是PodFitsHost,他的評估依據就是pod的hostname。

Priorities類
一、LeastRequestedPriority對應的實現函數是LeastRequestedPriority,他的計算原則是儘可能將pod調度到資源佔用比較小的minion上。
二、ServiceSpreadingPriority對應的實現函數是CalculateSpreadPriority,他的計算原則是使同一個minion上屬於相同service的pod數量儘量少,這樣調度的pod可以儘量地實現service的高可用性和流量負載均衡。
三、EqualPriority對應的實現函數是EqualPriority,他的計算原則是平等對待MinionLister中的每個minion。

Pod、RC、Service之間的關係
Replication Controller
Pod副本控制器,限定某種Pod的當前實例的個數,提供服務的滾動升級功能。經過標籤選擇器選擇目標Pod.

Service
無狀態的爲服務,一容器的方式進行隔離,擁有一個惟一的名字和、虛擬訪問地址IP地址(ClusterIP)+Port、外部系統訪問的映射端口NodePort

Pod
一組容器的一個 單一集合體,k8s最小調度單元且Pod裏的全部容器共享資源(網絡、Volumes),擁有名稱、IP、狀態、Label、一組容器進程等。

關係說明:
Service運行在Pod之上,Pod運行在容器之上,RC用於管理Pod實例,控制實例個數及保障正在運行實例個數。

RC不是定義在Service之上緣由:
根據以上說明:Service由Pod提供的服務功能,而RC用於管理Pod實例,若是RC定義在Service之上將會致使,本身出現問題沒有人監控,並且整個系統結構將不合理。

關係圖:

image

相關文章
相關標籤/搜索