簡(jiǎn)介 P2


Kubernetes 能自動(dòng)調(diào)度、配置、監(jiān)管和故障處理,使開發(fā)者可以自主部署應(yīng)用,并且控制部署的頻率,完全脫離運(yùn)維團(tuán)隊(duì)的幫助。 Kubernetes 同時(shí)能讓運(yùn)維團(tuán)隊(duì)監(jiān)控整個(gè)系統(tǒng),并且在硬件故障時(shí)重新調(diào)度應(yīng)用。 P2


Kubernetes 抽象了數(shù)據(jù)中心的硬件基礎(chǔ)設(shè)施,使得對(duì)外暴露的只是一個(gè)巨大的資源池。 在部署多組件應(yīng)用時(shí), Kubernetes 會(huì)為每個(gè)組件都選擇一個(gè)合適的服務(wù)器,部署之后它能夠保證每個(gè)組件可以輕易地發(fā)現(xiàn)其他組件,并彼此之間實(shí)現(xiàn)通信。 P2


Kubernetes 系統(tǒng)的需求 P2


近年來,應(yīng)用程序的開發(fā)部署的變化原因: P2


大型單體應(yīng)用被拆解為更多的小型微服務(wù)

應(yīng)用運(yùn)行所依賴的基礎(chǔ)架構(gòu)的變化

從單體應(yīng)用到微服務(wù) P2


單體應(yīng)用由很多個(gè)組件組成,這些組件緊密地耦合在一起,并且在同一個(gè)操作系統(tǒng)進(jìn)程中運(yùn)行,所以在開發(fā)、部署、管理的時(shí)候必須以同一個(gè)實(shí)體進(jìn)行。 P2


單體應(yīng)用通常需要一臺(tái)能為整個(gè)應(yīng)用提供足夠資源的高性能服務(wù)器,有兩種方法可以應(yīng)對(duì)不斷增長(zhǎng)的系統(tǒng)負(fù)荷: P3


垂直擴(kuò)展:提升單機(jī)性能 —— 增加 CPU 、內(nèi)存或其他系統(tǒng)資源

優(yōu)點(diǎn):不需要應(yīng)用程序做任何變化

缺點(diǎn):成本很快會(huì)越來越高,并且通常會(huì)有瓶頸

水平擴(kuò)展:增加服務(wù)器數(shù)量

優(yōu)點(diǎn):能線性擴(kuò)充系統(tǒng)性能

缺點(diǎn):需要在架構(gòu)層面支持水平擴(kuò)展,部分組件難于甚至不太可能去做水平擴(kuò)展(像關(guān)系型數(shù)據(jù)庫(kù))

所思


垂直擴(kuò)展總會(huì)達(dá)到單機(jī)性能的極限,所以終極解決方案是水平擴(kuò)展,同時(shí)也可以通過垂直擴(kuò)展進(jìn)行輔助。


仔細(xì)回想一下,發(fā)現(xiàn)我們平時(shí)也是這樣處理的。由于歷史原因,我們項(xiàng)目核心功能的大部分代碼在同一個(gè)應(yīng)用中,導(dǎo)致啟動(dòng)就會(huì)占用大量資源,單機(jī)處理能力較差。在經(jīng)歷各種配置下壓測(cè)后,選擇了合適的配置,然后就直接水平擴(kuò)展,并且逐漸將一些壓力大的接口拆成微服務(wù)提供接口或者直接處理各種請(qǐng)求。


如果單體應(yīng)用的任何一個(gè)部分不能擴(kuò)展,整個(gè)應(yīng)用就不能擴(kuò)展,除非我們想辦法把它拆分開。 P3


將應(yīng)用拆解為多個(gè)微服務(wù) P3


服務(wù)之間可以通過類似 HTTP 這樣的同步協(xié)議通信,也可以通過像 AMQP 這樣的異步協(xié)議通信,并且微服務(wù)也可以選用最適合的開發(fā)語言來實(shí)現(xiàn)。 P3



圖 1.1 單體應(yīng)用中的組件與獨(dú)立的微服務(wù)

每個(gè)微服務(wù)都是獨(dú)立的,可以獨(dú)立開發(fā)和部署。只要 API 不變或者向前兼容,改動(dòng)一個(gè)微服務(wù),并不會(huì)要求對(duì)其他微服務(wù)進(jìn)行改動(dòng)或者重新部署。 P3


微服務(wù)的擴(kuò)容 P3


單體系統(tǒng)必須要對(duì)整個(gè)系統(tǒng)擴(kuò)容,而微服務(wù)只需針對(duì)單個(gè)服務(wù)擴(kuò)容。因此,我們可以選擇僅擴(kuò)容那些需要更多資源的服務(wù)而保持其他的服務(wù)仍然維持在原來的規(guī)模。當(dāng)單體應(yīng)用因?yàn)槠渲幸徊糠譄o法擴(kuò)容而整體被限制擴(kuò)容時(shí),可以把應(yīng)用拆分成多個(gè)微服務(wù),將能擴(kuò)容的服務(wù)進(jìn)行水平擴(kuò)展,不能進(jìn)行擴(kuò)容的組件進(jìn)行垂直擴(kuò)展。 P4



圖 1.2 每個(gè)微服務(wù)能被多帶帶擴(kuò)容

部署微服務(wù) P4


當(dāng)組件數(shù)量增加時(shí),部署相關(guān)的決定就變得越來越困難。因?yàn)椴粌H組件部署的組合數(shù)在增加,而且組件間依賴的組合數(shù)也在以更大的因素增加,并且配置工作變得冗雜易錯(cuò),同時(shí)因?yàn)榭缌硕鄠€(gè)進(jìn)程和機(jī)器,調(diào)試代碼和定位異常調(diào)用變得困難。 P4


環(huán)境需求的差異 P5


因?yàn)榻M件之間依賴的差異性,應(yīng)用程序需要同一個(gè)庫(kù)的不同版本是不可避免的。當(dāng)多個(gè)應(yīng)用在同一個(gè)主機(jī)上運(yùn)行就有可能會(huì)有依賴沖突。 P5



圖 1.3 多個(gè)應(yīng)用在同一主機(jī)上運(yùn)行可能會(huì)有依賴沖突

為應(yīng)用程序提供一個(gè)一致的環(huán)境 P5


開發(fā)和運(yùn)維團(tuán)隊(duì)需要解決的一個(gè)最大的問題是程序運(yùn)行環(huán)境的差異性: P5


開發(fā)環(huán)境和生產(chǎn)環(huán)境之間

各個(gè)生產(chǎn)機(jī)器之間

生產(chǎn)機(jī)器環(huán)境隨時(shí)間的推移而變化

為了減少會(huì)在生產(chǎn)環(huán)境才暴露的問題,最理想的做法就是讓應(yīng)用在開發(fā)和生產(chǎn)階段可以運(yùn)行在完全一樣的環(huán)境下,它們有完全一樣的操作系統(tǒng)、庫(kù)、系統(tǒng)配置、網(wǎng)絡(luò)環(huán)境和其他所有條件。這個(gè)環(huán)境不會(huì)隨著時(shí)間的推移而變化,并且在一臺(tái)服務(wù)器上部署新的應(yīng)用時(shí),不會(huì)影響機(jī)器上已有的應(yīng)用。 P6


邁向持續(xù)交付: DevOps 和無運(yùn)維 P6


在過去,開發(fā)團(tuán)隊(duì)的任務(wù)是創(chuàng)建應(yīng)用并交付給運(yùn)維團(tuán)隊(duì),然后運(yùn)維團(tuán)隊(duì)部署應(yīng)用并使它運(yùn)行。 P6


而現(xiàn)在,讓一個(gè)團(tuán)隊(duì)參與應(yīng)用的開發(fā)、部署、運(yùn)維的整個(gè)生命周期更好。這意味著開發(fā)者、 QA 和運(yùn)維團(tuán)隊(duì)彼此之間的合作需要貫穿整個(gè)流程。這種實(shí)踐被稱為 DevOps 。 P6


帶來的優(yōu)點(diǎn) P6


開發(fā)者更多地在生產(chǎn)環(huán)境中運(yùn)行應(yīng)用,能更好地理解用戶的需求和問題、運(yùn)維團(tuán)隊(duì)維護(hù)應(yīng)用所面臨的困難

開發(fā)者更趨向于盡快發(fā)布上線,能進(jìn)行快速迭代

簡(jiǎn)化部署流程,開發(fā)者自己部署應(yīng)用上線

讓開發(fā)者和系統(tǒng)管理員做他們最擅長(zhǎng)的 P6


Kubernetes 通過對(duì)實(shí)際硬件做抽象,然后將自身暴露成一個(gè)平臺(tái),用于部署和運(yùn)行應(yīng)用程序。它允許開發(fā)者自己配置和部署應(yīng)用程序,而不需要系統(tǒng)管理員的任何幫助,讓系統(tǒng)管理員聚焦于保持底層基礎(chǔ)設(shè)施運(yùn)轉(zhuǎn)正常的同時(shí),不需要關(guān)注實(shí)際運(yùn)行在平臺(tái)上的應(yīng)用程序。 P7


介紹容器技術(shù) P7


Kubernetes 使用 Linux 容器技術(shù)來提供應(yīng)用的隔離,需要先通過熟悉容器的基本知識(shí)來更深入地理解 Kubernetes 。 P7


什么是容器 P7


用 Linux 容器技術(shù)隔離組件 P7


容器允許你在同一臺(tái)機(jī)器上運(yùn)行多個(gè)服務(wù),不僅提供不同的環(huán)境給每個(gè)服務(wù),而且將它們相互隔離。容器類似虛擬機(jī),但開銷小很多。 P7


一個(gè)容器里運(yùn)行但進(jìn)程實(shí)際上運(yùn)行在宿主機(jī)的操作系統(tǒng)上,但容器里的進(jìn)程仍然是和宿主機(jī)的其他進(jìn)程隔離的。對(duì)容器內(nèi)的進(jìn)程本身而言,就好像是在機(jī)器和操作系統(tǒng)上運(yùn)行的唯一一個(gè)進(jìn)程。 P7


比較虛擬機(jī)和容器 P8


容器更加輕量級(jí),它允許在相同的硬件上運(yùn)行更多數(shù)量的組件。一個(gè)容器僅僅是運(yùn)行在宿主機(jī)上被隔離的單個(gè)進(jìn)程,僅消耗應(yīng)用容器消耗的資源,不會(huì)有其他進(jìn)程的開銷。虛擬機(jī)則需要運(yùn)行自己的一組系統(tǒng)進(jìn)程,會(huì)產(chǎn)生除了組件進(jìn)程消耗以外的額外計(jì)算資源損耗。 P8


因?yàn)樘摂M機(jī)有額外開銷,所以沒有足夠的資源給每個(gè)應(yīng)用開一個(gè)專用的虛擬機(jī),最終會(huì)將多個(gè)應(yīng)用程序分組塞進(jìn)每個(gè)虛擬機(jī)。而容器能夠(也應(yīng)該)讓每個(gè)應(yīng)用有一個(gè)容器,最終可以讓同一臺(tái)裸機(jī)上運(yùn)行更多的應(yīng)用程序。 P8