圖文 | 你女朋友也能看懂的 Kubernetes!
最近,我開始了 Kubernetes 之旅,并且希望更好地了解其內(nèi)部原理。我在這些方面做了一個演講!
容器
在我們嘗試了解 Kubernetes 之前,讓我們花一點(diǎn)時間來澄清容器是什么,以及它們?yōu)槭裁慈绱耸軞g迎。
畢竟,在不知道容器是什么的情況下談?wù)撊萜骶幣牌?Kubernetes)是沒有意義的!
容器
“容器”是一個用來存放你放入的所有物品的容器。像應(yīng)用程序代碼,依賴庫以及它的依賴關(guān)系一直到內(nèi)核。
這里的關(guān)鍵概念是隔離。將所有內(nèi)容與其余內(nèi)容隔離開,以便你更好地控制它們。
容器提供三種隔離類型:
- 工作區(qū)隔離(流程,網(wǎng)絡(luò))
- 資源隔離(CPU,內(nèi)存)
- 文件系統(tǒng)隔離(聯(lián)合文件系統(tǒng))
考慮一下像 VM 一樣的容器。它們精簡,快速(啟動)且體積小。而且,所有這些都沒有構(gòu)建起來。
取而代之的是,他們使用 Linux 系統(tǒng)中存在的結(jié)構(gòu)(例如 cgroups,namespaces)在其上構(gòu)建了一個不錯的抽象。
現(xiàn)在我們知道什么是容器了,很容易理解為什么它們很受歡迎。不僅可以分發(fā)應(yīng)用程序的二進(jìn)制/代碼,還可以以實(shí)用的方式交付運(yùn)行應(yīng)用程序所需的整個環(huán)境。
因?yàn)榭梢詫⑷萜鳂?gòu)建為非常小的單元,解決“在我的機(jī)器上工作”問題的完美解決方案。
什么時候使用 Kubernetes?
容器一切都很好,軟件開發(fā)人員的生活現(xiàn)在要好很多。那么,為什么我們需要另一項(xiàng)技術(shù),如 Kubernetes 這樣的容器編排工具呢?
當(dāng)進(jìn)入某個狀態(tài)時,你需要用到它來管理眾多容器。
問:我的前端容器在哪里,我要運(yùn)行幾個?
答:很難說,使用容器編排工具。
問:如何使前端容器與新創(chuàng)建的后端容器對話?
答:對 IP 進(jìn)行硬編碼,或者,使用容器編排工具。
問:如何進(jìn)行滾動升級?
答:在每個步驟中手動握住,或者,使用容器編排工具。
為什么我更喜歡 Kubernetes
有很多容器編排工具,例如 Docker Swarm,Mesos 和 Kubernetes。我的選擇是 Kubernetes(因此有了本文),因?yàn)? Kubernetes 是……
就像樂高積木一樣,它不僅具有大規(guī)模運(yùn)行容器編排所需的組件,而且還具有使用自定義組件交換內(nèi)部和外部不同組件的靈活性。
想要擁有一個自定義的調(diào)度程序,也很方便。需要具有新的資源類型,編寫一個 CRD。此外,社區(qū)非常活躍,并且工具迅速發(fā)展。
Kubernetes 架構(gòu)
每個 Kubernetes 集群都有兩種類型的節(jié)點(diǎn),主節(jié)點(diǎn)和工作節(jié)點(diǎn)。顧名思義,主節(jié)點(diǎn)是在工作程序運(yùn)行有效負(fù)載(應(yīng)用程序)的地方控制和監(jiān)視群集。
集群可以與單個主節(jié)點(diǎn)一起工作,但是最好擁有三個以實(shí)現(xiàn)高可用性(稱為 HA 群集)。
讓我們仔細(xì)看一下主節(jié)點(diǎn)及其組成:
①etcd:數(shù)據(jù)庫,用于存儲有關(guān) Kubernetes 對象,其當(dāng)前狀態(tài),訪問信息和其他集群配置信息的所有數(shù)據(jù)。
②API Server:RESTful API 服務(wù)器,公開端點(diǎn)以操作整個集群。主節(jié)點(diǎn)和工作節(jié)點(diǎn)中的幾乎所有組件都與該服務(wù)器通信以執(zhí)行其職責(zé)。
③調(diào)度程序:負(fù)責(zé)決定哪個有效負(fù)載需要在哪臺機(jī)器上運(yùn)行。
④控制管理器:這是一個控制循環(huán),它監(jiān)視集群的狀態(tài)(通過調(diào)用 API 服務(wù)器來獲取此數(shù)據(jù))并采取措施將其置于預(yù)期狀態(tài)。
⑤kubelet:是工作節(jié)點(diǎn)的心臟。它與主節(jié)點(diǎn) API 服務(wù)器通信并運(yùn)行為其節(jié)點(diǎn)安排的容器。
⑥kube-proxy:使用 IP 表/IPVS 處理 Pod 的網(wǎng)絡(luò)需求。
⑦Pod:運(yùn)行所有容器的 Kubernetes 的功勞。如果沒有 Pod 的抽象,就無法在 Kubernetes 中運(yùn)行容器。Pod 添加了對容器之間的 Kuberenetes 聯(lián)網(wǎng)方式至關(guān)重要的功能。
快樂的 Pod
一個 Pod 可以有多個容器,并且在這些容器中運(yùn)行的所有服務(wù)器都可以將彼此視為本地主機(jī)。
這使得將應(yīng)用程序的不同方面分離為單獨(dú)的容器,并將它們?nèi)孔鳛橐粋€容器加載在一起非常方便。
有多種不同的 Pod 模式,例如 Sidecar,Proxy 和大使,可以滿足不同的需求。查看這篇文章[1]可以了解有關(guān)它們的更多信息。
Pod 網(wǎng)絡(luò)接口提供了一種將其與同一節(jié)點(diǎn)和其他工作節(jié)點(diǎn)中的其他 Pod 通信的機(jī)制。
而且,每個 Pod 都將分配有自己的 IP 地址,kube-proxy 將使用該 IP 地址來路由流量,而且此 IP 地址僅在群集中可見。
所有容器也都可以看到安裝在容器內(nèi)的卷,有時可以使用這些卷在容器之間進(jìn)行異步通信。
例如,假設(shè)你的應(yīng)用是照片上傳應(yīng)用(例如 Instagram),它可以將這些文件保存在一個卷中,而同一 Pod 中的另一個容器可以監(jiān)視該卷中的新文件,并開始對其進(jìn)行處理以創(chuàng)建多種尺寸,將它們上傳到云存儲。
控制器
在 Kubernetes 中,有很多控制器,例如 ReplicaSet,Replication Controllers,Deployments,StatefulSets 和 Service。
這些是以一種或另一種方式控制 Pod 的對象。讓我們看一些重要的。
(1) ReplicaSet
ReplicaSet 做自己擅長的事情,復(fù)制 Pod
該控制器的主要職責(zé)是創(chuàng)建給定 Pod 的副本,如果 Pod 因某種原因死亡,則會通知該控制器,并立即跳入操作以創(chuàng)建新的 Pod。
(2) Deployment
試圖控制 ReplicaSet 的部署(頭發(fā)凌亂)
部署是一個高階對象,它使用 ReplicaSet 來管理副本。它通過放大新的 ReplicaSet 和縮小(最終刪除)現(xiàn)有的 ReplicaSet 來提供滾動升級。
(3) Service
表示為無人機(jī)的服務(wù),將數(shù)據(jù)包傳遞到相應(yīng)的 Pod
服務(wù)是一個控制器對象,其主要職責(zé)是在將“數(shù)據(jù)包”分發(fā)到相應(yīng)節(jié)點(diǎn)時充當(dāng)負(fù)載平衡器。
基本上,它是一種控制器構(gòu)造,用于在工作節(jié)點(diǎn)之間對相似的 Pod(通常由 Pod 標(biāo)簽標(biāo)識)進(jìn)行分組。
假設(shè)你的“前端”應(yīng)用程序想與“后端”應(yīng)用程序通信,則每個應(yīng)用程序可能有許多正在運(yùn)行的實(shí)例。
你不必?fù)?dān)心對每個后端 Pod 的 IP 進(jìn)行硬編碼,而是將數(shù)據(jù)包發(fā)送到后端服務(wù),然后由后端服務(wù)決定如何進(jìn)行負(fù)載平衡并相應(yīng)地轉(zhuǎn)發(fā)。
PS:請注意,服務(wù)更像是一個虛擬實(shí)體,因?yàn)樗袛?shù)據(jù)包路由均由 IP 表/IPVS/CNI 插件處理。
它只是使它更容易被視為一個真正的實(shí)體,讓它們脫穎而出以了解其在 Kubernetes 生態(tài)系統(tǒng)中的作用。
(4) Ingress
進(jìn)入一個浮動平臺,所有數(shù)據(jù)包都通過該平臺流入集群
入口控制器是與外界聯(lián)系的單點(diǎn),可以與集群中運(yùn)行的所有服務(wù)進(jìn)行對話。這使我們可以輕松地在單個位置設(shè)置安全策略,監(jiān)視甚至記錄日志。
PS:Kubernetes 中還有很多其他控制器對象,例如 DaemonSets,StatefulSets 和 Jobs。