大家對Kubernetes技術有一定了解,我主要分享自己一些觀點和了解,通過倆個形象易懂的案例分享學習Kubernetes的方法。
什麼是Kubernetes?可以從以下四個角度來了解
第一,Kubernetes未來處于什麼樣的位置?
未來,大部分公司IT基礎設施可能的架構圖如下圖,IT基礎設施都會部署在雲上,使用者基于Kubernetes把底層的雲資源拆分成叢集單元給不同的業務使用,随着業務微服務化的深入,服務網格等服務治理的邏輯會變得跟下邊的這兩層一樣,成為基礎設施的範疇。
目前阿裡雲基本所有的業務都跑在雲上,其中,約一半的業務已遷移到自己定制的Kubernetes叢集,并計劃在今年完成百分百業務基于Kubernetes叢集部署。目前這個趨勢非常明顯,未來幾年,Kubernetes會像Linux一樣,作為叢集的作業系統無處不在。
第二,Kubernetes和傳統作業系統的比較
下圖,傳統的作業系統Linux或Windows等扮演的角色就是底層硬體的抽樣層,向下管理計算機的硬體如記憶體、CPU等,把底層硬體抽象成應用的程式設計接口對應用層提供支援。
Kubernetes可以被了解成作業系統,但它向下管理的硬體不像是單機系統有自己的CPU資源等硬體,它管理的硬體可以了解成“底層多台計算機組成的叢集”。
這些叢集位于雲上或本地的一些硬體的叢集,Kubernetes把它們當成一個資源池統一管理,并向上對應用提供支援,而其上邊的應用都是容器化的,可以把它們了解成一些安裝包,包裡自己打包了所有依賴庫,就像libc或者Java的runtime等東西,不需要再去依賴于底層的作業系統的依賴庫或者runtime來運作。
第三,Kubernetes和《Google運維解密》
如下圖,左為Kubernetes叢集,右為《Google運維解密》,這本書相信很多人都看過,很多公司也在實踐這本書的運維方法,像故障管理,運維排班之類的東西,Kubernetes和Google運維解密這本書的關系可以比作《笑傲江湖的》裡的劍法和氣功的關系。
Kubernetes源自Google叢集自動化和排程管理Borg系統,也是這本書裡運維方法所管理的對象,Borg系統和書裡各種運維方法可以看作是一個事情的兩個方面,如果一個公司隻學習我們的運維方法,開了很多SRE職位,其實是學了葵花寶典其中一部分,Borg是Google的内部系統,我們一般是看不到的,而Kubernetes基本上繼承了Borg在叢集自動化管理方面非常核心的技術,是以看了這本書并且覺得這本書非常厲害或者已經在實踐這本書裡的方法的人,一定要深入了解下Kubernetes。
第四、技術演進史
早期建立網站,隻需把所有的子產品放一個可執行檔案裡,如下左圖,把UI、業務和資料三個子產品編譯成一個可執行檔案跑在一台伺服器上。
随着業務量的快速增長,沒有辦法通過更新底層伺服器配置的方法來擴容,這個時候就必須要做微服務化的處理,微服務化的架構把單體的應用拆成小的應用,這些應用各自負責一個子產品,每個應用執行個體獨占一個伺服器,它們之間通過網絡來互相調用,如下中間的圖,這裡最關鍵在于我們可通過增加應用的執行個體來做橫向擴容,解決單台伺服器無法擴容的問題。
而一個執行個體占一台伺服器,這種方式造成嚴重的資源浪費。如果把這些應用執行個體混部到底層伺服器上,底層的伺服器組成一個叢集,就可以節省很多資源,而混部又會引入兩個新的問題:
首先,UI,業務和資料,這些應用可能用不同語言寫的,依賴的庫版本不一樣,如果安裝在一個系統裡會出現相容性問題。
其次,是應用的排程和叢集資源管理的問題,混部需要解決一些應用出來之後放到哪個節點去運作、放到這個節點之後資源夠不夠用這些問題。
相容性問題是通過容器化解決,每個應用自帶依賴庫,隻跟其他應用共享核心,排程和資源管理就是Kubernetes所解決的問題,而業務規模持續增長的話,叢集裡混部的應用會很多,像淘寶的後端有很多的微服務,互相關系錯綜複雜,出現一些請求蠻多問題都無法去排查,于是新的如服務網格這類服務治理的技術被引入,是以下一個技術便是服務網格的技術,大家可以去了解。
怎樣學習Kubernetes
了解了Kubernetes之後,應該怎樣學習Kubernetes呢?
首先你需要知道,Kubernetes之是以門檻較高,一是因為技術棧很深,涉及的内容很多,如下圖右上框所列,這類絕對稱得上全棧的技術。
其次,Kubernetes的雲環境的實作牽扯到産品廣度很廣,如在阿裡雲涉及的産品如下圖左邊框所示,這些一個個學起來是相當複雜的。
最後一點是Kubernetes的适用邊界相當廣泛,因為Kubernetes是通用的計算平台,會被應用到各種應用場景,如下圖右下角框所列。
這麼複雜的東西,應該從了解、動手、思考三個方面去把握:
首先,需要了解技術的演進曆史,以及技術的全景圖。知道各種技術的演進曆史,如容器技術是如何從一個指令發展而來,以及技術演進背後解決的問題,隻有知道技術的演進史和發展的動力,才能判斷未來發展的方向和下一步的需求。
同時對Kubernetes來說,需要了解整個雲原生的技術棧,包括容器,持續內建、持續傳遞、微服務、服務網格等,知道Kubernetes在整個技術棧裡所處的位置。
除背景知識外,動手實踐也非常關鍵,據我和大量工程師一起解決問題經驗來看,很多人不會深入研究技術細節,我們常開個玩笑把工程師分兩種中,Search Engineer(搜尋工程師)和Research Engineer(研究工程師),很多工程師遇到問題就Google一把,找不到答案就直接問别人或者開工單,這樣是很難深入了解一個技術的。
最後一點是如何思考和總結,我們需要在了解一些技術之後,不斷地探索這些技術背後有沒有更本質的東西,把複雜的細節看簡單,找出比較普遍的模式出來,有利于了解和應用。
《深入淺出Kubernetes》中有兩個例子,如下圖,關于叢集控制器,在學習Kubernetes的時候,會有些概念如聲明式API ,operater等,這些概念本質上就是控制器模式,如何了解Kubernetes的控制器?下圖最左邊的小圖,經典的Kubernetes的架構圖,它有叢集的管控節點和工作節點,管控節點有中心資料庫,API Server,排程器,以及一些控制器:
中心資料庫是整個叢集的核心重組系統。API Server是叢集的管控入口,排程器負責把應用排程到資源充沛的節點上。
控制器是一個重點,它的作用可比作是“讓夢想照進現實”的作用,從一定意義上來講,我自己經常扮演控制器的角色,比如我女兒說“爸爸,我要吃冰激淩”,她就是叢集的使用者,我就是負責把她願望實作的人,扮演了控制器的角色。
除了管控節點之外,Kubernetes叢集許多工作節點,這些節點部署了Kubelet和Proxy兩個代理,Kubelet管理工作節點,包括應用在節點上的啟動和停止之類的工作,Proxy負責把服務概念的定義落實成具體的iptables或者 ipvs的規則,這裡服務簡單來說就是利用iptables或者ipvs來實作的負載均衡。
如果從控制器的角度來看,第一張圖得到第二張圖,叢集實際上就包括一個中間資料庫,1個叢集接口、很多控制器,這些控制器包括排程器、Kubelet等,這些元件通過不斷地從API Server觀察叢集裡邊資源的定義,需求的定義,将其落實成為具體的配置,如容器啟停,iptables的配置,扮演的都是控制器的角色。
從控制器角度來觀察Kubernetes叢集,就會得到Kubernetes叢集最根本的原理,控制器的模式,控制器的模式在生活中無處不在。
用冰箱做個例子:我們控制冰箱的時候并非直接控制冰箱的制冷系統或者照明系統,打開冰箱,燈就會自動亮起;設定了想要的溫度的話,即使人不在家,制冷系統也會一直保持這個溫度,背後就是控制器模式在起作用。
第二個例子,來看一個真實問題的排查過程——為什麼删除不掉命名空間,問題稍微複雜,來一步步看下:
命名空間是Kubernetes的收納機制,如圖中的盒子,裡面收納橡皮鉛筆等,命名空間其實是可以删除和建立的,經常遇到命名空間不能删除的問題,遇到這個問題,如果完全不知如何排查,可研究下API Server,因為它是叢集的入口,總歸需要知道API Serverr遇到删除之後它做了什麼。
API Serverr本身就是個普通的應用,可通過提升應用的日志級别來深入了解它的操作流程,在這個問題裡,可通過看API Serverr進階别的日志,會發現它收到删除指令後,它其實就沒有其他資訊了。
這裡需要了解下删除命名空間的操作,使用者在删除一個命名空間的時候,命名空間并不會被直接删除掉,而是會被改成正在删除中的狀态,這時命名空間的控制器會如前文所說去不斷觀察叢集裡的資源的狀态,不斷地監視所有的命名空間,發現了命名空間變成了正在被删除的狀态的話,就去做些操作。
了解這些概念之後,想去了解命名空間控制器行為的話,可以像處理API Server一樣,把命名空間的日志級别提高起來,看詳細日志,這時,會發現控制器正嘗試擷取所有API 分組。
這裡需要了解兩件事:一、删除命名空間的時候,控制器為什麼要擷取API 分組。二、API 分組是什麼,它就是叢集API 的分類機制,如網絡相關的API 都會分在networking.Kubernetes.iovlbeta1這個分組裡,而通過網絡API 建立的資源,就屬于這個分組。
為什麼删除命名空間的時候,控制器要去擷取API 分組呢?因為删除命名空間的時候控制器需要删除命名空間裡所有的資源,這操作不像我們平時删除檔案夾一樣會直接吧裡邊的檔案一起删掉。
命名空間收納資源實際上類似于索引的方式指向了命名空間,而不是命名空間裡包括了這些資源,是以叢集隻有周遊所有的API 分組,找出指向這個命名空間的資源,才能逐個把這些資源删掉,而周遊API 分組這個操作會是叢集的API Server和它的擴充進行通信。
這裡的擴充是API Server可能會定義叢集比較核心的API 或者API 分組,有時候需要對這些叢集做一些擴充,如接一些外接的功能,開發新的應用,擴充裡邊又有新的API 分組。
是以如果想知道命名空間裡正在被删除的資源都是什麼,那就需要通信,把所有的API 分組拿出來,是以,到了這裡之後問題就變成API Server及其擴充進行通信的問題,于是删除資源的問題變成了網絡的問題了。
接下來講下阿裡雲Kubernetes叢集網絡相關的實作,阿裡雲Kubernetes叢集在VPC網絡,虛拟區域網路建立的,預設情況下VPC隻認識VPC的網段位址,一般情況,叢集裡邊的容器不會使用VPC相同的網段,通過在VPC的路由表裡增加一些容器網段相關的路由項,如下圖右下角的圖,一個跑的是API 另一個跑的是擴充,就可以讓容器使用VPC網絡進行通信了。
以上就關于Kubernetes的一些了解和學習經驗分享,更多幹貨知識可以在點子書《深入淺出Kubernetes》中了解到。
這本書是最近一年多,我們在Kubernetes和服務網格領域一部分的技術沉澱,其中一些内容已經在InfoQ,阿裡雲技術、阿裡巴巴雲原生公衆号上有發表過,這次在阿裡雲開發者社群和自己團隊的幫助下做了本電子書,希望通過這本電子書分享阿裡雲線上問題的診斷經驗。
我們每天都會處理大量的線上問題,以後也會新增新的問題、案例出來,本書就當做1.0 的版本,後續新的案例和新的文章會通過2.0或者3.0的方式分享給大家。
總體來說,書有3大特點
1、簡單易懂分析Kubernetes叢集核心原理
2、是阿裡雲真實線上問題診斷的集錦
3、難得的Kubernetes診斷方法和調制方法
我們是阿裡雲售後技術團隊,重要的一項工作就是服務,經常需要相對易懂和比較有創意的方法把晦澀難懂的技術解釋給客戶聽,是以書中的很多原理的解釋都非常形象易懂的(如本次分享就是個例子)。
其次阿裡雲售後技術兜底團隊,需要解決大量疑難取決的問題,部分問題複現機率極低,可能需要幾個月才有一個客戶碰到,這類問題也隻有在阿裡雲這樣大的平台才會複現和診斷出結果,書中也包括這樣的案例,案例分析會關聯多個Kubernetes元件,針對這些元件的調試方法,在其他地方一般看不到,給大家獻上啦,不容錯過哦:
開放下載下傳!《深入淺出Kubernetes》