以卡通的方式了解Kubernetes
最近,我開始了Kubernetes之旅,希望更好地了解其內(nèi)部。 我在這些方面做了一個(gè)演講。
容器
在我們嘗試了解Kubernetes之前,讓我們花一點(diǎn)時(shí)間來(lái)澄清什么是容器以及它們?yōu)槭裁慈绱耸軞g迎。 畢竟,在不知道容器是什么的情況下談?wù)撊萜骶幣牌?Kubernetes)是毫無(wú)意義的。

Container
"容器"是一個(gè)用來(lái)存放您放入的所有物品的容器。
像應(yīng)用程序代碼,依賴庫(kù)以及它的依賴關(guān)系一直到內(nèi)核。 這里的關(guān)鍵概念是隔離。 將所有內(nèi)容與其余內(nèi)容隔離開,以便您更好地控制它們。 容器提供三種隔離類型
- Workspace工作區(qū)隔離(進(jìn)程,網(wǎng)絡(luò))
- 資源隔離(CPU,內(nèi)存)
- 文件系統(tǒng)隔離(文件系統(tǒng))
考慮一下像VM一樣的容器。 它們精簡(jiǎn),快速(啟動(dòng))且體積小。 而且,所有這些都沒有分離。 取而代之的是,他們使用linux系統(tǒng)中存在的構(gòu)造(例如cgroups,namespace名稱空間)在其上構(gòu)建了一個(gè)不錯(cuò)的抽象。
現(xiàn)在我們知道什么是容器了,很容易理解為什么它們很受歡迎。 不僅可以發(fā)布應(yīng)用程序二進(jìn)制/代碼,還可以以實(shí)用的方式交付運(yùn)行應(yīng)用程序所需的整個(gè)環(huán)境,因?yàn)榭梢詫⑷萜鳂?gòu)建為非常小的單元。 解決"在我的機(jī)器上工作"問題的完美解決方案
什么時(shí)候使用Kubernetes?
容器一切都很好,軟件開發(fā)人員的生活現(xiàn)在要好得多。 那么,為什么我們需要另一項(xiàng)技術(shù),如Kubernetes這樣的容器協(xié)調(diào)器呢?

進(jìn)入此狀態(tài)時(shí),需要用到太多容器來(lái)管理
問:我的前端容器在哪里,我要在其中運(yùn)行多少個(gè)容器? 使用容器協(xié)調(diào)器
問:如何使前端容器與新創(chuàng)建的后端容器對(duì)話?答:對(duì)IP進(jìn)行硬編碼。 或者,使用容器協(xié)調(diào)器
問:如何進(jìn)行滾動(dòng)升級(jí)?答:在每個(gè)步驟中手動(dòng)控制。 或者,使用容器協(xié)調(diào)器
為什么我更喜歡Kubernetes
有多個(gè)編排器,例如docker swarm,Mesos和Kubernetes。 我的選擇是Kubernetes(因此是本文),因?yàn)镵ubernetes是……

……就像樂高積木一樣。 它不僅具有大規(guī)模運(yùn)行容器協(xié)調(diào)器所需的組件,而且還具有使用自定義組件交換不同組件的靈活性。 你可以plugin一個(gè)自定義的調(diào)度程序。當(dāng)需要一個(gè)新的資源類型,你可以編寫一個(gè)CRD(Custom Resource Definition客戶資源定義)。 此外,社區(qū)非?;钴S,并且工具發(fā)展迅速。
Kubernetes體系結(jié)構(gòu)

每個(gè)Kubernetes集群都有兩種類型的節(jié)點(diǎn)(機(jī)器)。 主節(jié)點(diǎn)(Master)和工作節(jié)點(diǎn)(Worker)。 顧名思義,Master是在運(yùn)行有效負(fù)載(應(yīng)用程序)的地方控制和監(jiān)視群集。
群集可以與單個(gè)主節(jié)點(diǎn)一起使用。 但是最好擁有三個(gè)以實(shí)現(xiàn)高可用性(稱為HA群集)
讓我們仔細(xì)看一下主節(jié)點(diǎn)及其組成

etcd:數(shù)據(jù)庫(kù),用于存儲(chǔ)有關(guān)kubernetes對(duì)象,其當(dāng)前狀態(tài),訪問信息和其他集群配置信息的所有數(shù)據(jù)
API服務(wù)器:RESTful API服務(wù)器,公開端點(diǎn)以操作集群。 主節(jié)點(diǎn)和工作節(jié)點(diǎn)中的幾乎所有組件都與該服務(wù)器通信以執(zhí)行其職責(zé)
調(diào)度程序Scheduler :負(fù)責(zé)決定哪個(gè)有效負(fù)載需要在哪臺(tái)機(jī)器上運(yùn)行
控制管理器Control Manager:這是一個(gè)控制循環(huán),它監(jiān)視群集的狀態(tài)(通過調(diào)用API服務(wù)器來(lái)獲取此數(shù)據(jù))并采取措施將其置于預(yù)期狀態(tài)

kubelet:是工作程序節(jié)點(diǎn)的心臟。 它與主節(jié)點(diǎn)API服務(wù)器通信并運(yùn)行為其節(jié)點(diǎn)安排的容器
kube代理 kubeproxy:使用IP表/ IPVS處理Pod的網(wǎng)絡(luò)需求
Pod:運(yùn)行您所有容器的kubernetes的實(shí)體。 如果沒有Pod的抽象,就無(wú)法在kubernetes中運(yùn)行容器。 Pod定義了對(duì)容器之間的聯(lián)網(wǎng)方式等至關(guān)重要的功能

Happy pod
一個(gè)Pod可以有多個(gè)容器,并且在這些容器中運(yùn)行的所有服務(wù)器都可以將彼此視為本地主機(jī)。 這使得將應(yīng)用程序的不同方面分離為單獨(dú)的容器,并可以方便的把它們?nèi)孔鳛橐粋€(gè)整體加載。 有不同的Pod模式,例如邊車(Side Car),代理(Proxy)和大使(ambassador),可以滿足不同的需求。
Pod聯(lián)網(wǎng)接口提供了一種將其與同一節(jié)點(diǎn)和其他工作程序節(jié)點(diǎn)中的其他Pod聯(lián)網(wǎng)的機(jī)制

此外,每個(gè)Pod都將分配有自己的IP地址,kube-proxy會(huì)使用該IP地址來(lái)路由流量。 而且此IP地址僅在群集中可見
所有容器也可以看到安裝在Pod容器內(nèi)的卷,有時(shí)這些卷可用于在容器之間進(jìn)行異步通信。 例如,假設(shè)您的應(yīng)用是照片上傳應(yīng)用(例如instagram),它可以將這些文件保存在一個(gè)卷中,而同一容器中的另一個(gè)容器可以監(jiān)視該卷中的新文件,并開始對(duì)其進(jìn)行處理以創(chuàng)建多種尺寸, 將它們上傳到云存儲(chǔ)
控制器
在kubernetes中,有很多控制器,例如ReplicaSet,Replication Controllers,Deployments,StatefulSet和Service。 這些是以一種或另一種方式控制Pod對(duì)象。 讓我們看看一些重要的控制器。
復(fù)制集 ReplicaSet

ReplicaSet doing what it is good at. Replicating pods
該控制器的主要職責(zé)是創(chuàng)建給定Pod的副本。 如果Pod因某種原因死亡,則會(huì)通知該控制器,并立即采取行動(dòng)以創(chuàng)建新的Pod
部署 Deployments

Deployment (with a messy hair) trying to control the ReplicaSet
部署是一個(gè)高階對(duì)象,它使用ReplicaSet來(lái)管理副本。 它通過放大新的ReplicaSet和縮小(最終刪除)現(xiàn)有的ReplicaSet來(lái)提供滾動(dòng)升級(jí)。
服務(wù) Service

Service represented as a drone delivering data packets to corresponding pods
服務(wù)是一個(gè)控制器對(duì)象,其主要職責(zé)是在將"數(shù)據(jù)包"分發(fā)到相應(yīng)節(jié)點(diǎn)時(shí)充當(dāng)負(fù)載平衡器。 基本上,它是一種控制器構(gòu)造,用于在工作節(jié)點(diǎn)之間對(duì)相似的Pod(通常由Pod標(biāo)簽標(biāo)識(shí))進(jìn)行分組。
假設(shè)您的"前端"應(yīng)用程序想與"后端"應(yīng)用程序通信,則每個(gè)應(yīng)用程序可能有許多正在運(yùn)行的實(shí)例。 您不必?fù)?dān)心對(duì)每個(gè)后端Pod的IP進(jìn)行硬編碼,而是將數(shù)據(jù)包發(fā)送到后端服務(wù),然后由后端服務(wù)決定如何進(jìn)行負(fù)載平衡并相應(yīng)地轉(zhuǎn)發(fā)。
PS:請(qǐng)注意,服務(wù)更像是一個(gè)虛擬實(shí)體,因?yàn)樗袛?shù)據(jù)包路由均由IP表/ IPVS / CNI插件處理。 它只是使它更容易被視為一個(gè)真正的實(shí)體,讓他們脫穎而出,以了解其在kubernetes生態(tài)系統(tǒng)中的作用。
入口 Ingress

Ingress a floating platform through which all the packets flow into the cluster
入口控制器是與外界聯(lián)系的單點(diǎn),可以與集群中運(yùn)行的所有服務(wù)進(jìn)行對(duì)話。 這使我們可以輕松地在單個(gè)位置設(shè)置安全策略,監(jiān)控甚至記錄日志
P.S:Kubernetes中還有很多其他控制器對(duì)象,例如DaemonSets,StatefulSets和Jobs。 還有一些諸如Secrets,ConfigMaps之類的對(duì)象,用于存儲(chǔ)應(yīng)用程序的機(jī)密和配置。 我將在收到下一篇博客文章時(shí)介紹它們。