從2019年初開(kāi)始差油,就有不少創(chuàng)業(yè)公司陸陸續(xù)續(xù)向我咨詢Kubernetes等云原生技術(shù)。
我總是會(huì)問(wèn)這些創(chuàng)業(yè)公司的部署流程是怎樣的,因?yàn)檫@能讓我大概了解到一個(gè)公司的技術(shù)復(fù)雜度處在哪個(gè)階段。有些公司僅僅使用scp
部署簡(jiǎn)單的PHP應(yīng)用程序,就能讓公司走的很遠(yuǎn)驰怎,而有些公司的架構(gòu)達(dá)到極限,不得不使用諸如Redis或者Kafka這樣的基礎(chǔ)組件作為內(nèi)部通信二打,從而將系統(tǒng)拆分為不同的服務(wù)县忌。
當(dāng)他們知道我的履歷里有Kubernetes的相關(guān)實(shí)戰(zhàn)經(jīng)驗(yàn)后,便總會(huì)問(wèn)起它。大多數(shù)公司對(duì)上手Kubernetes很感興趣芹枷,但同時(shí)也對(duì)Kubernetes是否適用于特定的用例表示出了擔(dān)心衅疙。我在上一家公司是怎樣使用它的?學(xué)習(xí)它困難嗎鸳慈?開(kāi)發(fā)團(tuán)隊(duì)有哪些使用它的經(jīng)驗(yàn)饱溢?
當(dāng)然,有時(shí)候一些關(guān)于實(shí)施不當(dāng)?shù)目膳鹿适聲?huì)使他們擔(dān)心遷移到Kubernetes是一個(gè)錯(cuò)誤走芋。經(jīng)常聽(tīng)到一些非常合理的懷疑绩郎,同時(shí)又希望部署更加簡(jiǎn)單但又猶豫不決已經(jīng)成為一種常態(tài)。
所以這里我直接切入重點(diǎn)翁逞±哒龋基于我已經(jīng)在兩家非常不同的公司使用了Kubernetes,如果我今天從頭開(kāi)始做一家創(chuàng)業(yè)公司挖函,我極有可能從Kubernetes開(kāi)始状植。這是我的結(jié)論。
簡(jiǎn)而言之怨喘,運(yùn)用Kubernetes帶來(lái)的積極因素遠(yuǎn)遠(yuǎn)超過(guò)了少數(shù)不利因素津畸。我認(rèn)為它值得許多創(chuàng)業(yè)公司的投資。并非所有的創(chuàng)業(yè)公司必怜,也不一定是你的公司肉拓,但是一定有很多這樣的公司。
讓我們來(lái)看一下幾點(diǎn)原因梳庆。
什么是Kubernetes
Kubernetes最初是由Google開(kāi)發(fā)的開(kāi)源容器編排系統(tǒng)宾尚,后來(lái)被貢獻(xiàn)給了開(kāi)源社區(qū)膛薛,目前有大量新的第三方庫(kù)和插件(術(shù)語(yǔ)叫做operators)嗦锐。
Kubernetes不是像阿里云或者騰訊云這樣的云平臺(tái)勾扭,事實(shí)上笙各,你可以在自己的數(shù)據(jù)中心冲呢,硬件上運(yùn)行和部署Kubernetes尊沸,不過(guò)我不建議初學(xué)者使用科盛。它更像是一種用來(lái)描述工作系統(tǒng)的語(yǔ)言抱环。一旦我們對(duì)系統(tǒng)進(jìn)行了足夠詳細(xì)的描述壳快,Kubernetes便可以使用其計(jì)算資源(Kubernetes的術(shù)語(yǔ)是nodes)來(lái)執(zhí)行系統(tǒng)的容器。
對(duì)于初創(chuàng)公司來(lái)說(shuō)镇草,最大的好處就是眶痰,這種“描述工作系統(tǒng)”的過(guò)程可作為文檔和代碼的集中位置來(lái)定義基礎(chǔ)架構(gòu)。
Kubernetes 為自己付費(fèi)
我不想撒謊梯啤,像AWS或者阿里云的Kubernetes容器服務(wù)目前價(jià)格偏高竖伯,除了最少3到5個(gè)實(shí)例節(jié)點(diǎn)外,還需要一部分管理費(fèi)。但是請(qǐng)考慮你要花多少錢才能讓工程師手動(dòng)啟動(dòng)節(jié)點(diǎn)七婴。這些純粹的基礎(chǔ)架構(gòu)變更所浪費(fèi)的時(shí)間僅僅是在開(kāi)發(fā)產(chǎn)品上花費(fèi)的時(shí)間祟偷。如果你是一家想實(shí)現(xiàn)下一個(gè)更大目標(biāo)的公司,你應(yīng)該樂(lè)于付出合理的開(kāi)銷打厘,以神奇的方式消除團(tuán)隊(duì)中容易出錯(cuò)且耗時(shí)的過(guò)程修肠。
使用現(xiàn)成的Terraform工具,你還可以通過(guò)簡(jiǎn)單的單行更改創(chuàng)建一個(gè)可以擴(kuò)展的集群户盯。在我的上一個(gè)團(tuán)隊(duì)嵌施,我們僅僅通過(guò)將Git提交命令從2改到4,就將集群從2個(gè)節(jié)點(diǎn)增長(zhǎng)到了四個(gè)節(jié)點(diǎn)莽鸭。添加節(jié)點(diǎn)后吗伤,Kubernetes會(huì)自動(dòng)將資源移動(dòng)到新的節(jié)點(diǎn)上,不需要進(jìn)一步的工作硫眨。然后你可以繼續(xù)解決工作中的實(shí)際問(wèn)題足淆。
部署簡(jiǎn)單
傳統(tǒng)的Linux生產(chǎn)系統(tǒng)通常看起來(lái)像這樣:你有一些用Java礁阁,Python或Ruby編寫的代碼缸浦。應(yīng)用程序代碼通常由不太了解服務(wù)器的人編寫(或者至少?zèng)]有服務(wù)器的實(shí)踐經(jīng)驗(yàn))。
假設(shè)你有一臺(tái)機(jī)器在阿里云ECS中氮兵,由你的運(yùn)營(yíng)團(tuán)隊(duì)中的某人管理裂逐,該人不太了解應(yīng)用程序代碼。當(dāng)應(yīng)用程序團(tuán)隊(duì)完成某些工作時(shí)泣栈,他們希望能夠部署這些更改卜高。運(yùn)維團(tuán)隊(duì)希望確保所做的更改不會(huì)破壞任何系統(tǒng)的內(nèi)容。
你也不希望系統(tǒng)在部署期間離線南片。如果出現(xiàn)問(wèn)題掺涛,你希望能夠回滾到以前的代碼版本。從上載資產(chǎn)到啟動(dòng)服務(wù)器的部署過(guò)程需要30分鐘怎么辦疼进?難道要將系統(tǒng)離線30分鐘嗎薪缆?可能不會(huì)。你可能會(huì)想出一些系統(tǒng)來(lái)保持版本n-1的運(yùn)行伞广,直到版本n啟動(dòng)為止拣帽,此時(shí)你將切換到新版本。
這聽(tīng)起來(lái)確實(shí)有點(diǎn)復(fù)雜嚼锄,有很多要記住的地方减拭,還有很多可能出錯(cuò)的地方。這些部署規(guī)則會(huì)用一系列腳本進(jìn)行編寫区丑,這些腳本需要進(jìn)行版本控制和維護(hù)拧粪,并且很可能本身包含錯(cuò)誤修陡。而且,當(dāng)我們將公司擴(kuò)展為各個(gè)獨(dú)立的團(tuán)隊(duì)時(shí)可霎,他們所有人都可能一天多次部署魄鸦。然后噩夢(mèng)就開(kāi)始了。運(yùn)維團(tuán)隊(duì)開(kāi)始對(duì)系統(tǒng)中的客戶流失感到不知所措癣朗。隨著過(guò)程變得越來(lái)越繁瑣号杏,部署花費(fèi)的時(shí)間也越來(lái)越長(zhǎng)。
這個(gè)故事聽(tīng)起來(lái)很熟悉嗎斯棒?
Kubernetes消除了很多復(fù)雜性盾致。要部署新版本的服務(wù),我們可以簡(jiǎn)單地更新容器鏡像以指向新版本的代碼荣暮。我們還可以定義運(yùn)行狀況檢查庭惜,以在宣布新版本正常運(yùn)行之前執(zhí)行該檢查。如果未通過(guò)穗酥,則舊版本的代碼將繼續(xù)運(yùn)行护赊。
我們可以使用僅供內(nèi)部使用的DNS名稱(例如order_service)定義服務(wù),該名稱將自動(dòng)平衡正在運(yùn)行的副本的負(fù)載砾跃。無(wú)需維護(hù)運(yùn)行實(shí)例的列表骏啰。并且,如果我們?cè)诓渴鸷蟀l(fā)現(xiàn)問(wèn)題抽高,則可以使用簡(jiǎn)單的回滾命令查找先前的容器鏡像并將其應(yīng)用判耕。通常這只需要幾秒鐘,然后我們回到運(yùn)行軟件的最新已知穩(wěn)定版本翘骂。
聽(tīng)起來(lái)不是很好嗎壁熄?
你不需要一支完成所有任務(wù)的運(yùn)維團(tuán)隊(duì)
Kubernetes本身是個(gè)很復(fù)雜的系統(tǒng)。但是碳竟,任何經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員都可以使用它草丧。這是因?yàn)椋琄ubernetes部署不是使用一系列復(fù)雜的bash腳本莹桅,特殊的部署工具等昌执,而是通過(guò)簡(jiǎn)單的聲明性YAML文件進(jìn)行管理。使用Kubernetes時(shí)诈泼,你需要了解的就是Ruby發(fā)燒友倡導(dǎo)的簡(jiǎn)單XML替換懂拾。
僅使用YAML,我們就可以定義具有自動(dòng)縮放厂汗,復(fù)制和服務(wù)解析的整個(gè)工作系統(tǒng)委粉。然后使用kubectl CLI工具呜师,我們可以要求集群運(yùn)行我們的配置娶桦。我們永遠(yuǎn)不會(huì)直接告訴Kubernetes做任何事情。相反,它將讀取我們的聲明性YAML并解釋需要執(zhí)行的操作衷畦。你認(rèn)為您的開(kāi)發(fā)人員可以弄清楚如何編寫YAML嗎栗涂?
我在一些復(fù)雜的系統(tǒng)上工作過(guò),這些系統(tǒng)要求管理部署的人員了解a)Python祈争,b)Bash斤程,c)我們正在運(yùn)行的OS版本的一些細(xì)微差別,d)JVM標(biāo)志菩混,e) SCP命令(您可以在不查看文檔的情況下編寫有效的SCP命令嗎忿墅?)……等等。
還有一些組織開(kāi)銷沮峡。部署腳本和基礎(chǔ)結(jié)構(gòu)代碼通常由運(yùn)維團(tuán)隊(duì)管理疚脐。但是開(kāi)發(fā)人員經(jīng)常需要更改部署代碼,例如邢疙,在啟動(dòng)時(shí)設(shè)置標(biāo)志棍弄,并擴(kuò)大系統(tǒng)規(guī)模。這在開(kāi)發(fā)人員和操作人員之間造成了緊張關(guān)系疟游,因?yàn)檫@兩個(gè)團(tuán)隊(duì)之間產(chǎn)生了彼此的要求呼畸,但往往會(huì)遵循不同的目標(biāo)。
所有的這些復(fù)雜性會(huì)增加你在啟動(dòng)過(guò)程中的開(kāi)銷颁虐。如果你想快速開(kāi)發(fā)新功能并且能夠輕松地從一個(gè)項(xiàng)目跳到另一個(gè)項(xiàng)目蛮原,想保持盡可能小的摩擦。 那么Kubernetes消除了很多痛苦另绩,讓你專注于產(chǎn)品瞬痘。
你可能不需要Kubernetes的情況
當(dāng)然這個(gè)世界上沒(méi)有靈丹妙藥,而且在某些情況下板熊,像Kubernetes這樣的東西有點(diǎn)過(guò)于龐大框全。
1.簡(jiǎn)單的WordPress網(wǎng)站,CMS等
如果你只是運(yùn)行WordPress干签,則不需要Kubernetes津辩。如果你運(yùn)行的CMS只是偶爾進(jìn)行一次升級(jí),升級(jí)庫(kù)或安裝插件容劳,而實(shí)際上從未真正部署過(guò)喘沿,則不需要Kubernetes。Kubernetes確實(shí)是針對(duì)管理大型竭贩,不斷變化的系統(tǒng)進(jìn)行了優(yōu)化蚜印。
2.嵌入式系統(tǒng),任何需要訪問(wèn)真實(shí)操作系統(tǒng)的東西
顯然留量,如果你要編寫需要與Linux內(nèi)核接口的底層嵌入式系統(tǒng)或軟件窄赋,那么Kubernetes不適合你哟冬。這適用于任何容器化解決方案。
3.你的產(chǎn)品主要是數(shù)據(jù)庫(kù)
Kubernetes確實(shí)有一種稱為“狀態(tài)集”的資源類型忆绰,旨在運(yùn)行諸如數(shù)據(jù)庫(kù)和管理狀態(tài)的消息代理之類的東西浩峡。從理論上講,運(yùn)行有狀態(tài)集可以允許您運(yùn)行多個(gè)副本并上下縮放它們错敢,以及附加和擴(kuò)展存儲(chǔ)翰灾。但是這樣做總是讓我有些緊張。借助應(yīng)用程序服務(wù)稚茅,我希望使開(kāi)發(fā)人員可以輕松調(diào)整設(shè)置和部署纸淮,而不會(huì)遇到麻煩。對(duì)于數(shù)據(jù)庫(kù)亚享,反而相反萎馅。因?yàn)橐馔飧脑O(shè)置或?qū)⑾到y(tǒng)升級(jí)到新版本比較少見(jiàn)。我也不想讓我的數(shù)據(jù)庫(kù)在集群中爭(zhēng)奪CPU和內(nèi)存虹蒋。
如果我使用的是阿里云并且可以訪問(wèn)RDS糜芳,那么我特別傾向于不使用Kubernetes來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)。你選擇的云提供商中的RDS或類似產(chǎn)品將更易于管理自動(dòng)備份魄衅,擴(kuò)展和監(jiān)控峭竣。
結(jié)論
Kubernetes非常適合需要隨時(shí)間擴(kuò)展和增長(zhǎng)的任何項(xiàng)目。
如果你是一家初創(chuàng)公司晃虫,那么幾乎可以肯定你屬于該類別皆撩。你現(xiàn)在可能很小,但是你在不斷成長(zhǎng)哲银。這就是你說(shuō)服投資者的理由扛吞,也是你聘請(qǐng)如此多開(kāi)發(fā)人員的原因。你的系統(tǒng)將要快速更改和擴(kuò)展荆责,因此你希望以盡可能減少成本和摩擦的方式構(gòu)建系統(tǒng)滥比。
僅出于這個(gè)原因,我認(rèn)為任何電子商務(wù)做院,SaaS或類似公司盡早投資Kubernetes都是有意義的盲泛。即使你只是在集群中部署單個(gè)簡(jiǎn)單的Web應(yīng)用程序,對(duì)未來(lái)進(jìn)行規(guī)劃也意味著精心構(gòu)建基礎(chǔ)架構(gòu)键耕,以使你的團(tuán)隊(duì)能夠快速移動(dòng)一年或三年寺滚。