簡介 P2
Kubernetes 能自動調(diào)度、配置、監(jiān)管和故障處理,使開發(fā)者可以自主部署應(yīng)用,并且控制部署的頻率,完全脫離運維團隊的幫助。 Kubernetes 同時能讓運維團隊監(jiān)控整個系統(tǒng),并且在硬件故障時重新調(diào)度應(yīng)用。 P2
Kubernetes 抽象了數(shù)據(jù)中心的硬件基礎(chǔ)設(shè)施,使得對外暴露的只是一個巨大的資源池。 在部署多組件應(yīng)用時, Kubernetes 會為每個組件都選擇一個合適的服務(wù)器,部署之后它能夠保證每個組件可以輕易地發(fā)現(xiàn)其他組件,并彼此之間實現(xiàn)通信。 P2
Kubernetes 系統(tǒng)的需求 P2
近年來,應(yīng)用程序的開發(fā)部署的變化原因: P2
大型單體應(yīng)用被拆解為更多的小型微服務(wù)
應(yīng)用運行所依賴的基礎(chǔ)架構(gòu)的變化
從單體應(yīng)用到微服務(wù) P2
單體應(yīng)用由很多個組件組成,這些組件緊密地耦合在一起,并且在同一個操作系統(tǒng)進程中運行,所以在開發(fā)、部署、管理的時候必須以同一個實體進行。 P2
單體應(yīng)用通常需要一臺能為整個應(yīng)用提供足夠資源的高性能服務(wù)器,有兩種方法可以應(yīng)對不斷增長的系統(tǒng)負荷: P3
垂直擴展:提升單機性能 —— 增加 CPU 、內(nèi)存或其他系統(tǒng)資源
優(yōu)點:不需要應(yīng)用程序做任何變化
缺點:成本很快會越來越高,并且通常會有瓶頸
水平擴展:增加服務(wù)器數(shù)量
優(yōu)點:能線性擴充系統(tǒng)性能
缺點:需要在架構(gòu)層面支持水平擴展,部分組件難于甚至不太可能去做水平擴展(像關(guān)系型數(shù)據(jù)庫)
所思
垂直擴展總會達到單機性能的極限,所以終極解決方案是水平擴展,同時也可以通過垂直擴展進行輔助。
仔細回想一下,發(fā)現(xiàn)我們平時也是這樣處理的。由于歷史原因,我們項目核心功能的大部分代碼在同一個應(yīng)用中,導致啟動就會占用大量資源,單機處理能力較差。在經(jīng)歷各種配置下壓測后,選擇了合適的配置,然后就直接水平擴展,并且逐漸將一些壓力大的接口拆成微服務(wù)提供接口或者直接處理各種請求。
如果單體應(yīng)用的任何一個部分不能擴展,整個應(yīng)用就不能擴展,除非我們想辦法把它拆分開。 P3
將應(yīng)用拆解為多個微服務(wù) P3
服務(wù)之間可以通過類似 HTTP 這樣的同步協(xié)議通信,也可以通過像 AMQP 這樣的異步協(xié)議通信,并且微服務(wù)也可以選用最適合的開發(fā)語言來實現(xiàn)。 P3
圖 1.1 單體應(yīng)用中的組件與獨立的微服務(wù)
每個微服務(wù)都是獨立的,可以獨立開發(fā)和部署。只要 API 不變或者向前兼容,改動一個微服務(wù),并不會要求對其他微服務(wù)進行改動或者重新部署。 P3
微服務(wù)的擴容 P3
單體系統(tǒng)必須要對整個系統(tǒng)擴容,而微服務(wù)只需針對單個服務(wù)擴容。因此,我們可以選擇僅擴容那些需要更多資源的服務(wù)而保持其他的服務(wù)仍然維持在原來的規(guī)模。當單體應(yīng)用因為其中一部分無法擴容而整體被限制擴容時,可以把應(yīng)用拆分成多個微服務(wù),將能擴容的服務(wù)進行水平擴展,不能進行擴容的組件進行垂直擴展。 P4
圖 1.2 每個微服務(wù)能被多帶帶擴容
部署微服務(wù) P4
當組件數(shù)量增加時,部署相關(guān)的決定就變得越來越困難。因為不僅組件部署的組合數(shù)在增加,而且組件間依賴的組合數(shù)也在以更大的因素增加,并且配置工作變得冗雜易錯,同時因為跨了多個進程和機器,調(diào)試代碼和定位異常調(diào)用變得困難。 P4
環(huán)境需求的差異 P5
因為組件之間依賴的差異性,應(yīng)用程序需要同一個庫的不同版本是不可避免的。當多個應(yīng)用在同一個主機上運行就有可能會有依賴沖突。 P5
圖 1.3 多個應(yīng)用在同一主機上運行可能會有依賴沖突
為應(yīng)用程序提供一個一致的環(huán)境 P5
開發(fā)和運維團隊需要解決的一個最大的問題是程序運行環(huán)境的差異性: P5
開發(fā)環(huán)境和生產(chǎn)環(huán)境之間
各個生產(chǎn)機器之間
生產(chǎn)機器環(huán)境隨時間的推移而變化
為了減少會在生產(chǎn)環(huán)境才暴露的問題,最理想的做法就是讓應(yīng)用在開發(fā)和生產(chǎn)階段可以運行在完全一樣的環(huán)境下,它們有完全一樣的操作系統(tǒng)、庫、系統(tǒng)配置、網(wǎng)絡(luò)環(huán)境和其他所有條件。這個環(huán)境不會隨著時間的推移而變化,并且在一臺服務(wù)器上部署新的應(yīng)用時,不會影響機器上已有的應(yīng)用。 P6
邁向持續(xù)交付: DevOps 和無運維 P6
在過去,開發(fā)團隊的任務(wù)是創(chuàng)建應(yīng)用并交付給運維團隊,然后運維團隊部署應(yīng)用并使它運行。 P6
而現(xiàn)在,讓一個團隊參與應(yīng)用的開發(fā)、部署、運維的整個生命周期更好。這意味著開發(fā)者、 QA 和運維團隊彼此之間的合作需要貫穿整個流程。這種實踐被稱為 DevOps 。 P6
帶來的優(yōu)點 P6
開發(fā)者更多地在生產(chǎn)環(huán)境中運行應(yīng)用,能更好地理解用戶的需求和問題、運維團隊維護應(yīng)用所面臨的困難
開發(fā)者更趨向于盡快發(fā)布上線,能進行快速迭代
簡化部署流程,開發(fā)者自己部署應(yīng)用上線
讓開發(fā)者和系統(tǒng)管理員做他們最擅長的 P6
Kubernetes 通過對實際硬件做抽象,然后將自身暴露成一個平臺,用于部署和運行應(yīng)用程序。它允許開發(fā)者自己配置和部署應(yīng)用程序,而不需要系統(tǒng)管理員的任何幫助,讓系統(tǒng)管理員聚焦于保持底層基礎(chǔ)設(shè)施運轉(zhuǎn)正常的同時,不需要關(guān)注實際運行在平臺上的應(yīng)用程序。 P7
介紹容器技術(shù) P7
Kubernetes 使用 Linux 容器技術(shù)來提供應(yīng)用的隔離,需要先通過熟悉容器的基本知識來更深入地理解 Kubernetes 。 P7
什么是容器 P7
用 Linux 容器技術(shù)隔離組件 P7
容器允許你在同一臺機器上運行多個服務(wù),不僅提供不同的環(huán)境給每個服務(wù),而且將它們相互隔離。容器類似虛擬機,但開銷小很多。 P7
一個容器里運行但進程實際上運行在宿主機的操作系統(tǒng)上,但容器里的進程仍然是和宿主機的其他進程隔離的。對容器內(nèi)的進程本身而言,就好像是在機器和操作系統(tǒng)上運行的唯一一個進程。 P7
比較虛擬機和容器 P8
容器更加輕量級,它允許在相同的硬件上運行更多數(shù)量的組件。一個容器僅僅是運行在宿主機上被隔離的單個進程,僅消耗應(yīng)用容器消耗的資源,不會有其他進程的開銷。虛擬機則需要運行自己的一組系統(tǒng)進程,會產(chǎn)生除了組件進程消耗以外的額外計算資源損耗。 P8
因為虛擬機有額外開銷,所以沒有足夠的資源給每個應(yīng)用開一個專用的虛擬機,最終會將多個應(yīng)用程序分組塞進每個虛擬機。而容器能夠(也應(yīng)該)讓每個應(yīng)用有一個容器,最終可以讓同一臺裸機上運行更多的應(yīng)用程序。 P8