騰訊萬臺規模的Docker應用實踐

Docker提供了一種在安全、可重複的環境中自動部署軟件的方式,拉開了基於雲計算平臺發佈產品方式的變革序幕。騰訊內部對Docker有着廣泛的使用,其基於Yarn的代號爲Gaia的調度平臺可以同時兼容Docker和非Docker類型的應用,並提供高併發任務調度和資源管理,它具有高度可伸縮性和可靠性,能夠支持MR等離線業務。爲了剖析Docker on Gaia背後的實現細節,InfoQ專訪了騰訊數據平臺部高級工程師羅韓梅,另外作爲QCon全球軟件開發大會的講師,羅韓梅將會分享題爲《Gaia——萬臺規模的Docker應用實戰》的演講。關於Docker的交流討論,也可以加入我們的QQ羣:124378115。

嘉賓介紹

羅韓梅,騰訊數據平臺部高級工程師,任數據中心資源調度組副組長。2009年加入騰訊,主要從事統一資源管理調度平臺的開發和運營,承擔過騰訊自研雲平臺“颱風”中Torca資源調度子系統的研發,目前主要專注於開源技術、分佈式數據倉庫、分佈式資源調度平臺、Docker等領域。

InfoQ:能否介紹下目前Gaia平臺的狀態?你們什麼時候開始使用Docker的?有多大的規模?

羅韓梅:Gaia平臺是騰訊數據平臺部大數據平臺的底層資源管理和調度系統,其上層業務包括離線、實時以及在線service服務,如Hadoop MR、Spark、Storm、Hive以及騰訊內部的Lhotse、Hermes、廣點通等業務。最大單集羣規模達8800臺、併發資源池個數達2500個,服務於騰訊所有事業羣。我們是2014年10月份正式上線Docker,之所以選擇Docker,一方面是因爲Gaia本來就一直在使用cgroups類型的容器,深知其在共享機器資源、靈活、輕量、易擴展、隔離等方面的重要意義。另一重要原因,是Gaia作爲一個通用的雲操作系統,適合所有類型的業務,但是各個業務的環境依賴是一個比較困擾用戶的問題,因此我們引入Docker來解決,主要目的還是通過Docker來將Gaia雲平臺以更有效的方式呈獻給各個業務。

我們使用的OS是騰訊內部的tlinux 1.2版本,最新版本正在tlinux2.0上測試,除了Docker,也使用了etcd用來做服務註冊和服務發現。我們的集羣都是同時兼容Docker應用和非Docker類型的應用的,MR等應用還是使用的cgroups類型的容器,其它服務使用的Docker容器,目前,大概有15000多常駐的Docker容器,還有大量業務接入測試中。由於我們原本就是使用的cgroups容器,所以換成Docker後,性能基本也無損耗,可以滿足線上需求。

InfoQ:騰訊是如何把Yarn與Docker深度結合的?

羅韓梅:在騰訊的場景下,首先一個特點就是,業務總類極大,尤其是離線處理規模很大,因此Yarn原生的調度器,效率遠遠跟不上,因此我們開發了自研調度器SFair,解決了調度器效率和擴展性問題。另外,騰訊的業務特性多樣,因此我們引入了Docker,雖然Yarn支持不同的應用類型可以實現不同的AM(應用管理器),但是對於絕大多數應用來說,他們並不熟悉Yarn,實現一個支持容災、可擴展的完善AM,困難較大,因此我們抽象了可以使用Docker的業務,對其進行封裝,實現了統一的AM,並且對用戶透明,而對用戶提供的是另一套全新的基本的、易於理解的高級接口。同時,我們爲Docker業務實現了統一的服務註冊和發現機制,並也將其封裝在了新接口中。另外,在資源管理方面,我們修改了內存管理機制,引入了磁盤和網絡帶寬管理。

除了Yarn之外,其實我們對Docker本身也做了一定的修改和bug修復,對於Registry等服務也做了優化,保證了其服務的高可靠和性能。

實現方面,我們並沒有使用社區提供的Docker調度器,我們研發Gaia的時候社區還沒有相應的調度器,並且我們也有特殊要求,需要同時支持同時支持Docker類型應用和非Docker類型應用。

InfoQ:你們如何確定哪些業務適合使用Docker?

羅韓梅:我們認爲,Docker提供了一種在安全、可重複的環境中自動部署軟件的方式,拉開了基於雲計算平臺發佈產品方式的變革序幕,因此,其實Docker對於Gaia來講,只是一個選擇,我們並不主動向業務推廣Docker,而是Docker on Gaia的整套方案,所以,我們對於需要共享資源、降低成本,需要支持快速的動態擴容縮容、容災容錯,以及大規模分佈式系統尤爲建議使用Docker on Gaia。

InfoQ:能否詳細介紹下你們對Docker以及Registry做了哪些優化?

羅韓梅:對於Docker,我們主要做了三個方面的優化:首先是bug修復,比如Docker非0退出時rm不生效,對於bindmount爲true時config path無法清除等bug。其次是優化Docker的資源管理策略,比如內存的Hardlimit的管理策略,不但使用戶進程容易被kill,更加造成了資源的浪費,對用戶估計自己業務的資源需求也非常高。Gaia引入了EMC(Elastic Memory Control)的彈性內存管理機制。最後一個方面是資源管理緯度,Docker在資源管理緯度方面只有CPU和內存兩個維度,這對於共享的雲環境下需要完善,也是目前相對於虛擬機不足的地方。Gaia引入磁盤容量管理,網絡出入帶寬控制以及磁盤IO的控制維護。其實不僅僅在Docker層做控制,還將會引進調度器,不但實現資源的隔離,還要實現資源的保證。

對於Registry的優化,主要有下面幾個方面:

  1. 容量問題。開源的Registry是單機模式,其容量會受單個機器的限制。我們修改存儲driver,取締原有的mount方式,開發後端存儲driver,直接使用HDFS,實現了存儲的無限容量。
  2. 可靠性和可用性的問題。單機版本的Docker Registry,其可靠性和可用性都成了最大的問題,我們引入數據平臺部的tPG系統,實現Registry server的無狀態化,便於實現服務的高可用性。
  3. 性能問題。將單機版的Registry擴展成Registry集羣,並實現在Registry server pool中的負載均衡,提升性能。
  4. 網絡問題。解決了全國不同IDC的Gaia集羣對Registry的訪問,採取就近訪問的原則,不產生跨IDC流量。
  5. 自動同步官方鏡像。Docker提供的官方鏡像中,有很多還是非常有價值的,而官方的Registry又在牆外,爲此,我們自動同步docker的官方鏡像到我們的私有倉庫中。

InfoQ:能否介紹下目前的一個workflow?

羅韓梅:目前使用Docker on Gaia的方式有三種:1)通過Gaia Portal;2)直接調用Gaia api;3)通過上層各種PaaS平臺透明間接使用Gaia。比如在第一種方式中,用戶通過Gaia Portal提交應用,之後Gaia調度器會自動分配資源,並且部署、啓動Docker容器,用戶可以在Portal上直接查看每個實例的狀態、日誌、異常等,甚至可以直接通過webshell登陸。同時,也可以根據需求對應用進行擴容、縮容、重啓,以及灰度變更、停止實例/應用等操作。

InfoQ:目前平臺主要部署了哪些服務?服務之間的調度是如何實現的?

羅韓梅:目前平臺上的服務有Hermes、通用推薦、廣點通、遊戲雲等服務,很多服務都需要多實例部署,因此跨主機部署非常普遍,而不同服務直接也經常會有調用的需求,主要是通過Gaia提供的服務註冊和服務發現機制。具體地,NM(Yarn的一個組件)在啓動Docker容器時,會將該Docker的真正地址,包括ip和所有的端口映射,都會通過etcd做自動的服務註冊。對於Docker內部的服務,我們通過修改Docker源碼,擴展了幾個Gaia相關的環境變量,將IP以及端口映射傳入。服務的註冊和發現本質上一種名字服務,因此不難理解爲什麼在創建應用的時候,讓用戶填一個應用 name的字段。而這種基於名字的服務是貫穿這個Gaia的過程的:在提交作業時,用戶不需要指定Gaia master的地址,而是通過指定Gaia 集羣的name即可;在獲取應用的地址時,也是通過應用的名字獲取;本質上port mapping也是一種名字,只不過是將用戶原來expose的端口作爲name,將實際端口作爲value。至此,不難理解爲什麼name需要檢查衝突。

InfoQ:萬臺規模的Docker容器,網絡問題是如何解決的?

羅韓梅:網卡及交換鏈路的帶寬資源是有限的。如果某個作業不受限制產生過量的網絡流量,必然會擠佔其它作業的網絡帶寬和響應時延。因此Gaia將網絡和CPU、內存一樣,作爲一種資源維度納入統一管理。業務在提交應用時指定自己的網絡IO需求,我們使用TC(Traffic Control)+ cgroups實現網絡出帶寬控制,通過修改內核,增加網絡入帶寬的控制。具體的控制目標有:

  1. 在某個cgroup網絡繁忙時,能保證其設定配額不會被其他cgroup擠佔;
  2. 在某個cgroup沒有用滿其配額時,其他cgroup可以自動使用其空閒的部分帶寬;
  3. 在多個cgroup分享其他cgroup的空閒帶寬時,優先級高的優先; 優先級相同時,配額大的佔用多,配額小的佔用少;
  4. 儘量減少爲了流控而主動丟包。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章