容器化部署平臺Kubernetes生產(chǎn)之路(一)

最近幾年,隨著Kubernetes在企業(yè)級部署場景下愈發(fā)流行和成熟,如果你從來沒有在自己的項目上嘗試過,說實話,都不好意思給別人打招呼。Kubernetes的流行和微服務,容器化技術(shù)的發(fā)展說不上誰先誰后,歷史總是這么巧合。從更高的維度看,這可能也是技術(shù)發(fā)展的必然,但是不可否認的是,微服務架構(gòu)被市場廣泛接受加速了Kubernetes的發(fā)展和成熟。微服務架構(gòu)下,由于應用程序被設計成由大量獨立服務組成的高度分布式應用,因此對基礎設施團隊,運維團隊和開發(fā)團隊提出了更高的要求。

工程化能力和運維能力強的團隊,可能會選擇自己編寫運維腳本,而大部分業(yè)務型企業(yè),把目標轉(zhuǎn)向了Kubernetes。和Linux這樣的開源項目比起來,Kubernetes可以說非常年輕(2015年才發(fā)布第一個版本),因此圍繞Kubernetes還有很多迷霧尚未消散,筆者接觸過很多企業(yè),大部分都有明確的技術(shù)愿景:容器化部署,但是Kubernetes在企業(yè)內(nèi)部大多都是用來驗證,測試,給老板匯報用的,你要是問負責人為啥不用來跑生產(chǎn)的系統(tǒng),大多數(shù)人回答,資源不夠,沒有人手運維啊,這個真的能用來生產(chǎn)用?

由于筆者在過去幾年成功主導過幾個巨型數(shù)字化項目的開發(fā),部署工作,因此親眼見證,親手實踐過基于Kubernetes的容器化部署方案,也對很多企業(yè)對Kubernetes生產(chǎn)化這個事情持懷疑態(tài)度非常理解。Kubernetes非常復雜,的確不是安裝到自己的機器上隨便點點就能工作。幸運的是,但是得益于谷歌多年來容器化部署的實踐經(jīng)驗,Kubernetes已經(jīng)將這么復雜的系統(tǒng)進行了完美的抽象,因此Kubernetes對開發(fā)和運維來說是有章可循的,只要持續(xù)的關(guān)注和投入資源,基于筆者的經(jīng)驗,企業(yè)是能夠逐步建立起勝任Kubernetes平臺運維團隊,讓企業(yè)可以從云原生架構(gòu)下的應用充分享用云計算帶來的紅利,這個紅利能夠促進業(yè)務發(fā)展的核心,就是Kubernetes平臺。

正是由于以上的原因,筆者在逐步建立Kubernetes知識體系的過程中,發(fā)現(xiàn)這個問題很普遍:道理都懂,但是一到具體落地就慫。市面上這樣的書籍也不多,為了拉齊理論和現(xiàn)實之間的GAP,就有了這個系列的文章。筆者希望圍繞Kubernetes生產(chǎn)之路這個系列的文章,讓大家對Kubernetes提供的功能清單有個全面的掌握,特別是從開發(fā)和運維的角度,同時筆者也會介紹不同類型企業(yè)的Kubernetes生產(chǎn)化路線圖,以期通過理論加實踐,讓讀者能夠輕松的逾越Kubernetes這套復雜系統(tǒng)給大家?guī)淼睦Щ蠛涂謶?,從而開始在企業(yè)中“真正”的實踐基于Kuberntes平臺的大規(guī)模分布式應用的部署和運維管理。

有了明確的目標之后,第一篇文章我們從Kubernetes的一些基礎內(nèi)容開始,先來了解一下什么是Kubernetes,應用程序部署平臺,以及我們?yōu)槭裁匆褂肒ubernetes來部署應用程序?

【什么是Kubernetes?】

雖然我們經(jīng)常在不同的場合和上下文中聽到Kubernetes這個詞,不知道讀者是否考慮過Kubernetes具體是什么? 你可能會說,是個平臺,基礎設施,應用程序,容器編排,應用程序管理等等。坦白講隨著Kubernetes版本的演進,我們已經(jīng)很難用一個術(shù)語來定義這個平臺,或許Kubernetes這個詞本身就是最好的選擇。因此咱就不費那么多精力重新發(fā)明Kubernetes的定義了,而把力氣留下來詳細聊聊Kuberntes具體解決了哪些問題上,這也是為了我們能夠順利的將業(yè)務系統(tǒng)切換到Kubeneretes做好鋪墊。其實生產(chǎn)化之路這個詞描述的是過程,而這條路的目標就是我們的核心業(yè)務運行在Kubernetes平臺上,并且能夠穩(wěn)定的服務于靈活多變的真實業(yè)務流量。

Kubernetes這個單詞來自于希臘語,意思是領(lǐng)航,領(lǐng)航員,舵手。而舵手其實就是站在輪船的方向盤(舵)前邊的人,這個人的主要職責就是依靠舵來讓輪船朝著正確的方向前進。穿上除了舵手,一般還有船長,船長的角色就是基于自己的經(jīng)驗以及獲取到的信息,來給舵手下達輪船航行的命令,舵手的核心職責就是執(zhí)行船長的命令,通過舵來讓輪船改變方向和角度,是讓輪船按照預期的方向行駛最基本的一套運行機制。而如果讀者看Kubernetes的源碼的話,會發(fā)現(xiàn)Kubernetes這個項目下大概有70+的repositories,因此Kubernetes更像是一把傘,一組軟件包的統(tǒng)稱。如果你再退后一步,會發(fā)現(xiàn)還有一個叫kubernetes-sigs的項目,下邊大概有107+的項目,最后你應該聽說CNCF(云原生基金會)的大名,下邊有除了Kubernetes之外的很多云原生相關(guān)的項目,由于這些概念嚴格來講會有部分重疊,因此在筆者的生產(chǎn)化之路的系列文章中,我們的討論范圍聚焦在Kuberntes的核心項目上。

你可能會問,核心的具體意思啥?筆者認為的核心是包含在項目Kubernetes/kubernetes代碼庫下的功能,這也是我們在大部分不同類型Kubernetes集群中都能發(fā)現(xiàn)的組件,模塊的源代碼的位置,具體來說我們討論的模塊,功能清單如下:

- 在多個工作節(jié)點上調(diào)度任務(Scheduler)

- 暴露給外部的一套聲明式,可擴展的API服務,用來提供給用戶訪問集群功能(API Server)

- 客戶端命令行工具CLI,也叫kubectl,封裝了便于用戶使用的調(diào)用API Server服務的命令(kubectl)

- 對象的目標狀態(tài)和真實狀態(tài)之間的調(diào)諧(Controller)

- 一套服務代理機制來將部署到集群中的服務暴露給外部系統(tǒng)和用戶訪問(kube-proxy,Service)

- 可擴展的網(wǎng)絡,存儲機制(CNI,CSI)

如果對上邊的這些特性,功能進行稍微的抽象,一個準確描述Kuberntes的此就是:企業(yè)級的容器調(diào)度和編排平臺。這也是Kubernetes最為人所熟知的功能,是Kubertes在markting的時候,用的最多的功能描述術(shù)語。筆者用大白話來翻譯一下(說人話),Kubernetes為我們提供了一種在多臺計算機上運行容器化應用的技術(shù)方案,希望大家能記住這句話,因為我們后續(xù)的文章都是圍繞這句話來展開,來證明Kubernetes是否提供了這樣的能力,讓我們的應用能夠以容器化的方式部署到生產(chǎn)環(huán)境的能力。

我們在Kubernetes架構(gòu)體系介紹的文章中,曾經(jīng)詳細介紹過Kubernetes的架構(gòu)體系,不過為了內(nèi)容完整性,咱這個系列還是要簡單的提一下組成Kubernetes的各個組件以及在整個架構(gòu)中扮演的角色。從源代碼的角度,我們可以從github上下載指定的發(fā)布版本,在本地解壓后,我們可以運行cluste目錄中的get-kube-binaries.sh腳本,來基于目標機器來檢查和下載對應的組件和版本,如下圖所示:

《圖1.1 運行g(shù)et-kube-binaries腳本打印特定版本包含的組件》

如上圖所示,Kubernetes包含的核心組件有API Server,kubelet,Controller,Scheduler等,詳細介紹如下:

- API Server,API Server是我們和Kubernetes集群進行交互的唯一入口,從原理上講,無論是通過kubectl客戶端命令行工具,還是其他的三方包,本質(zhì)上都是通過API Server提供的Restful風格的接口來進行對象的增刪改查。API Server是無狀態(tài)的,客戶端提交的對象YAML信息會被持久化保存到etcd數(shù)據(jù)庫中。

- Kubelet,部署在工作節(jié)點上的插件,主要負責給API Server報告節(jié)點的狀態(tài)信息,以及從API Server上接收任務。收到任務后,Kubelets進一步驅(qū)動容器運行時(比如Docker,Podman)將任務運行起來,并確保任務的健康運行(當任務運行出錯,Kubelets需要通過容器運行時來重啟應用)

- Controller Manager,控制管理器由一組控制器組成,每個控制負責某類對象的期望狀態(tài)和當前狀態(tài)的調(diào)諧。比如當我們在Deployment中聲明replicas等于3,那么控制器(Controller)會負責創(chuàng)建對應數(shù)量的容器實例

- Scheduler,調(diào)度器組件人如其名啊,主要負責將用戶提交的負載(workload,任務)調(diào)度到最合適的工作節(jié)點,從原理上看,調(diào)度分為過濾和打分兩個環(huán)節(jié),過濾階段通過一組過濾器篩選出備選的節(jié)點,而打分階段基于規(guī)則確定“最合適”的節(jié)點

- Kube Proxy,Kube代理實現(xiàn)了服務的虛擬機地址功能,訪問流量會被路由到一組POD(應用程序?qū)嵗嵗蟻磉M行處理,從原理上看,proxy使用基于iptables和ipvs的數(shù)據(jù)包過濾機制

雖然如上的清單并不是完整,但是這些是組成Kubernetes的最核心的組件,提供了日常使用Kubernetes進行應用部署的所有功能,如下圖是整個Kubernetes的體系架構(gòu)。

注:Kubernetes的具體部署架構(gòu)有很多不同的變種,比如有些集群將kube-apiserver,kube-scheduler,kube-control-manager運行為容器實例,這也意味著管理節(jié)點上也有容器運行時,kubelet和kube-proxy(大家需要注意的這三個組件一般情況下是工作節(jié)點上標配,用來處理我們作為用戶提交的任務)。

《圖1.1 組成Kubernetes的核心組件和關(guān)系》

注:Dashboard組件由于不是Kubernetes的核心組件,因此并沒有出現(xiàn)在上圖中。

好了,作為整個Kubernetes生產(chǎn)化之路的第一篇文章,我們的核心任務就是先給大家一個關(guān)于Kubernetes和Kubernetes整體架構(gòu)的介紹,下篇文章我們會繼續(xù)圍繞Kubernetes提供的功能展開,看看除了調(diào)用功能之外,Kubernetes還有哪些屬性,敬請期待!

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

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

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