Docker Kubernetes架構(gòu)設(shè)計(jì)

2018-08-04 18:18 更新

基本架構(gòu)和基本概念

任何優(yōu)秀的項(xiàng)目都離不開好的架構(gòu)和設(shè)計(jì)藍(lán)圖,在本小節(jié),我們將來看一看Kubernetes是如何規(guī)劃它的架構(gòu)。為了理解和使用Kubernets,我們需要了解Kubernetes的基本概念和作用。

架構(gòu)設(shè)計(jì)

  • 節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)是一個(gè)運(yùn)行Kubernetes中的主機(jī)。
  • 容器組:一個(gè)Pod對(duì)應(yīng)于由若干容器組成的一個(gè)容器組,同個(gè)組內(nèi)的容器共享一個(gè)存儲(chǔ)卷(volume)。
  • 容器組生命周期:包含所有容器狀態(tài)集合,包括容器組狀態(tài)類型,容器組生命周期,事件,重啟策略,以及replication controllers。
  • Replication Controllers:主要負(fù)責(zé)指定數(shù)量的pod在同一時(shí)間一起運(yùn)行。
  • 服務(wù):一個(gè)Kubernetes服務(wù)是容器組邏輯的高級(jí)抽象,同時(shí)也對(duì)外提供訪問容器組的策略。
  • :一個(gè)卷就是一個(gè)目錄,容器對(duì)其有訪問權(quán)限。
  • 標(biāo)簽:標(biāo)簽是用來連接一組對(duì)象的,比如容器組。標(biāo)簽可以被用來組織和選擇子對(duì)象。
  • 接口權(quán)限:端口,ip地址和代理的防火墻規(guī)則。
  • web界面:用戶可以通過web界面操作Kubernetes。
  • 命令行操作kubecfg命令。

節(jié)點(diǎn)

什么是節(jié)點(diǎn)

在Kubernetes中,節(jié)點(diǎn)是實(shí)際工作的點(diǎn),以前叫做Minion。節(jié)點(diǎn)可以是虛擬機(jī)或者物理機(jī)器,依賴于一個(gè)集群環(huán)境。每個(gè)節(jié)點(diǎn)都有一些必要的服務(wù)以運(yùn)行容器組,并且它們都可以通過主節(jié)點(diǎn)來管理。必要服務(wù)包括docker,kubelet和網(wǎng)絡(luò)代理。

容器狀態(tài)

容器狀態(tài)用來描述節(jié)點(diǎn)的當(dāng)前狀態(tài)?,F(xiàn)在,其中包含三個(gè)信息:

主機(jī)IP

主機(jī)IP需要云平臺(tái)來查詢,Kubernetes把它作為狀態(tài)的一部分來保存。如果Kubernetes沒有運(yùn)行在云平臺(tái)上,節(jié)點(diǎn)ID就是必需的。IP地址可以變化,并且可以包含多種類型的IP地址,如公共IP,私有IP,動(dòng)態(tài)IP,ipv6等等。

節(jié)點(diǎn)周期

通常來說節(jié)點(diǎn)有 Pending,Running,Terminated三個(gè)周期,如果Kubernetes發(fā)現(xiàn)了一個(gè)節(jié)點(diǎn)并且其可用,那么Kubernetes就把它標(biāo)記為 Pending。然后在某個(gè)時(shí)刻,Kubernetes將會(huì)標(biāo)記其為 Running。節(jié)點(diǎn)的結(jié)束周期稱為 Terminated。一個(gè)已經(jīng)terminated的節(jié)點(diǎn)不會(huì)接受和調(diào)度任何請(qǐng)求,并且已經(jīng)在其上運(yùn)行的容器組也會(huì)刪除。

節(jié)點(diǎn)狀態(tài)

節(jié)點(diǎn)的狀態(tài)主要是用來描述處于 Running的節(jié)點(diǎn)。當(dāng)前可用的有 NodeReachableNodeReady 。以后可能會(huì)增加其他狀態(tài)。NodeReachable 表示集群可達(dá)。NodeReady表示kubelet返回 StatusOk并且HTTP狀態(tài)檢查健康。

節(jié)點(diǎn)管理

節(jié)點(diǎn)并非Kubernetes創(chuàng)建,而是由云平臺(tái)創(chuàng)建,或者就是物理機(jī)器、虛擬機(jī)。在Kubernetes中,節(jié)點(diǎn)僅僅是一條記錄,節(jié)點(diǎn)創(chuàng)建之后,Kubernetes會(huì)檢查其是否可用。在Kubernetes中,節(jié)點(diǎn)用如下結(jié)構(gòu)保存:

{
  "id": "10.1.2.3",
  "kind": "Minion",
  "apiVersion": "v1beta1",
  "resources": {
    "capacity": {
      "cpu": 1000,
      "memory": 1073741824
    },
  },
  "labels": {
    "name": "my-first-k8s-node",
  },
}

Kubernetes校驗(yàn)節(jié)點(diǎn)可用依賴于id。在當(dāng)前的版本中,有兩個(gè)接口可以用來管理節(jié)點(diǎn):節(jié)點(diǎn)控制和Kube管理。

節(jié)點(diǎn)控制

在Kubernetes主節(jié)點(diǎn)中,節(jié)點(diǎn)控制器是用來管理節(jié)點(diǎn)的組件。主要包含:

  • 集群范圍內(nèi)節(jié)點(diǎn)同步
  • 單節(jié)點(diǎn)生命周期管理

節(jié)點(diǎn)控制有一個(gè)同步輪尋,主要監(jiān)聽所有云平臺(tái)的虛擬實(shí)例,會(huì)根據(jù)節(jié)點(diǎn)狀態(tài)創(chuàng)建和刪除。可以通過 --node_sync_period標(biāo)志來控制該輪尋。如果一個(gè)實(shí)例已經(jīng)創(chuàng)建,節(jié)點(diǎn)控制將會(huì)為其創(chuàng)建一個(gè)結(jié)構(gòu)。同樣的,如果一個(gè)節(jié)點(diǎn)被刪除,節(jié)點(diǎn)控制也會(huì)刪除該結(jié)構(gòu)。在Kubernetes啟動(dòng)時(shí)可用通過 --machines標(biāo)記來顯示指定節(jié)點(diǎn)。同樣可以使用 kubectl來一條一條的添加節(jié)點(diǎn),兩者是相同的。通過設(shè)置 --sync_nodes=false標(biāo)記來禁止集群之間的節(jié)點(diǎn)同步,你也可以使用api/kubectl 命令行來增刪節(jié)點(diǎn)。

容器組

在Kubernetes中,使用的最小單位是容器組,容器組是創(chuàng)建,調(diào)度,管理的最小單位。

什么是容器組

一個(gè)容器組使用相同的Dokcer容器并共享卷(掛載點(diǎn))。一個(gè)容器組是一個(gè)特定運(yùn)用的打包集合,包含一個(gè)或多個(gè)容器。

和運(yùn)行的容器類似,一個(gè)容器組被認(rèn)為只有很短的運(yùn)行周期。容器組被調(diào)度到一組節(jié)點(diǎn)運(yùn)行,知道容器的生命周期結(jié)束或者其被刪除。如果節(jié)點(diǎn)死掉,運(yùn)行在其上的容器組將會(huì)被刪除而不是重新調(diào)度。(也許在將來的版本中會(huì)添加容器組的移動(dòng))。

容器組設(shè)計(jì)的初衷

資源共享和通信

容器組主要是為了數(shù)據(jù)共享和它們之間的通信。

在一個(gè)容器組中,容器都使用相同的網(wǎng)絡(luò)地址和端口,可以通過本地網(wǎng)絡(luò)來相互通信。每個(gè)容器組都有獨(dú)立的ip,可用通過網(wǎng)絡(luò)來和其他物理主機(jī)或者容器通信。

容器組有一組存儲(chǔ)卷(掛載點(diǎn)),主要是為了讓容器在重啟之后可以不丟失數(shù)據(jù)。

容器組管理

容器組是一個(gè)運(yùn)用管理和部署的高層次抽象,同時(shí)也是一組容器的接口。容器組是部署、水平放縮的最小單位。

容器組的使用

容器組可以通過組合來構(gòu)建復(fù)雜的運(yùn)用,其本來的意義包含:

  • 內(nèi)容管理,文件和數(shù)據(jù)加載以及本地緩存管理等。
  • 日志和檢查點(diǎn)備份,壓縮,快照等。
  • 監(jiān)聽數(shù)據(jù)變化,跟蹤日志,日志和監(jiān)控代理,消息發(fā)布等。
  • 代理,網(wǎng)橋
  • 控制器,管理,配置以及更新

替代方案

為什么不在一個(gè)單一的容器里運(yùn)行多個(gè)程序?

  • 1.透明化。為了使容器組中的容器保持一致的基礎(chǔ)設(shè)施和服務(wù),比如進(jìn)程管理和資源監(jiān)控。這樣設(shè)計(jì)是為了用戶的便利性。
  • 2.解偶軟件之間的依賴。每個(gè)容器都可能重新構(gòu)建和發(fā)布,Kubernetes必須支持熱發(fā)布和熱更新(將來)。
  • 3.方便使用。用戶不必運(yùn)行獨(dú)立的程序管理,也不用擔(dān)心每個(gè)運(yùn)用程序的退出狀態(tài)。
  • 4.高效。考慮到基礎(chǔ)設(shè)施有更多的職責(zé),容器必須要輕量化。

容器組生命周期

本小結(jié)將會(huì)簡(jiǎn)單描述容器狀態(tài)類型,容器組生命周期,事件,重啟策略和復(fù)制控制器。

狀態(tài)值

pending

容器組已經(jīng)被節(jié)點(diǎn)接受,但有一個(gè)或多個(gè)容器還沒有運(yùn)行起來。這將包含某些節(jié)點(diǎn)正在下載鏡像的時(shí)間,這種情形會(huì)依賴于網(wǎng)絡(luò)情況。

running

容器組已經(jīng)被調(diào)度到節(jié)點(diǎn),并且所有的容器都已經(jīng)啟動(dòng)。至少有一個(gè)容器處于運(yùn)行狀態(tài)(或者處于重啟狀態(tài))。

succeeded

所有的容器都正常退出。

failed

容器組中所有容器都意外中斷了。

容器組生命周期

通常來說,如果容器組被創(chuàng)建了就不會(huì)自動(dòng)銷毀,除非被某種行為出發(fā),而觸發(fā)此種情況可能是人為,或者復(fù)制控制器所為。唯一例外的是容器組由 succeeded狀態(tài)成功退出,或者在一定時(shí)間內(nèi)重試多次依然失敗。

如果某個(gè)節(jié)點(diǎn)死掉或者不能連接,那么節(jié)點(diǎn)控制器將會(huì)標(biāo)記其上的容器組的狀態(tài)為 failed。

舉例

  • 容器組狀態(tài) running,有1容器,容器正常退出- 記錄完成事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時(shí):容器組變?yōu)?succeeded
  • 從不:容器組變?yōu)?succeeded

  • 容器組狀態(tài) running,有1容器,容器異常退出- 記錄失敗事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時(shí):重啟容器,容器組保持 running
  • 從不:容器組變?yōu)?failed

  • 容器組狀態(tài) running,有2容器,有1容器異常退出- 記錄失敗事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時(shí):重啟容器,容器組保持 running
  • 從不:容器組保持 running- 當(dāng)有2容器退出

  • 記錄失敗事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時(shí):重啟容器,容器組保持 running
  • 從不:容器組變?yōu)?failed

  • 容器組狀態(tài) running,容器內(nèi)存不足- 標(biāo)記容器錯(cuò)誤中斷
  • 記錄內(nèi)存不足事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時(shí):重啟容器,容器組保持 running
  • 從不:記錄錯(cuò)誤事件,容器組變?yōu)?failed

  • 容器組狀態(tài) running,一塊磁盤死掉- 殺死所有容器
  • 記錄事件
  • 容器組變?yōu)?failed
  • 如果容器組運(yùn)行在一個(gè)控制器下,容器組將會(huì)在其他地方重新創(chuàng)建

  • 容器組狀態(tài) running,對(duì)應(yīng)的節(jié)點(diǎn)段溢出- 節(jié)點(diǎn)控制器等到超時(shí)
  • 節(jié)點(diǎn)控制器標(biāo)記容器組 failed
  • 如果容器組運(yùn)行在一個(gè)控制器下,容器組將會(huì)在其他地方重新創(chuàng)建

Replication Controllers

服務(wù)

標(biāo)簽

接口權(quán)限

web界面

命令行操作


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)