1. 程式人生 > >騰訊Docker雲平臺GaiaStack

騰訊Docker雲平臺GaiaStack

GaiaStack是基於kubernetes打造的Docker私有云平臺,騰訊內部所有BG都有產品或者服務在GaiaStack上執行。GaiaStack的本質是一個資源管理和排程平臺,作為一個雲作業系統服務於上層的各類應用。


GaiaStack是基於kubernetes,但是和kubernetes還是有很多不同。GaiaStack提供了從構建到交付到執行的一整套解決方案,包括程式碼構建、持續整合、容器服務、映象倉庫、服務編排等功能。我們最初的目標是服務公司內部產品的,現在藉助網際網路+和騰訊雲開放GaiaStack的能力,服務更多的政企使用者。

下面是GaiaStack的邏輯架構圖,可以看到kubernetes是我們的核心繫統,因此GaiaStack對使用者交付的基本單元就是pod。但是也可以看到kubernetes只是GaiaStack的一個元件,還有很多其他關鍵元件。

GaiaStack更詳細的物理架構圖如下,主要還是基於kubernetes、Docker、Ceph、ES、etcd等開源系統,也有我們自研的很多關鍵元件,包括webportal、gate、apiswitch、deployment、CI-server等。我們將所有元件劃分為三個層次,分別是global層、IDC層和cluster層,將所有叢集的公共服務放到global層,由於IDC內部和跨IDC的網路環境差異比較大,所以我們將同一個IDC的多個叢集可以共享的元件放到IDC層,如Ceph、Monitor等。

GaiaStack的特性非常多:首先是自動化運維,包括叢集管理、監控告警、系統日誌管理、使用者賬戶管理等等,提供視覺化、自動化的工作,降低使用者的人力成本和學習成本;支援企業內多叢集、多租戶管理模式,更加適用開發/測試環境的隔離,地區之間共享公共服務、企業內部多種業務共享叢集等;全系統HA、熱升級,即使GaiaStack平臺版本升級,也不會影響應用的執行;協議相容方面,同時支援Docker compose和kubernetes編排,支援多種Docker使用者的使用習慣;更多維度的資源管理,保證可以更加安全的使用容器雲;彈性伸縮可以全自動秒級擴容縮容,及時響應業務需求;依託騰訊內部穩定的Ceph服務,開發Docker雲硬碟功能;也支援多種不同的網路模式。這裡沒有列出的還有很多,比如使用者日誌檢索、WebShell、程式碼構建、操作記錄審計等等。

做Docker容器雲的廠商也有不少,其特性實現大多大同小異。GaiaStack最大的特色,就是它是一個真正通用的叢集OS,目標是支援ALL。這個ALL的支援,根本上是為了做線上和離線業務的資源共享。我們都知道線上服務通常都具有以天為週期的資源特徵,但是每個小時資源又多不同,甚至波動很大。為了充分利用資源,我們將線上和離線混布,這是一個具有極大收益的事情。但是kubernetes、Docker、kernel等很多底層系統卻還沒有準備好。為此,GaiaStack在底層能力建設這塊投入了很多工作,主要包括kernel、Docker、Ceph、registry、kubernetes這幾個方面。


首先是kernel。Docker雲平臺使用Docker來做資源的隔離,但本質上是使用了核心的cgroups來實現的。我們要做線上和離線的共享,而共享的前提一定是隔離。Docker和虛擬機器相比,最被詬病的就是隔離做的不足,GaiaStack在核心引入對網路入頻寬和disk IO的subsystem,來完善我們的資源控制。並且除了資源維度的增加,我們對所有資源還都採用了一種彈性的管理方式。

下面以網路入頻寬為例:這個圖是沒有網路入頻寬控制時,兩個程序的頻寬和時延都得不到任何保證。我們對網路IO的控制目標主要有兩個:一是保證配額資源,第二是當有空閒資源時,不要浪費,可以借用其他cgroups的空閒頻寬。當然還有優先順序相關的控制,以及效能的要求。

加入了GaiaStack的網路入頻寬控制之後,對於資源需求分別是50M和800M的兩個cgroups,機器可供分配的總頻寬是850M,也就是沒有空閒頻寬,兩個cgroups都按照自己的資源需求得到了頻寬。第二個圖,機器上仍然是850M的總頻寬,兩個cgroups分別是20和70M,那麼有130M的空閒頻寬,我們可以看到兩個cgroups可以用到超過自己配額的資源。

在diskIO的控制方面,其實cgroups是有一個blkio的子系統的,但是幾乎沒有哪家Docker雲平臺使用,根本原因有兩個:第一,blkio對buffer IO是沒有控制的。

第二,blkio有兩個控制策略,分別是io weight和 throttle模式,但是其實這兩個模式都不實用。Io weight使用時間片進行分割,而不是通過iops或者bps進行衡量。使用者觀察到的傳輸資料波動比較大。而throttle模式本質上是一種hard控制模式,無法充分利用資源。我們對disk IO的控制和前面對網路入頻寬的控制目標是一致的。下圖是控制效果,對於buffer write的測試,總的頻寬有空閒,那麼這兩個Docker不但可以用到保證值,而且都可以達到ceil值。對於direct write,效果也是類似的。

Docker也是GaiaStack重點建設的底層能力,我們的Docker在騰訊內部是開源的,騰訊很多業務都使用我們的Docker,也有不少團隊一起做貢獻,當然我們也積極的向社群提交我們的一些patch。我們Docker的優化主要有這幾個方面:首先最多的還是bug fix,保證線上的穩定性。另一個重點特性就是熱升級的功能,保證當平臺要升級Docker daemon時,對上面執行的應用程序完全不影響。第三個部分就是為Docker增加了很多外掛,比如彈性記憶體控制、RBD外掛、網路外掛等,豐富了Docker的功能。

Ceph是GaiaStack的一個子團隊,我們對Ceph的使用主要有兩個方面:一是做離線資料的儲存。有不少的業務,尤其是非hadoop生態的新的離線業務,他們更喜歡用Cephfs,因為可以完全透明的使用Cephfs,就像使用本地磁碟上的資料一樣。Cephfs是Ceph最複雜,也是最不穩定的地方,所以GaiaStack在這塊做了不少的優化,包括在可擴充套件性方面,實現了多MDS,在效能方面,特別針對大目錄中大量檔案的場景做了效能優化,另外,在核心的Cephfs模組,也fix了大量的核心bug,以及新特性開發。對Ceph的第二個使用是雲硬碟。GaiaStack實現了兩類雲硬碟,普通雲硬碟和內建雲硬碟。內建雲硬碟支援臨時雲硬碟和可遷移雲硬碟。

下面是對kubernetes的建設。這裡不得不說kubernetes真的已經很強大了,但是我們如果要把kubernetes用到ALL的場景下,對它的改造也是一言難盡。首先是quota管理,kubernetes的quota是以pod為單位的,而線上應用和離線應用有個很重要的地方在於准入檢查,所以對於線上業務,我們不能以pod為單位去檢查。在app這裡,其實kubernetes已經支援了非常多的應用型別,但是我們發現不論是線上還是離線,實際場景中,還是不夠用。比如線上業務,尤其是騰訊的業務,很多都有灰度升級的強烈需求,這裡的灰度和kubernetes的灰度還不太一樣。很多使用者是想長時間的讓業務在多版本的穩定狀態下,所以我們開發了tapp的應用型別;在網路模式方面,沒有哪種網路模式是最優的,只有最適合的。比如host網路效能很好,但是有埠衝突,需要應用適應,特別是使用了第三方庫的業務來說,更加困難;Floating IP看起來很方便,但是很多場景下IP資源是有限的;overlay的IP資源沒有限制,但是互通性不好;NAT一定程度上解決了埠衝突,但是效能不足,等等,所以GaiaStack讓應用可以選擇最適合的網路模式;磁碟管理是非常重要的一塊,依託我們前面講的Ceph,我們有些叢集已經完全消滅了本地磁碟,全部採用雲硬碟,可以讓雲硬碟跟著pod走,也可以讓雲硬碟當作臨時工作目錄,隨時建立,隨時銷燬;最後,對於GPU應用,kubernetes簡單的把GPU卡當作一種資源,我們增加了GPU的排程邏輯,考慮了GPU的拓撲關係,讓應用可以獲得更好的效能。

Registry是GaiaStack的基本元件,我們服務線上應用時,一般沒有什麼問題,但在離線應用中,需要大規模的應用部署時,效能問題就暴露的比較明顯了,為此,我們開發了P2P的Registry。在映象下載過程中,引入BT協議,在blob上傳時,對blob生成種子,在下載映象的blob時,先下載種子,再通過種子檔案下載資料。而在具體的實現中,我們採用了一個外部的agent元件,這樣不需要修改Docker daemon,對Docker做到了零入侵。


看下P2P registry的效果,我們可以看到,隨著節點數的增加,並沒有顯著延長映象的下載時間,並且節省了大量的registry流量。


最後,我們談談GaiaStack的開放。GaiaStack立足於開源專案,已經向社群提交了大量的issue,同時,也會以私有云的方式開放給廣大政企使用者,目前已經上架到騰訊雲的黑石上。黑石是在騰訊雲直接售賣物理機,在私有云場景下,與Docker結合,可以達到最優的效果,而且GaiaStack也針對黑石的環境做了專門的對接,比如,相容了黑石網路,GaiaStack自研了遵循CNI網路標準的kubernetes網路外掛,與黑石的VPC網路進行了打通,使得容器與容器,容器與黑石物理機,容器與叢集外同VPC的服務均可以直接路由。相容了黑石負載均衡,直接使用容器的VPC IP註冊黑石的負載均衡,避免了kubernetes基於iptables NAT實現的nodePort方式的效能損失等。當然,除了在黑石的環境,在騰訊雲的虛擬機器環境,在使用者自己的機房環境下,GaiaStack也可以以私有云的方式服務。為了更好的開放,我們將GaiaStack全面產品化,引入了套件做自動化,視覺化的部署和運營系統。比如主機檢視、服務檢視,也可以在頁面上自動擴容叢集,下線機器等。同時,為了更好的運營雲平臺,我們引入了主機管理、服務管理、業務管理、使用者管理、監控、告警、日誌、配置管理等等,讓GaiaStack成為一站式的容器雲PAAS平臺。