簡介 P2


Kubernetes 能自動調度、配置、監管和故障處理,使開發者可以自主部署應用,并且控制部署的頻率,完全脫離運維團隊的幫助。 Kubernetes 同時能讓運維團隊監控整個系統,并且在硬件故障時重新調度應用。 P2


Kubernetes 抽象了數據中心的硬件基礎設施,使得對外暴露的只是一個巨大的資源池。 在部署多組件應用時, Kubernetes 會為每個組件都選擇一個合適的服務器,部署之后它能夠保證每個組件可以輕易地發現其他組件,并彼此之間實現通信。 P2


Kubernetes 系統的需求 P2


近年來,應用程序的開發部署的變化原因: P2


大型單體應用被拆解為更多的小型微服務

應用運行所依賴的基礎架構的變化

從單體應用到微服務 P2


單體應用由很多個組件組成,這些組件緊密地耦合在一起,并且在同一個操作系統進程中運行,所以在開發、部署、管理的時候必須以同一個實體進行。 P2


單體應用通常需要一臺能為整個應用提供足夠資源的高性能服務器,有兩種方法可以應對不斷增長的系統負荷: P3


垂直擴展:提升單機性能 —— 增加 CPU 、內存或其他系統資源

優點:不需要應用程序做任何變化

缺點:成本很快會越來越高,并且通常會有瓶頸

水平擴展:增加服務器數量

優點:能線性擴充系統性能

缺點:需要在架構層面支持水平擴展,部分組件難于甚至不太可能去做水平擴展(像關系型數據庫)

所思


垂直擴展總會達到單機性能的極限,所以終極解決方案是水平擴展,同時也可以通過垂直擴展進行輔助。


仔細回想一下,發現我們平時也是這樣處理的。由于歷史原因,我們項目核心功能的大部分代碼在同一個應用中,導致啟動就會占用大量資源,單機處理能力較差。在經歷各種配置下壓測后,選擇了合適的配置,然后就直接水平擴展,并且逐漸將一些壓力大的接口拆成微服務提供接口或者直接處理各種請求。


如果單體應用的任何一個部分不能擴展,整個應用就不能擴展,除非我們想辦法把它拆分開。 P3


將應用拆解為多個微服務 P3


服務之間可以通過類似 HTTP 這樣的同步協議通信,也可以通過像 AMQP 這樣的異步協議通信,并且微服務也可以選用最適合的開發語言來實現。 P3



圖 1.1 單體應用中的組件與獨立的微服務

每個微服務都是獨立的,可以獨立開發和部署。只要 API 不變或者向前兼容,改動一個微服務,并不會要求對其他微服務進行改動或者重新部署。 P3


微服務的擴容 P3


單體系統必須要對整個系統擴容,而微服務只需針對單個服務擴容。因此,我們可以選擇僅擴容那些需要更多資源的服務而保持其他的服務仍然維持在原來的規模。當單體應用因為其中一部分無法擴容而整體被限制擴容時,可以把應用拆分成多個微服務,將能擴容的服務進行水平擴展,不能進行擴容的組件進行垂直擴展。 P4



圖 1.2 每個微服務能被多帶帶擴容

部署微服務 P4


當組件數量增加時,部署相關的決定就變得越來越困難。因為不僅組件部署的組合數在增加,而且組件間依賴的組合數也在以更大的因素增加,并且配置工作變得冗雜易錯,同時因為跨了多個進程和機器,調試代碼和定位異常調用變得困難。 P4


環境需求的差異 P5


因為組件之間依賴的差異性,應用程序需要同一個庫的不同版本是不可避免的。當多個應用在同一個主機上運行就有可能會有依賴沖突。 P5



圖 1.3 多個應用在同一主機上運行可能會有依賴沖突

為應用程序提供一個一致的環境 P5


開發和運維團隊需要解決的一個最大的問題是程序運行環境的差異性: P5


開發環境和生產環境之間

各個生產機器之間

生產機器環境隨時間的推移而變化

為了減少會在生產環境才暴露的問題,最理想的做法就是讓應用在開發和生產階段可以運行在完全一樣的環境下,它們有完全一樣的操作系統、庫、系統配置、網絡環境和其他所有條件。這個環境不會隨著時間的推移而變化,并且在一臺服務器上部署新的應用時,不會影響機器上已有的應用。 P6


邁向持續交付: DevOps 和無運維 P6


在過去,開發團隊的任務是創建應用并交付給運維團隊,然后運維團隊部署應用并使它運行。 P6


而現在,讓一個團隊參與應用的開發、部署、運維的整個生命周期更好。這意味著開發者、 QA 和運維團隊彼此之間的合作需要貫穿整個流程。這種實踐被稱為 DevOps 。 P6


帶來的優點 P6


開發者更多地在生產環境中運行應用,能更好地理解用戶的需求和問題、運維團隊維護應用所面臨的困難

開發者更趨向于盡快發布上線,能進行快速迭代

簡化部署流程,開發者自己部署應用上線

讓開發者和系統管理員做他們最擅長的 P6


Kubernetes 通過對實際硬件做抽象,然后將自身暴露成一個平臺,用于部署和運行應用程序。它允許開發者自己配置和部署應用程序,而不需要系統管理員的任何幫助,讓系統管理員聚焦于保持底層基礎設施運轉正常的同時,不需要關注實際運行在平臺上的應用程序。 P7


介紹容器技術 P7


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


什么是容器 P7


用 Linux 容器技術隔離組件 P7


容器允許你在同一臺機器上運行多個服務,不僅提供不同的環境給每個服務,而且將它們相互隔離。容器類似虛擬機,但開銷小很多。 P7


一個容器里運行但進程實際上運行在宿主機的操作系統上,但容器里的進程仍然是和宿主機的其他進程隔離的。對容器內的進程本身而言,就好像是在機器和操作系統上運行的唯一一個進程。 P7


比較虛擬機和容器 P8


容器更加輕量級,它允許在相同的硬件上運行更多數量的組件。一個容器僅僅是運行在宿主機上被隔離的單個進程,僅消耗應用容器消耗的資源,不會有其他進程的開銷。虛擬機則需要運行自己的一組系統進程,會產生除了組件進程消耗以外的額外計算資源損耗。 P8


因為虛擬機有額外開銷,所以沒有足夠的資源給每個應用開一個專用的虛擬機,最終會將多個應用程序分組塞進每個虛擬機。而容器能夠(也應該)讓每個應用有一個容器,最終可以讓同一臺裸機上運行更多的應用程序。 P8