小數表示最近霧鎖京城真是有些可怕,迷迷濛濛讓人看不清遠處,你們外出也要注意防霾哦!git
容器管理面板Crane,是 數人云的第一個開源項目,那麼它是如何誕生的,從設計理念到技術實現,你們是否也是一頭霧水呢?數人云CTO肖德時在2016中國開源年會上的演講將給你答案——github
數人云從2014年開始創業,是一家技術爲驅動的輕量級PaaS平臺公司。今天爲你們介紹的容器管理工具Crane是數人云基於最新Docker SwarmKit技術的一個開源項目。今天從技術角度分享一下數人云Crane從設計到開發的實踐之路。web
數人云是一家開源技術的公司,最初但願作一個開源項目,至關於作了一次內部創新。數人云的技術棧是Golang,正好與Docker十分密切。始於開源技術,成長於開源技術,是數人云的最初開始。shell
縱觀Docker相關的product,關於控制面板的部分是最主要的,同時也是最容易介入的。咱們想經過這個開源項目探索Docker全部的構件,可以更快熟悉Docker的技術。由於理解Docker有兩種方法,一種是看文檔,另外一種是寫代碼。做爲一家創業公司,寫代碼必然是最方便最快速的方式。咱們想作一個與Docker UCP界面如出一轍的工具,因而就有了Crane的誕生。數據庫
目前容器還未達到企業集羣的程度,雖然咱們提供的是企業的服務,可是這個核心技術Docker自己沒有達到企業集羣,這是其一。第二,容器技術內在的需求是由於DevOps的需求很是迫切,你們但願可以變革IT的infrastructure方法。什麼是DevOps?簡單來講,就是開發變成運維、運維變成開發,但實際上它們須要一個媒介,而Docker的出現正好切入這個點。你們都覺得找到了一個救星,但其實它只是一個工具,一個引爆點,並不能解決全部的問題,因此我認爲現階段還是雲計算浪潮的初始階段。後端
第三,對於原來VM的管理,你們都知道有很是成熟的Openstack,有AWS 的IaaS 實現做爲模板,你們也都瞭解企業級的集羣如何管理,可是一旦把顆粒度變得更細,一臺機器能夠跑幾百個容器,把它們當成VM,這樣一個超大規模的集羣如何管理?它的安全指標不像之前那麼可用,企業級的集羣管理在容器方面是沒有標準的,這就是咱們面臨的現狀。安全
Crane是一個新的項目,在開發Crane的時候須要本身定義功能,提早設定好目標才能成功,這也是項目剛啓動時的一個技巧。從給它定義來看,咱們的想法不少,除了應用編排、日誌監控、網絡管理這三大塊,還有插件的管理,一些輔助信息、Docker自己對主機的管理也加進去了。可是咱們重點關注了其中最核心的功能,就是應用編排、日誌監控、網絡管理,這是DevOps最關心的三個點,也是該項目的亮點。網絡
具體到應用編排如何設置,它必定是rolling update,好比資源分配, 是能夠在配置裏面配置的;它能作ACL的隔離,更酷的是它能擴縮,而且是無痛的,這些都是很是智能的功能,也是在容器編排裏面很是容易作到的事情。再加上SSH,由於它並非一臺主機,因此如今利用的技術叫web shell,即在web界面讓你可以打開一個shell,能模擬的SSH的登陸界面。運維
除了跑的任務以外,還有一些批處理的任務,能夠把它想象成就是一個VM,機器裏面不會想着要跑一些Cron Job之類。把這些功能實現之後,利用Docker的API把它的統計信息還有日誌導出來。最後,把tasks的歷史信息存在DB裏面並顯示出來。這就是Crane的所有設計。分佈式
那接下來如何實現?一般開源分爲兩個級別:若是時間比較充足,就能夠從第一行代碼開始作起;另外一種方法是基於成熟的開源項目,學習它的代碼,開源項目鼓勵你們這麼作,它的license free&open,幫助你們互相創新。數人云也是基於開源技術,Docker功能裏面有一個DAB,它發佈了一個叫分佈式的Distributed Application Bundle,把一個應用拆成不少小模塊,簡單來講就是一個web一個DB。複雜來講,還要加一個Reddis 做爲Cache 層。通常發佈的時候都是一步一步發,它用一個DSL的文件,是一個Jason,就能夠直接用一個API發下去,並保證它的編排,剛纔說的功能均可以實現。
它把 DAB 的實現放在了Docker Client端邏輯裏面,Crane是開源項目,它的媒介、它的界面是web界面,是咱們寫的一個後端,因此我把它命令行端的實現代碼直接merge到Crane的界面裏面,這樣就有了一部分創新,即能讓用戶可以經過界面發這個代碼,可以發佈應用。
第二件事是命令行,寫完API工具之後,須要一個命令行工具來管理界面,用Python寫一個腳本,而後調用API。它能夠幫助開發者很快地經過界面就可以去操縱Crane,而後再操做集羣。
開發一個project的時候,它的功能會愈來愈多,最理想的辦法是插件化,你編寫的代碼應該是一個目錄或者module,裏面有本身的interface,把它注入進去之後,就能夠與你的主線代碼交互。更直白一點,咱們原來寫的一批API代碼,API的RestfulAPI,想擴展這個API,能夠在原來代碼基礎上繼續寫,可是這個方式與原來是緊密的耦合。因此咱們用Golang interface的方式注入,注入完之後,就能夠實現想要的認證,想要的registry,咱們想要的各類其它的功能也均可以注入,這種方法在Golang裏面很是方便,經過plugin tag的方式在Golang ini的時候就能夠load,保證想要什麼功能均可以加上。後臺其實只實現了少有的功能,即集羣管理、日誌、監控、編排,其它好比數據庫、Docker的應用目錄、帳號、信息這些都是經過擴展的方式實現的。
Crane仍是一個很小的project,因此咱們也很是謹慎地引入第三方的組件。迴歸本質,咱們寫這個project不是爲了去作一件change the world的事情,而是聽從本心,想利用這個項目來學習Docker,學習Docker的東西是如何實現的,它的API是如何調用的,這是數人云Crane項目的本質。這個項目的目的是爲了推廣或者讓更多的開發者可以學習到Docker的特性,而後直接參與到這個項目中來。
任何一個開源項目都有本身的roadmap,若是不作roadmap,那就是一個我的項目,而數人云要作一個至少是標準的開源項目。通過一個月的時間,Crane目前是四百個星,也在持續地增長。雖然這個項目自己的核心技術並非特別高,可是這個項目的標準化程度以及它的代碼質量都是有保證的,咱們爲此也寫了不少unit test。
對於Crane的將來,咱們會對事件流作一個補充,日誌、存儲方面也會實現。由於Docker自己是是無狀態的應用,因此存儲這一塊很是方便。Docker自己是plugin機制,它能夠裝一些存儲的插件,好比Flocker。
長遠來講,Crane由於是一個開源項目,因此咱們也避免跟其它項目同質化。雖然你們都認爲控制面板很好作,但每一個人的方向不同,Crane這個開源的項目沒有商業利益,它主要的目的是爲了推廣Docker的技術,讓開發者在學習中成長。
總結一下,再小的一個開源項目也是要投入的,在兩個月週期內,咱們投入了開發至關多的時間。也但願你們關注這個開源項目,上圖是Crane的界面,你們能夠去看看,很是簡單在本地就能夠搭建。今天分享就到這兒,謝謝你們。