中間層 k8s(Kubernetes) 到底是什么,架構(gòu)是怎么樣的?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
你是一個(gè)程序員,你用代碼寫(xiě)了一個(gè)博客應(yīng)用服務(wù),并將它部署在了云平臺(tái)上。 所以你用了一些工具自動(dòng)重啟掛掉的應(yīng)用服務(wù),并且將應(yīng)用服務(wù)部署在了好幾個(gè)服務(wù)器上,總算抗住了。 后來(lái)你又上線了商城應(yīng)用服務(wù)和語(yǔ)音應(yīng)用服務(wù),隨著應(yīng)用服務(wù)變多,需求也千奇百怪。有的應(yīng)用服務(wù)不希望被外網(wǎng)訪問(wèn)到,有的部署的時(shí)候要求內(nèi)存得大于 xxGB 才能正常跑。 原本就沒(méi)時(shí)間找女朋友的你,現(xiàn)在哭得更大聲了。 那么問(wèn)題就來(lái)了,有沒(méi)有一個(gè)辦法,可以解決上面的問(wèn)題?當(dāng)然有,沒(méi)有什么是加一個(gè)中間層不能解決的,如果有,那就再加一層。 Kubernetes 是什么?Kubernetes,它是 G 家開(kāi)源的神器,因?yàn)閱卧~太長(zhǎng),所以我們習(xí)慣省略中間 8 個(gè)字母,簡(jiǎn)稱它為 k8s。 它介于應(yīng)用服務(wù)和服務(wù)器之間,能夠通過(guò)策略,協(xié)調(diào)和管理多個(gè)應(yīng)用服務(wù),只需要一個(gè) yaml 文件配置,定義應(yīng)用的部署順序等信息,就能自動(dòng)部署應(yīng)用到各個(gè)服務(wù)器上,還能讓它們掛了自動(dòng)重啟,自動(dòng)擴(kuò)縮容。 聽(tīng)起來(lái)有些厲害,它是怎么實(shí)現(xiàn)這些功能的呢? Kubernetes 架構(gòu)原理為了實(shí)現(xiàn)上面的功能,Kubernetes 會(huì)將我們的服務(wù)器劃為兩部分,一部分叫控制平面(control plane,以前叫master),另一部分叫工作節(jié)點(diǎn),也就是 Node。簡(jiǎn)單來(lái)說(shuō)它們的關(guān)系就是老板和打工人, 用現(xiàn)在流行的說(shuō)法就是訓(xùn)練師和帕魯。控制平面負(fù)責(zé)控制和管理各個(gè) Node,而 Node 則負(fù)責(zé)實(shí)際運(yùn)行各個(gè)應(yīng)用服務(wù)。 我們依次看下這兩者的內(nèi)部架構(gòu)。 控制平面內(nèi)部組件
以上就是控制平面內(nèi)部的組件。 我們接下來(lái)再看看 Node 里有哪些組件。 Node 內(nèi)部組件Node 是實(shí)際的工作節(jié)點(diǎn),它既可以是裸機(jī)服務(wù)器,也可以是虛擬機(jī)。它會(huì)負(fù)責(zé)實(shí)際運(yùn)行各個(gè)應(yīng)用服務(wù)。多個(gè)應(yīng)用服務(wù)共享一臺(tái) Node 上的內(nèi)存和 CPU 等計(jì)算資源。 在文章開(kāi)頭,我們聊到了部署多個(gè)應(yīng)用服務(wù)的場(chǎng)景。以前我們需要上傳代碼到服務(wù)器,而用了 k8s 之后,我們只需要將服務(wù)代碼打包成Container Image(容器鏡像),就能一行命令將它部署。 如果你不了解容器鏡像的含義,你可以簡(jiǎn)單理解為它其實(shí)就是將應(yīng)用代碼和依賴的系統(tǒng)環(huán)境打了個(gè)壓縮包,在任意一臺(tái)機(jī)器上解壓這個(gè)壓縮包,就能正常運(yùn)行服務(wù)。為了下載和部署鏡像,Node 中會(huì)有一個(gè) Container runtime 組件。 每個(gè)應(yīng)用服務(wù)都可以認(rèn)為是一個(gè) Container(容器), 并且大多數(shù)時(shí)候,我們還會(huì)為應(yīng)用服務(wù)搭配一個(gè)日志收集器 Container 或監(jiān)控收集器 Container,多個(gè) Container 共同組成一個(gè)一個(gè) Pod,它運(yùn)行在 Node 上。 k8s 可以將 pod 從某個(gè) Node 調(diào)度到另一個(gè) Node,還能以 pod 為單位去做重啟和動(dòng)態(tài)擴(kuò)縮容的操作。 另外,前面提到控制平面會(huì)用 Controller Manager (通過(guò)API Server)控制 Node 創(chuàng)建和關(guān)閉服務(wù),那 Node 也得有個(gè)組件能接收到這個(gè)命令才能去做這些動(dòng)作,這個(gè)組件叫 kubelet,它主要負(fù)責(zé)管理和監(jiān)控 Pod。最后,Node 中還有個(gè) Kube Proxy ,它負(fù)責(zé) Node 的網(wǎng)絡(luò)通信功能,有了它,外部請(qǐng)求就能被轉(zhuǎn)發(fā)到 Pod 內(nèi)。 Cluster控制平面和Node 共同構(gòu)成了一個(gè) Cluster,也就是集群。在公司里,我們一般會(huì)構(gòu)建多個(gè)集群, 比如測(cè)試環(huán)境用一個(gè)集群,生產(chǎn)環(huán)境用另外一個(gè)集群。同時(shí),為了將集群內(nèi)部的服務(wù)暴露給外部用戶使用,我們一般還會(huì)部署一個(gè)入口控制器,比如 Ingress 控制器(比如Nginx),它可以提供一個(gè)入口讓外部用戶訪問(wèn)集群內(nèi)部服務(wù)。 kubectl 是什么上面提到說(shuō)我們可以使用 k8s 提供的 API 去創(chuàng)建服務(wù),但問(wèn)題就來(lái)了,這是需要我們自己寫(xiě)代碼去調(diào)用這些 API 嗎?答案是不需要,k8s 為我們準(zhǔn)備了一個(gè)命令行工具 kubectl,我們只需要執(zhí)行命令,它內(nèi)部就會(huì)調(diào)用 k8s 的 API。 接下來(lái)我們以部署服務(wù)為例子,看下 k8s 是怎么工作的。 怎么部署服務(wù)?首先我們需要編寫(xiě) YAML 文件,在里面定義 Pod 里用到了哪些鏡像,占用多少內(nèi)存和 CPU 等信息。然后使用 kubectl 命令行工具執(zhí)行 至此服務(wù)完成創(chuàng)建。 整個(gè)過(guò)程下來(lái),我們只需要寫(xiě)一遍 yaml 文件,和執(zhí)行一次 kubectl 命令,比以前省心太多了!部署完服務(wù)后,我們來(lái)看下服務(wù)是怎么被調(diào)用的。 怎么調(diào)用服務(wù)?以前外部用戶小明,直接在瀏覽器上發(fā)送 http 請(qǐng)求,就能打到我們服務(wù)器上的 Nginx,然后轉(zhuǎn)發(fā)到部署的服務(wù)內(nèi)。用了 k8s 之后,外部請(qǐng)求會(huì)先到達(dá) Kubernetes 集群的 Ingress 控制器,然后請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到 Kubernetes 內(nèi)部的某個(gè) Node 的 Kube Proxy 上,再找到對(duì)應(yīng)的 pod,然后才是轉(zhuǎn)發(fā)到內(nèi)部容器服務(wù)中,處理結(jié)果原路返回,到這就完成了一次服務(wù)調(diào)用。 到這里我們就大概了解了 k8s 的工作原理啦,它本質(zhì)上就是應(yīng)用服務(wù)和服務(wù)器之間的中間層,通過(guò)暴露一系列 API 能力讓我們簡(jiǎn)化服務(wù)的部署運(yùn)維流程。 并且,不少中大廠基于這些 API 能力搭了自己的服務(wù)管理平臺(tái),程序員不再需要敲 kubectl 命令,直接在界面上點(diǎn)點(diǎn)幾下,就能完成服務(wù)的部署和擴(kuò)容等操作,是真的嘎嘎好用。 總結(jié)
最后給大家留一個(gè)問(wèn)題,我們提到 k8s 的時(shí)候,一般會(huì)提一下 docker, 但為了避免大家混淆,我在寫(xiě)這篇文章的時(shí)候,只字不提 docker,你知道 docker 和 k8s 之間是什么關(guān)系嗎? 該文章在 2024/7/24 23:22:22 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |