K8S基本上已經(jīng)坐實了企業(yè)級應用部署和運維管理平臺頭把交易的位置,你如果都不懂一點K8S的基本知識,都不好意思說自己在做數(shù)字化轉型。雖然K8S的理念很容易理解荆残,但是學習起來的確很吃力,筆者認為主要原因有兩個:第一净当,K8S本身的復雜性導致内斯,因為K8S基本上涵蓋了操作系統(tǒng)蕴潦,網(wǎng)絡,數(shù)據(jù)結構俘闯,軟件架構潭苞,三高設計理念等計算機領域的所有基礎知識,因此如果沒有扎實的基礎知識真朗,的確很容易限于只見樹木不見森林的境地此疹;第二個原因是大部分K8S的學習材料都很散,很多時候僅僅描述了K8S這個龐然大物的一面遮婶,從而導致即使看了很多K8S的內容蝗碎,也無法掌握K8S這個平臺的真諦,導致出現(xiàn)問題后還是兩眼一抹黑旗扑,因此體系化的構建K8S知識體系非常重要蹦骑。
正是因為如此,筆者結合自己過去幾年學習K8S的經(jīng)驗臀防,希望通過接下來的一系列文章脊串,從K8S的概述,K8S架構清钥,K8S核心組件,POD的聲明周期放闺,存儲和網(wǎng)絡等角度祟昭,給大家從點到面,從面到體的完整介紹一下K8S怖侦,以期能夠讓各位看官不光知道K8S是什么篡悟,帶來哪些好處,以及了解K8S基本的運行原理匾寝。這樣可以讓大家在進行后續(xù)學習的時候搬葬,有一定的基礎,不至于一直在這些基本的概念上轉圈圈艳悔。服務網(wǎng)格的概念已經(jīng)從一個理念轉變成具體實實在在的框架了急凰,比如Istio已經(jīng)在某些企業(yè)中部署到生產(chǎn)環(huán)境了,而你可能不知道猜年,Istio是使用K8S各種擴展能力的集大成者, 可以說Istio為我們打開了如何在K8S這樣的平臺上抡锈,構建容器化企業(yè)基礎設施,提供了一個很好的實現(xiàn)參考乔外,筆者也會在后續(xù)的文章中床三,詳細的說說Istio。
我們在學習任何新技術杨幼,需要先從概念著手撇簿,先看看這個新的概念是否和自己過去的某些知識能夠做類比聂渊,其實學習的過程,就是在類比的過程四瘫。Kubernetes這個詞來自于希臘語汉嗽,意思是領航,領航員莲组,舵手诊胞。而舵手其實就是站在輪船的方向盤(舵)前邊的人,這個人的主要職責就是依靠舵來讓輪船朝著正確的方向前進锹杈。穿上除了舵手撵孤,一般還有船長,船長的角色就是基于自己的經(jīng)驗以及獲取到的信息竭望,來給舵手下達輪船航行的命令邪码,舵手的核心職責就是執(zhí)行船長的命令,通過舵來讓輪船改變方向和角度咬清,這就是在讓輪船按照預期的方向行駛最基本的一套運行機制闭专。
而我們說了這么多的輪船上操作的流程,其實就是為了給大家提供一個類比旧烧,讓大家可以更容易理解接下來要介紹的主角影钉,Kubernetes。Kubernets的核心工作和舵手類似掘剪,負責我們部署應用的運行平委,并且實時的匯報應用的執(zhí)行狀態(tài);執(zhí)行運維人員(船長)下達的命令(將某個應用的POD數(shù)量增加一倍)夺谁,并負責維護整個應用的運行和健康狀態(tài)廉赔。
我們來定義一下Kubernetes吧,雖然這個有點重復發(fā)明輪子匾鸥,但是我一直秉承的觀點是蜡塌,只有你能用自己的數(shù)據(jù)字典中的術語,將一個概念闡述清楚勿负,那么你才可能真的說你理解了馏艾。Kubernetes是用來自動化部署和管理大規(guī)模企業(yè)復雜應用程序的軟件系統(tǒng),這些被管理的應用程序通常由數(shù)量巨大的奴愉,獨立運行的容器構成攒至。這個定義中有幾點需要注意:第一,大規(guī)模復雜的應用躁劣;第二迫吐,容器。這是一個應用是否應該部署到K8S上的兩個核心的指標账忘,當然關于復雜和大規(guī)模的量化定義是沒有的志膀,你只能結合自己的實際情況熙宇,以及企業(yè)的工程能力,運維能力來選擇溉浙。需要記住的是烫止,天下沒有免費的午餐,K8S在提供這種自動化運維管理戳稽,擴展性馆蠕,容器化等好處的同時,同時也帶來了額外的開銷惊奇。
當開發(fā)人員和運維人員決定部署應用程序到K8S上互躬,他們通過K8S提供的管理能力來部署應用,而不是像傳統(tǒng)的那樣將應用程序的jar包拷貝到多臺機器的Tomcat上颂郎,也就是說K8S為用戶和應用程序提供了訪問底層硬件資源的操作界面吼渡,而這個操作界面,我們也叫抽象接口乓序,這里抽象的含義就是對所提供的滿足不同操作需求和角色進行了設計寺酪,設計的過程就是抽象的過程。而抽象帶來的最大好處就是易用性替劈,我們在設計API的時候寄雀,其實設計的核心就是如何讓這個API接口更加容易使用,通過影藏具體的實現(xiàn)復雜度來達成目標陨献。
俗話說一圖勝千言咙俩,關于K8S提供的部署模型,我們通過下圖來詳細介紹:
從上圖可以看出湿故,正式因為K8S這層抽象的存在,應用程序無需直接訪問底層的計算膜蛔,網(wǎng)絡和存儲等資源坛猪,讓開發(fā)人員把時間放在價值更高的應用邏輯開發(fā)工作上。由于這層抽象的引入皂股,對于企業(yè)來說墅茉,可以帶來如下的好處:
- 標準化應用程序的部署流程∥啬牛可以說這是很多企業(yè)多年以來就斤,持之以恒追求的運維目標。由于K8S引入的抽象層的存在, 應用程序不再直接依賴底層的基礎設施, 反過來看的話, 就是說底層的硬件, 網(wǎng)絡, 存儲等資源不會影響到應用的部署方式,因此我們終于可以以相同的方式在自己的數(shù)據(jù)中心和云服務供應商平臺上部署應用程序蘑辑。具體來說洋机,我們可以通過一份描述應用程序部署架構的yaml文件,來驅動企業(yè)的數(shù)據(jù)中心和任何提供K8S托管服務的云供應商部署我們的應用程序洋魂。而云供應商绷旗,數(shù)據(jù)中心的硬件差異被K8S提供的這層抽象層給隔離了喜鼓,因此整個部署流程最終可以標準化,因為無論底層的硬件環(huán)境是什么衔肢,對于應用程序的部署來說庄岖,都是一樣的,都是部署到K8S集群角骤。其實這種抽象和JVM給Java虛擬機提供的運行愿景類似隅忿,只是K8S的抽象層次更高,從應用程序部署的粒度來進行了抽象邦尊。
- 聲明式的應用程序部署能力背桐。K8S提供了一種叫做聲明式的應用程序部署模型,如下圖所示胳赌。作為運維人員牢撼,只需要通過YAML文本文件描述組成應用的組件以及關系,當這個部署描述文件被提交給K8S后疑苫,K8S會將YAML文件解析成可運行的應用程序熏版,并且在應用程序運行的過程中,持續(xù)監(jiān)控應用程序的狀態(tài)捍掺,如果出現(xiàn)應用程序某個組件撼短,實例失敗的場景,K8S負責重啟或者重建失效的組件,來維持整個系統(tǒng)健康運行的目標挺勿。
當我們對應用程序的配置進行了改動曲横,比如將應用的鏡像版本從1.2更新到1.3,K8S會自動執(zhí)行預設的步驟不瓶,將應用程序更新到最新的版本禾嫉,比如將應用的版本從1.2更新到1.3,如下圖所示:
- 承擔了部分應用程序的日常管理職責蚊丐。當我們將應用程序部署到K8S那一刻開始熙参,K8S就幫我們分擔了部分應用程序日常管理的職責,如果應用程序運行失敗麦备,或者某個依賴的組件失敗孽椰,K8S會自動重新啟動(準確來說,K8S上不存在重啟的概念凛篙,其實K8S統(tǒng)一都是按刪除和重新創(chuàng)建來處理黍匾,無狀態(tài)的優(yōu)勢就體現(xiàn)出來了)失效的組件。進一步說呛梆,如果底層的硬件環(huán)境發(fā)生了變化锐涯,比如說運行應用的機器網(wǎng)絡故障,應用必須移動到另外一臺宿主機上填物,K8S會在后臺默默的完成上邊這些工作全庸,可能都不需要運維和開發(fā)人員介入來進行機器配置秀仲,初始化等工作,這樣的話壶笼,開發(fā)人員就可以將寶貴的時間花費在開發(fā)新功能上神僵,而不是關注這些細節(jié)。
如果我們把輪船的例子再拿出來對比的話覆劈,開發(fā)和運維人員就是船長的角色保礼,坐在舒服的沙發(fā)上給舵手下達船只運行的指令,而Kubernetes及時舵手责语,負責執(zhí)行開發(fā)人員和運維人員下達的指令炮障,通過操控船只的各個功能組件,確保輪船可以順利通過布滿礁石的險流坤候。如下圖所示:
雖然說K8S由于在整個部署架構中引入了這層抽象層帶來了上邊所述的幾個好處胁赢,但是如果你在數(shù)字化轉型,虛擬化白筹,容器化領域呆的時間足夠久的話智末,其實上邊這四條并沒有辦法解釋一個問題,K8S為啥這么流行徒河,簡直說是鋪天蓋地啊系馆。
筆者認為這主要是由于微服務,容器化顽照,DDD等Buzzword的出現(xiàn)和大規(guī)模流行造成的由蘑,而像微服務,容器化部署等概念對應用程序開發(fā)和部署方式的顛覆代兵,造成業(yè)界對類似于Kubernetes這樣的平臺提供的容器PASS能力突然變得非常急迫尼酿,而Kubernetes的出現(xiàn)和發(fā)展,又反過來影響了應用的架構設計的演化植影,我們通過一些實際的例子來詳細看看Kubernetes造成萬人空巷的本質是什么裳擎。
【自動化微服務的管理】
在微服務架構流行之前,主流的應用架構我們稱之為單體架構何乎,這種類型架構最顯著的特征是組件之間緊耦合,并且所有的組件一般都運行在統(tǒng)一臺機器上土辩,或者說同一個進程中支救。單體應用通常由一個大團隊負責開發(fā)和維護,應用程序的部署也很直接拷淘,我們找一臺性能強勁的機器各墨,做一些簡單的配置。
雖然說部署看起來毫不費吹灰之力启涯,但是這種單體應用如果要進行擴容贬堵,會受到諸多限制恃轩,特別是大家耳熟能詳?shù)臋M向擴容,那是基本不存在的黎做,我們只能進行縱向擴容叉跛,也就是給機器配置更強的CPU,更大的內存和更大的磁盤蒸殿。
隨著微服務架構開始占據(jù)主流较木,體量巨大的單體應用被切分成數(shù)十數(shù)百個子模塊嘿棘,并且這些子模塊分別運行在獨立的進程中,這就讓企業(yè)團隊組織結構也可以做對應的調整,每個團隊可以負責一個或者多個這樣小的模塊糜芳,我們把這些小的模塊也叫“微服務”,如下圖:
微服務架構下每個服務有自己的開發(fā)和發(fā)布節(jié)奏醋奠,隨著時間的推移贱纠,每個微服務所需要的依賴也會逐漸產(chǎn)生分支,比如在開始的時候霞玄,服務A和服務B都依賴于某個jar依賴包的1.0版本骤铃,但是由于服務B演進的快,很快迭代到需要依賴jar包的1.1版本溃列,這個時候劲厌,就出現(xiàn)服務A和服務B依賴相同jar包的不同版本。
這種版本的沖突會導致我們越來越難在同一臺機器上運行多個不同的服務(雖然說并不是完全不可能听隐,但是因為不同的服務依賴不同的jar版本造成的運維層面的額外開銷來說补鼻,不值得)。幸運的是隨著微服務的流行雅任,容器技術也出現(xiàn)了(筆者不討論到底是微服務先出現(xiàn)造成容器技術的發(fā)展跟進风范,還是有了容器技術的出現(xiàn),微服務這種架構成為現(xiàn)實沪么,這個不重要)硼婿,這樣就可以解決每個服務有自己的運行環(huán)境的問題。
但是容器只解決了問題的一半禽车,我們仍然需要單獨管理每個微服務寇漫,考慮一個電商平臺有100多個微服務,每個服務有10-20個實例在運行殉摔,這種運維的復雜度想想都困難州胳。
由于組成應用的子模塊(微服務)運行在多臺機器上,這樣這個應用的擴展性就得到了極大的提升逸月,而跨多臺機器部署同樣不是免費的午餐栓撞,我們需要配置應用程序,以讓多個子模塊之間可以通信,共同對外提供設計的服務能力瓤湘。如果組成應用的服務數(shù)量不多瓢颅,通過手動的方式的確可以勉強進行管理,服務升級弛说,下線等運維工作挽懦,但是實際情況是,服務的數(shù)量剃浇,以及組成服務的實例對象數(shù)量可能會非常的可觀巾兆,以期通過手動的方式來運維,可以說會非常的苦難虎囚。
因此自動化運維是大規(guī)模微服務架構的關鍵角塑,而Kubernetes為我們提供了這種自動化的能力,讓我們管理數(shù)以百計的微服務集群就如同管理十幾個微服務那樣簡單和直接淘讥。
【消除開發(fā)和運維團隊的墻】
K8S可以說顛覆了應用程序部署的方式圃伶,而這種部署架構的變化,也直接影響了團隊開發(fā)和運維應用程序的方式蒲列。傳統(tǒng)的軟件開發(fā)流程中窒朋,開發(fā)和運維是兩個分工明確的不同團隊,當開發(fā)團隊完成代碼編寫蝗岖,以及必須的測試之后侥猩,打包好的軟件被“扔”給運維團隊,基于開發(fā)團隊提供的“詳盡”的文檔抵赢,運維團隊將應用部署在生產(chǎn)環(huán)境空閑的機器上欺劳,并且運維團隊一般會有全面的應用監(jiān)控能力,確保應用在生產(chǎn)環(huán)境可以穩(wěn)定運行铅鲤。
微服務架構的發(fā)展,也帶動Devops這樣的理念被越來越多的人接受, Devops最簡單直白的解釋就是:誰構建邢享,誰運維。而Devops倡導的正式這種share responsibility的思想, 開發(fā)團隊和運維團隊在整個應用的全聲明周期中,通力協(xié)作, 確保應用運行的更加穩(wěn)定和安全骇塘。因此開發(fā)團隊的責任不光是開發(fā)新功能,也需要負責應用的日常維護和管理工作款违,但是這也同時意味著唐瀑,開發(fā)人員現(xiàn)在需要對應用運行的基礎設施有足夠的了解,要不然如何進行應用的運維支持呢奠货?
而正是因為K8S提供的這層抽象座掘,作為軟件開發(fā)人員柔滔,我們不用花費過多的精力了解基礎設施,只需要將關注點放在新功能開發(fā)上萍虽,而關于底層基礎設施的差異睛廊,都交給K8S這層抽象來處理。
【標準化云計算平臺】
隨著云計算從“廣告語”變成實實在在的機器和網(wǎng)線杉编,越來越多的企業(yè)開始將自己的核心業(yè)務系統(tǒng)遷移到云平臺上,而隨著行業(yè)的發(fā)展邓馒,云計算帶給企業(yè)的紅利看起來已經(jīng)抵消了在發(fā)展初期人們擔心被某個云廠商鎖定的恐懼,因為大部分云廠商都會提供和競爭對手不一樣的云能力疏遏,比如IASS還是PAAS的差異化競爭能力救军。
隨著企業(yè)的規(guī)模也業(yè)務發(fā)展,特別是很多企業(yè)逐步有了跨云部署的需求唱遭,跨云部署就要求我們將應用能夠遷移到其他云供應商的平臺上,而不需要花費太大的成本來替代現(xiàn)有云平臺特有的某些能力拷泽。這也不難理解,企業(yè)的IT系統(tǒng)核心是圍繞業(yè)務來構建订晌,因此寶貴的工程師資源應該放在業(yè)務附加值高的開發(fā)新功能上蚌吸。
而Kubernetes的出現(xiàn)其實為我們提供了這么一種跨云的平臺锈拨。Kubernetes的大規(guī)模流行就倒逼所有的云供應商將K8S集成到他們的offering中羹唠,特別是PASS平臺的能力中,沒有K8S缝彬,你都不好意思給客戶做方案哺眯。
而從企業(yè)的開發(fā)團隊角度來看,這下好了,我都不用關心到底是部署到哪里撼玄,我只需要確保我的應用部署符合K8S平臺的要求,至于說具體部署到哪里墩邀,其實已經(jīng)不重要了,這種抽象能力其實給企業(yè)提供了一套標準的跨云部署平臺荔茬,這個方向的創(chuàng)業(yè)現(xiàn)在應該有很多竹海,我們很快就會看到很多的產(chǎn)品慕蔚。如下圖所示的跨云部署的標準化:
如果應用在架構設計的時候坊萝,并沒有使用特殊的云資源,那么應用在不同的云平臺上跨云部署十偶,可以做到無縫园细。
好了這篇文章到這里就結束了,筆者接著會通過下篇文章來介紹K8S是如何顛覆應用部署模式猛频,以及K8S的架構概覽,敬請期待睦柴。