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

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

那麼如何解決這個讓人困擾的問題呢?
p2p看起來是一個好辦法,去中心化的做法,不但可以降低對倉庫節點的依賴,同時也可以爲用戶節省寶貴的外網流量。但是在k8s集羣中拉取鏡像的場景內使用p2p技術要面對一系列困難,包括節點間數據安全性的問題、無預熱前提下的大規模併發拉取、非侵入式將集羣改造成p2p網絡等。經過不斷的探索與實驗,我們--華爲雲容器鏡像服務,終於摸索出了一套在k8s集羣中完美整合p2p下載的方案。該方案的提出有效的解決了我們遇到的實際問題,提高了鏡像下載速度,併爲客戶節省了大量帶寬資源。

p2p改造後的集羣下載測試結果
p2p-如何拯救k8s鏡像分發的阿喀琉斯之踵

如上圖所示,我們限制了鏡像倉庫的下載帶寬,並測試了200節點與500節點情況下,不同下載方式的狀況。隨着節點數量的增大,併發量觸及到鏡像倉庫下載瓶頸的可能性也隨之增大,然而使用了p2p下載方式改造的k8s集羣並沒有受到該瓶頸的制約,表現遠強於傳統下載方式。尤其是對於較大的鏡像,差距更爲明顯。
我們是如何把p2p下載整合到k8s集羣內的呢?
在華爲雲容器鏡像服務中我們是這樣做的,我們改變了所有集羣節點去鏡像倉庫拉取鏡像的傳統做法。在用戶節點中注入peer客戶端,使用peer客戶端截取docker client的拉取鏡像請求,並將請求重定向。經過修改後只有部分節點(約10%)真正到達鏡像倉庫去獲取鏡像數據,剩餘節點轉爲自集羣內的其它節點獲取鏡像。要實現這個方案,主要的開發點有三處:需要對鏡像倉庫進行改造,部署並改造新的tracker服務器,以及在用戶節點注入peer客戶端。
p2p-如何拯救k8s鏡像分發的阿喀琉斯之踵

對鏡像倉庫的改造
要想實現集羣的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功能使用指導: https://support.huaweicloud.com/usermanual-swr/swr_01_0029.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章