p2p-如何拯救k8s映象分發的阿喀琉斯之踵

devopscsdn發表於2018-07-24

K8s的出現為PaaS行業的發展打了一針興奮劑,Docker+k8s的技術路線已經成為了容器雲的主流。尤其針對大流量,大彈性的應用場景來說,k8s將其從繁雜的運維、部署工作中徹底拯救出來。然而事情往往沒有那麼簡單而美好,當我們使用k8s去管理一些大規模叢集的時候,我們會發現有很多問題等待我們解決。比如,當叢集中的所有節點同時去映象倉庫拉取映象的時候,這種大規模併發很有可能阻塞倉庫的出口,導致大家的下載速度都慢得難以忍受,這就是k8s映象分發的阿喀琉斯之踵。雖然可以採取映象倉庫叢集化的方法來緩解這個瓶頸,然而這種做法始終是治標不治本,此外還會造成維護成本升高,以及映象同步時效性差等問題。

那麼如何解決這個讓人困擾的問題呢?

p2p看起來是一個好辦法,去中心化的做法,不但可以降低對倉庫節點的依賴,同時也可以為使用者節省寶貴的外網流量。但是在k8s叢集中拉取映象的場景內使用p2p技術要面對一系列困難,包括節點間資料安全性的問題、無預熱前提下的大規模併發拉取、非侵入式將叢集改造成p2p網路等。

最近發現華為雲容器映象服務,可以提供一套在k8s叢集中完美整合p2p下載的方案。該方案可以有效的解決了上述問題,提高映象下載速度,併為使用者節省大量頻寬資源。

p2p改造後的叢集下載測試結果

如上圖所示,在限制了映象倉庫的下載頻寬,並測試了200節點與500節點情況下,不同下載方式的狀況。隨著節點數量的增大,併發量觸及到映象倉庫下載瓶頸的可能性也隨之增大,然而使用了p2p下載方式改造的k8s叢集並沒有受到該瓶頸的制約,表現遠強於傳統下載方式。尤其是對於較大的映象,差距更為明顯。

如何把p2p下載整合到k8s叢集內呢?

在華為雲容器映象服務中,改變了所有叢集節點去映象倉庫拉取映象的傳統做法。在使用者節點中注入peer客戶端,使用peer客戶端擷取docker

client的拉取映象請求,並將請求重定向。經過修改後只有部分節點(約10%)真正到達映象倉庫去獲取映象資料,剩餘節點轉為自叢集內的其它節點獲取映象。要實現這個方案,主要的開發點有三處:對映象倉庫進行改造,部署並改造新的tracker伺服器,以及在使用者節點注入peer客戶端。

對映象倉庫的改造

要想實現叢集的p2p下載功能,所下載的檔案必須包含有種子,因此要對已有的映象倉庫進行改造。當使用者push映象到映象倉庫時,倉庫自動計算映象所有layer的SHA值,併為每一個layer生成一個種子檔案。

為了保證叢集的安全性驗證,倉庫為每個接入的peer下發由倉庫私鑰簽名的jwt token,這個token將會進入叢集網路,並保證叢集節點的認證安全。

部署改良後的tracker伺服器

傳統的Tracker伺服器的主要功能是為所有peer客戶端提供peer列表。針對k8s叢集場景搭建的Tracker伺服器除了負責分發peer列表外,還增加了許多其它特性。

1. 判斷peer節點的叢集歸屬,因為tracker伺服器可能對多個叢集進行服務,而每個叢集中的節點網路相對獨立,因此tracker負責記錄peer節點的叢集歸屬資訊很有必要,這樣可以避免分發出網路不互通的peer列表。

2.

Tracker伺服器負責監控每個peer的狀態,自動將部分下載完成的peer節點資源釋放,因為叢集節點屬於客戶資源,一旦完成任務應該儘快將資源釋放出去。當Tracker判斷當前叢集中完成節點比例已足夠支撐下載時,會指示部分已完結節點終結任務釋放資源,並將其移除出任務列表。當所有peer節點均已完成下載,而且一段時間內沒有新的下載請求進入,那麼Tracker會指示將全部叢集節點資源釋放。

3. Tracker按比例(約10%)指定部分peer節點到映象倉庫下載,以此將資料帶入整個叢集網路。

4. Tracker提供peer節點的安全性驗證,保證同屬於一個叢集並下載同一個資源的peer節點有獲取peer列表的許可權。

容器化的peer客戶端

這個解決方案,創造性的將peer客戶端容器化,並通過華為雲容器引擎(CCE)的外掛功能,將peer容器分發給整個叢集。peer容器可以通過修改docker客戶端代理的方式,攔截下載映象請求的相關介面,將從映象倉庫下載操作轉化為p2p網路下載操作,並把獲取到的映象資料歸還給docker客戶端,以此快速的把映象資料分發到整個叢集網路。該peer客戶端還具有以下特性:

· 根據tracker的分配,修改下載地址,小部分從映象倉庫下載,大部分從叢集網路中下載。

· 在peer客戶端的tcp握手協議中注入jwt token安全校驗,保證節點資料安全,防止假冒節點盜取資料。

· Peer客戶端採用優先順序下載方式,能夠保證在下載過程中就可以將資料傳輸給docker客戶端,而不是當資料全部下載完全後再傳輸給docker,以此最大限度的節省下載實際。

經過p2p方案改造後的k8s叢集,下載速度得到了提升的同時,也為客戶節約了大量頻寬。當前這個特性已經在華為雲上開放給使用者使用,感興趣的同學們快來體驗吧。

《華為雲容器映象服務p2p功能使用指導》

相關文章