【k8s】Kubernetes 的基本架構(gòu)

我們看到容器技術(shù)只實(shí)現(xiàn)了應(yīng)用的打包分發(fā),到運(yùn)維真正落地實(shí)施的時(shí)候仍然會(huì)遇到很多困難,所以就需要用容器編排技術(shù)來(lái)解決這些問(wèn)題,而 Kubernetes 是這個(gè)領(lǐng)域的唯一霸主,已經(jīng)成為了“事實(shí)標(biāo)準(zhǔn)”。

那么,Kubernetes 憑什么能擔(dān)當(dāng)這樣的領(lǐng)軍重任呢?難道僅僅因?yàn)樗怯?Google 主導(dǎo)開發(fā)的嗎?

我們一起來(lái)看看 Kubernetes 的內(nèi)部架構(gòu)和工作機(jī)制,了解它能夠傲視群雄的秘密所在。

Kubernetes 是一個(gè)生產(chǎn)級(jí)別的容器編排平臺(tái)和集群管理系統(tǒng),能夠創(chuàng)建、調(diào)度容器,監(jiān)控、管理服務(wù)器。
容器是什么?容器是軟件,是應(yīng)用,是進(jìn)程。
服務(wù)器是什么?服務(wù)器是硬件,是 CPU、內(nèi)存、硬盤、網(wǎng)卡。
那么,既可以管理軟件,也可以管理硬件,這樣的東西應(yīng)該是什么?
你也許會(huì)脫口而出:這就是一個(gè)操作系統(tǒng)(Operating System)!

沒(méi)錯(cuò),從某種角度來(lái)看,Kubernetes 可以說(shuō)是一個(gè)集群級(jí)別的操作系統(tǒng),主要功能就是資源管理和作業(yè)調(diào)度。
但 Kubernetes 不是運(yùn)行在單機(jī)上管理單臺(tái)計(jì)算資源和進(jìn)程,而是運(yùn)行在多臺(tái)服務(wù)器上管理幾百幾千臺(tái)的計(jì)算資源,以及在這些資源上運(yùn)行的上萬(wàn)上百萬(wàn)的進(jìn)程,規(guī)模要大得多。

image.png

操作系統(tǒng)的一個(gè)重要功能就是抽象,從繁瑣的底層事務(wù)中抽象出一些簡(jiǎn)潔的概念,然后基于這些概念去管理系統(tǒng)資源。

Kubernetes 也是這樣,它的管理目標(biāo)是大規(guī)模的集群和應(yīng)用,必須要能夠把系統(tǒng)抽象到足夠高的層次,分解出一些松耦合的對(duì)象,才能簡(jiǎn)化系統(tǒng)模型,減輕用戶的心智負(fù)擔(dān)。

所以,Kubernetes 扮演的角色就如同一個(gè)“大師級(jí)別”的系統(tǒng)管理員,具有豐富的集群運(yùn)維經(jīng)驗(yàn),獨(dú)創(chuàng)了自己的一套工作方式,不需要太多的外部干預(yù),就能夠自主實(shí)現(xiàn)原先許多復(fù)雜的管理工作。

image.png

Kubernetes 采用了現(xiàn)今流行的“控制面 / 數(shù)據(jù)面”(Control Plane / Data Plane)架構(gòu),集群里的計(jì)算機(jī)被稱為“節(jié)點(diǎn)”(Node),可以是實(shí)機(jī)也可以是虛機(jī),少量的節(jié)點(diǎn)用作控制面來(lái)執(zhí)行集群的管理維護(hù)工作,其他的大部分節(jié)點(diǎn)都被劃歸數(shù)據(jù)面,用來(lái)跑業(yè)務(wù)應(yīng)用。

控制面的節(jié)點(diǎn)在 Kubernetes 里叫做 Master Node,一般簡(jiǎn)稱為 Master,它是整個(gè)集群里最重要的部分,可以說(shuō)是 Kubernetes 的大腦和心臟。

數(shù)據(jù)面的節(jié)點(diǎn)叫做 Worker Node,一般就簡(jiǎn)稱為 Worker 或者 Node,相當(dāng)于 Kubernetes 的手和腳,在 Master 的指揮下干活。
Node 的數(shù)量非常多,構(gòu)成了一個(gè)資源池,Kubernetes 就在這個(gè)池里分配資源,調(diào)度應(yīng)用。因?yàn)橘Y源被“池化”了,所以管理也就變得比較簡(jiǎn)單,可以在集群中任意添加或者刪除節(jié)點(diǎn)。

在這張架構(gòu)圖里,我們還可以看到有一個(gè) kubectl,它就是 Kubernetes 的客戶端工具,用來(lái)操作 Kubernetes,但它位于集群之外,理論上不屬于集群。

·
Kubernetes 的節(jié)點(diǎn)內(nèi)部也具有復(fù)雜的結(jié)構(gòu),是由很多的模塊構(gòu)成的,這些模塊又可以分成組件(Component)和插件(Addon)兩類。

組件實(shí)現(xiàn)了 Kubernetes 的核心功能特性,沒(méi)有這些組件 Kubernetes 就無(wú)法啟動(dòng),而插件則是 Kubernetes 的一些附加功能,屬于“錦上添花”,不安裝也不會(huì)影響 Kubernetes 的正常運(yùn)行。

先來(lái)講講 Master 和 Node 里的組件,然后再捎帶提一下插件,理解了它們的工作流程,你就會(huì)明白為什么 Kubernetes 有如此強(qiáng)大的自動(dòng)化運(yùn)維能力。

Master 里的組件有哪些?
Master 里有 4 個(gè)組件,分別是 apiserver、etcd、scheduler、controller-manager。

image.png

apiserver 是 Master 節(jié)點(diǎn)——同時(shí)也是整個(gè) Kubernetes 系統(tǒng)的唯一入口,它對(duì)外公開了一系列的 RESTful API,并且加上了驗(yàn)證、授權(quán)等功能,所有其他組件都只能和它直接通信,可以說(shuō)是 Kubernetes 里的聯(lián)絡(luò)員。

etcd 是一個(gè)高可用的分布式 Key-Value 數(shù)據(jù)庫(kù),用來(lái)持久化存儲(chǔ)系統(tǒng)里的各種資源對(duì)象和狀態(tài),相當(dāng)于 Kubernetes 里的配置管理員。注意它只與 apiserver 有直接聯(lián)系,也就是說(shuō)任何其他組件想要讀寫 etcd 里的數(shù)據(jù)都必須經(jīng)過(guò) apiserver。

scheduler 負(fù)責(zé)容器的編排工作,檢查節(jié)點(diǎn)的資源狀態(tài),把 Pod 調(diào)度到最適合的節(jié)點(diǎn)上運(yùn)行,相當(dāng)于部署人員。因?yàn)楣?jié)點(diǎn)狀態(tài)和 Pod 信息都存儲(chǔ)在 etcd 里,所以 scheduler 必須通過(guò) apiserver 才能獲得。

controller-manager 負(fù)責(zé)維護(hù)容器和節(jié)點(diǎn)等資源的狀態(tài),實(shí)現(xiàn)故障檢測(cè)、服務(wù)遷移、應(yīng)用伸縮等功能,相當(dāng)于監(jiān)控運(yùn)維人員。同樣地,它也必須通過(guò) apiserver 獲得存儲(chǔ)在 etcd 里的信息,才能夠?qū)崿F(xiàn)對(duì)資源的各種操作。

這 4 個(gè)組件也可以容器化了,運(yùn)行在集群的 Pod 里,我們可以用 kubectl 來(lái)查看它們的狀態(tài)。

image.png

Node 里的組件有哪些?

Master 里的 apiserver、scheduler 等組件需要獲取節(jié)點(diǎn)的各種信息才能夠作出管理決策,那這些信息該怎么來(lái)呢?
這就需要 Node 里的 3 個(gè)組件了,分別是 kubelet、kube-proxy、container-runtime。

kubelet 是 Node 的代理,負(fù)責(zé)管理 Node 相關(guān)的絕大部分操作,Node 上只有它能夠與 apiserver 通信,實(shí)現(xiàn)狀態(tài)報(bào)告、命令下發(fā)、啟停容器等功能,相當(dāng)于是 Node 上的一個(gè)“小管家”。

kube-proxy 的作用有點(diǎn)特別,它是 Node 的網(wǎng)絡(luò)代理,只負(fù)責(zé)管理容器的網(wǎng)絡(luò)通信,簡(jiǎn)單來(lái)說(shuō)就是為 Pod 轉(zhuǎn)發(fā) TCP/UDP 數(shù)據(jù)包,相當(dāng)于是專職的“小郵差”。

第三個(gè)組件 container-runtime 我們就比較熟悉了,它是容器和鏡像的實(shí)際使用者,在 kubelet 的指揮下創(chuàng)建容器,管理 Pod 的生命周期,是真正干活的“苦力”。

image.png

我們一定要注意,因?yàn)?Kubernetes 的定位是容器編排平臺(tái),所以它沒(méi)有限定 container-runtime 必須是 Docker,完全可以替換成任何符合標(biāo)準(zhǔn)的其他容器運(yùn)行時(shí),例如 containerd、CRI-O 等等,只不過(guò)在這里我們使用的是 Docker。

這 3 個(gè)組件中只有 kube-proxy 被容器化了,而 kubelet 因?yàn)楸仨氁芾碚麄€(gè)節(jié)點(diǎn),容器化會(huì)限制它的能力,所以它必須在 container-runtime 之外運(yùn)行。

現(xiàn)在,我們?cè)侔?Node 里的組件和 Master 里的組件放在一起來(lái)看,就能夠明白 Kubernetes 的大致工作流程了:

每個(gè) Node 上的 kubelet 會(huì)定期向 apiserver 上報(bào)節(jié)點(diǎn)狀態(tài),apiserver 再存到 etcd 里。

每個(gè) Node 上的 kube-proxy 實(shí)現(xiàn)了 TCP/UDP 反向代理,讓容器對(duì)外提供穩(wěn)定的服務(wù)。

scheduler 通過(guò) apiserver 得到當(dāng)前的節(jié)點(diǎn)狀態(tài),調(diào)度 Pod,然后 apiserver 下發(fā)命令給某個(gè) Node 的 kubelet,kubelet 調(diào)用 container-runtime 啟動(dòng)容器。

controller-manager 也通過(guò) apiserver 得到實(shí)時(shí)的節(jié)點(diǎn)狀態(tài),監(jiān)控可能的異常情況,再使用相應(yīng)的手段去調(diào)節(jié)恢復(fù)。

image.png

其實(shí),這和我們?cè)?Kubernetes 出現(xiàn)之前的操作流程也差不了多少,但 Kubernetes 的高明之處就在于把這些都抽象化規(guī)范化了。
于是,這些組件就好像是無(wú)數(shù)個(gè)不知疲倦的運(yùn)維工程師,把原先繁瑣低效的人力工作搬進(jìn)了高效的計(jì)算機(jī)里,就能夠隨時(shí)發(fā)現(xiàn)集群里的變化和異常,再互相協(xié)作,維護(hù)集群的健康狀態(tài)。

插件(Addons)有哪些?

只要服務(wù)器節(jié)點(diǎn)上運(yùn)行了 apiserver、scheduler、kubelet、kube-proxy、container-runtime 等組件,就可以說(shuō)是一個(gè)功能齊全的 Kubernetes 集群了。
不過(guò)就像 Linux 一樣,操作系統(tǒng)提供的基礎(chǔ)功能雖然“可用”,但想達(dá)到“好用”的程度,還是要再安裝一些附加功能,這在 Kubernetes 里就是插件(Addon)。
由于 Kubernetes 本身的設(shè)計(jì)非常靈活,所以就有大量的插件用來(lái)擴(kuò)展、增強(qiáng)它對(duì)應(yīng)用和集群的管理能力。

插件中我個(gè)人認(rèn)為比較重要的有兩個(gè):DNS 和 Dashboard。

DNS 你應(yīng)該比較熟悉吧,它在 Kubernetes 集群里實(shí)現(xiàn)了域名解析服務(wù),能夠讓我們以域名而不是 IP 地址的方式來(lái)互相通信,是服務(wù)發(fā)現(xiàn)和負(fù)載均衡的基礎(chǔ)。由于它對(duì)微服務(wù)、服務(wù)網(wǎng)格等架構(gòu)至關(guān)重要,所以基本上是 Kubernetes 的必備插件。

Dashboard 就是儀表盤,為 Kubernetes 提供了一個(gè)圖形化的操作界面,非常直觀友好,雖然大多數(shù) Kubernetes 工作都是使用命令行 kubectl,但有的時(shí)候在 Dashboard 上。

image.png

我們一起來(lái)研究了 Kubernetes 的內(nèi)部架構(gòu)和工作機(jī)制,可以看到它的功能非常完善,實(shí)現(xiàn)了大部分常見的運(yùn)維管理工作,而且是全自動(dòng)化的,能夠節(jié)約大量的人力成本。
由于 Kubernetes 的抽象程度比較高,有很多陌生的新術(shù)語(yǔ),不太好理解,所以我畫了一張思維導(dǎo)圖,你可以對(duì)照著再加深理解。

image.png

最后小結(jié)一下今天的要點(diǎn):

  1. Kubernetes 能夠在集群級(jí)別管理應(yīng)用和服務(wù)器,可以認(rèn)為是一種集群操作系統(tǒng)。它使用“控制面 / 數(shù)據(jù)面”的基本架構(gòu),Master 節(jié)點(diǎn)實(shí)現(xiàn)管理控制功能,Worker 節(jié)點(diǎn)運(yùn)行具體業(yè)務(wù)。

  2. Kubernetes 由很多模塊組成,可分為核心的組件和選配的插件兩類。

  3. Master 里有 4 個(gè)組件,分別是 apiserver、etcd、scheduler、controller-manager。

  4. Node 里有 3 個(gè)組件,分別是 kubelet、kube-proxy、container-runtime。

  5. 通常必備的插件有 DNS 和 Dashboard。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容