騰訊遊戲是如何使用Docker的

2022-07-27 19:30:22 字數 4156 閱讀 1499

**:

作者 郭蕾 發布於 2023年8月15日 |

討論 現在,我們的docker平台上已經跑了數十款端遊、頁遊和手遊的各種遊戲應用,特別是新上的手遊業務,其中,我們**的一款重量級手遊《我叫 mt2》,乙個業務就使用了700多個容器。現在整個平台總共有700多台物理機,3000多個docker容器。這個數字在業界並不算多,我們自己也沒 有刻意去追求數量,相對數量,我們更願意以穩為先。目前,整個平台執行了大半年,整體執行良好。

infoq:與其它行業相比,遊戲行業有什麼特殊性?docker在這樣的業務中有什麼樣的優勢?它可以發揮怎麼樣的價值?

尹燁:相比於其它業務,一是遊戲業務更加複雜多樣,有端遊、手遊和頁遊,有的是分區分服,有的是全區全服;另 外,我們又分自研和**遊戲,更加增加了複雜性。這也給業務的運維部署帶來了許多不便,儘管我們內部有很成熟的部署平台。而docker統一的映象分發方 式,可以標準化程式的分發部署,解放運維的生產力。特別是**遊戲,如果都以image方式交付,可以極大提高效率。

尹燁:docker開創性的提出了『build、ship、run』的哲學。總的來看,現在主要有兩種使用docker的方式。一是基於docker搭建 ci/cd平台,重點放在build和ship上面,一般用於開發、測試環境;另外就是將docker容器當作輕量級虛擬機器,更加關注run的問題,大規 模的用於生產環境。個人認為,這兩種方式無所謂誰好誰壞,長遠來看,二者會漸漸趨於統一。

infoq:能否介紹下你們線上的docker集群所使用的技術棧?第二個問題就是容器集群的管理排程,那時候雖然出現一些專門針對docker的容器管理工具,比如fig、shipyard等,但這些工具無法勝任 生產環境大規模集群管理排程。剛好那時google開源了kubernetes,它是borg的開源版本實現。源於對google的崇敬,我們研究了一下 原始碼,基於0.4版本,針對我們的環境做了一些定製修改,用於我們的集群管理排程。現在我們最大的單個kubernetes集群700多台物理機、將近 3000個容器,生產乙個容器只需幾秒鐘。

(點選放大影象)

這些解決方案都是基於開源系統來實現的,當然,我們也會把我們自己覺得有意義的修改回饋給社群,我們給docker、kubernetes和lxcfs等開源專案貢獻了一些patch。融入社群,與社群共同發展,這是一件很有意義的事情。

infoq:在我的印象裡,遊戲還是相對較保守的行業。你們在內部推進docker過程中遇到過哪些阻力?是如何解決的?

尹燁:首先,我們會在docker新功能接入與業務原有習慣之間做好平衡,盡量降低業務從原來的物理機或虛擬機器切換docker的門檻,現階段業務接入我們的docker平台幾乎是「零門檻」。正如前面所述,我們的docker平台上已經跑了數十款端遊、頁遊和手遊。

其次,docker相對原有的開發部署方式變化很大,與其它新事物一樣,讓大家全部適應這種方式是需要一些時間,但docker本身的特性是能夠在 遊戲運營的各環節中帶來諸多便利,我們的業務主觀上對新技術的應用還是歡迎的,雙方共同配合,共同挖掘docker在遊戲運營的中的優勢,所以 docker推廣目前沒有遇到太大的阻力。

infoq:應用過程中,哪些問題是docker目前無法解決的?你們的解決方案是怎樣的?

尹燁:我們在實踐過程中遇到了很多問題,有些是核心的問題,也有些是docker本身的問題。由於篇幅問題,這裡僅舉一些比較大的問題。詳細的分享留到8月底的容器技術大會吧。

整體架構比較簡單,與原來虛擬機器的網路架構一致。每個容器都有乙個獨立可以路由的ip,網路效能大幅提高,基本能滿足業務的需求。而且,每個容器都可以攜帶ip在同乙個核心交換機下任意漂移,業務通過ip漂移可以做很多有意義的事情,比如host故障快速恢復等。

另外,我們針對一些對網路效能要求高的應用,直接使用sr-iov,可以完全達到物理機的網路效能。

容器相對於虛擬機器,有很多優勢,但是也有一些劣勢,比如安全性、隔離性等。由於我們是內部業務,所以安全性的問題不是那麼突出,但隔離性的問題還是

給我們帶來了很多麻煩。效能監控我們通過lxcfs基本解決,但是還是有一些問題無法解決,比如核心引數的問題。很多核心引數沒有實現namespace

隔離,centos 6.5的核心下,在容器內部修改,會影響整個host,我們只能在

host上設定乙個最優的值,然後告訴業務,讓他們不要在容器內部修改核心引數。3.10.x的核心要好一些,對於沒有實現namespace的引數,在

容器內部不可見,這可以防止業務私自修改核心引數,避免對別的業務造成影響。但是,有些業務對核心引數有特殊要求,我們只能讓業務選擇虛擬機器。

再舉個例子,一些業務會將程式進行cpu繫結,這可以避免cpu切換帶來的效能損失,由於程式無法獲取cgroup對容器cpuset的限制,繫結會失敗,這需要業務程式先獲取容器的cpuset,但還是給業務帶來了不便。

再比如,現在cgroup對buffer io並不能進行throttle限制,不過核心社群已經在解決了,但離生產環境使用,可能還需要些時間。

還有docker daemon程序公升級的問題,現有docker實現下,docker daemon一退出,所有容器都會停止,這會給大大限制docker本身的公升級。但最近社群已經在討論這個問題,希望這個問題在不久的將來得到解決。

infoq:使用過程中有哪些坑?你們有做哪些重點改進?daemon程序在退出時,會給所有的容器的init程序傳送sigterm訊號,但是如果容器的init程序忽略了sigterm訊號,就會導致

daemon程序一直等待,不會結束。我們修改了docker,傳送sigterm訊號後,等待一段時間,如果容器還是沒有退出,就繼續傳送

sigkill訊號,讓容器強制退出。我們將這個修改提交到了docker社群,因為一些原因並沒有被接受,不過已經有另外的pr 解決了。

infoq:這麼長時間的應用,有做過覆盤嗎?未來有什麼計畫?

尹燁:的確,相對於docker、kubernetes的發展速度,大半年的時間已經很長了。我們使用的

docker版本還是基於1.3.2的,kubernetes的版本是基本0.4的,已經很老了,但是基本上是滿足我們現在的要求,而且系統執行也很穩

定,所以,短時間內不會做大的調整。但是,我們也看到最近docker發布一些非常有意思的變化,比如network plugin、volume

plugin,還實現了預設的overlay

network。plugin機制會讓docker更加開放,生態圈也會發展得更快。但總體來說,這些新特性還處於experimental階段,等這些

特性成熟穩定之後,我們會考慮切換我們的docker版本。

但是,我們也不會坐著等待,也會嘗試一些我們需要的東西。比如,最近我們正在實現將docker與ceph結合,我們已經實現了ceph rbd

graph

driver,將docker的rootfs跑在了ceph儲存集群上面,結合ip漂移,可以實現更快的故障恢復。我們也將其實現提交給了docker社

區,因為一些技術原因,並沒有被社群接受。目前看來,以plugin graph

driver的方式提供會更好,但是現在docker還不支援plugin graph

driver,不過docker社群正在實現,相信不久就會支援。我們已經在github上建立乙個開源的plugin graph driver專案。

另外,對於kubernetes的應用,我們也還沒有完全發揮其優勢。kubernetes的負責人brendan burns曾說過,「make

writing bigtable a cs 101

exercise」,kubernetes有很多非常超前的設計思想,當然,也會改變業務原有的一些軟體架構,真正應用到實際業務中還需要一些時間。

另外,我們也會繼續探索與業務開發、運維的結合方式,進一步發揮docker的優勢,提高我們的運營效率,更好的支撐遊戲業務的發展。

【qcon上海2015】國內外專家雲集,解讀最新技術趨勢和最佳實踐。暢銷

書《番茄工作法**》作者staffan nöteberg、azul systems聯合創始人兼cto、著名jvm專家gil

《原神》如何從騰訊遊戲的口中搶到肉

2021年1月收入排行 原神教堂 原神 的跨平台真的很良心,玩家在pc端玩到乙個場景a,退出遊戲,開啟手機,可以接著玩場景a,唯一的區別是操作方式變了,客戶端支援windows,ios,安卓,ps4 官方沒有提供mac版,mac安裝windows虛擬機器可執行 pc版適配了鍵鼠操作和手柄操作,原神配...

企業如何實際使用 Docker

stephanie tayengco logicworks 高階副總裁,負責網路運營中心 network operations center 簡稱 noc 業務。在 2000 年加入 logicworks 之前,她參與了哥倫比亞大學 中心的創立。stephanie 畢業於賓夕法尼亞大學,並持有哥倫比...

如何使用docker部署前端專案

第一步先編寫dockerfile檔案,docker會根據這個檔案一步步自動的部署你的專案 在容器安裝nginxfrom nginx 移除nginx的default.conf run rm etc nginx conf.d default.conf 把配置好的nginx配置檔案新增到 etc ngin...