溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DevOps專題|基礎Agent部署系統(tǒng)

發(fā)布時間:2020-08-15 14:20:29 來源:ITPUB博客 閱讀:148 作者:京東云技術新知 欄目:開發(fā)技術
隨著京東云業(yè)務規(guī)模、管理機器規(guī)模的擴大,各類agent也在逐漸增多,如日志agent、監(jiān)控agent、控制系統(tǒng)agent等。這對agent的部署、升級、狀態(tài)維護提出了很高的要求,一旦某個全局agent進行了錯誤地部署、升級,可能會導致agent的資源使用率過高,進而會對全公司的業(yè)務產生影響。在此背景下需要有一個統(tǒng)一管理系統(tǒng)來對全網(wǎng)agent的部署、升級進行管控,可以靈活的指定不同的發(fā)布策略進行灰度更新,如按照pin層面升級、按照集群層面等等。 基于此,京東云自研了ifrit系統(tǒng)用于全網(wǎng)agent的部署、升級和狀態(tài)維護。

總體架構

ifrit是阿拉伯神話中一種遇火而生,浴火重生的精靈,只有英雄才有駕馭它的能力。這里的“火”可以指代全網(wǎng)每一個節(jié)點,“英雄”則可以指代管理員。此外,阿拉丁神話中的“燈神”就是一種ifrit,燈神可以幫阿拉丁實現(xiàn)愿望,京東云ifrit系統(tǒng)也可以幫助我們管理節(jié)點。
ifrit 架構自上而下分為 ifrit-manage ifrit-master 、 ifrit-agent三大模塊,如下圖所示:
ifrit-agent :負責本機所需業(yè)務agent以及ifrit-agent本身的部署、升級、狀態(tài)維護,定期從ifrit-master中拉取本機agent配置用以管理本機所有agent。配置完成后向ifrit-master匯報本機的agent狀態(tài)信息。
ifrit-master :每個集群內部署一套master,向上提供ifrit-manage發(fā)布部署、更新指令和agent狀態(tài)查詢接口;向下為本集群內所有ifrit-agent提供agent配置信息查詢和agent狀態(tài)回傳接口。
ifrit-manage :向用戶提供web界面,在該頁面可以對指定agent進行灰度更新和全量更新、查看操作記錄等。

ifrit-agent

ifrit-agent設計目標:
?    定期獲取agent配置信息并向master匯報agent狀態(tài)信息
?    程序包下載、校驗
?    安裝
?    卸載
?    升級
?    安裝包完整性檢測
?    實例存活檢測
?    自升級
?    自守護
由于幾乎所有部署、監(jiān)控等相關功能都依賴于agent,ifrit-agent在機器中以服務形式存在并且開機自啟動。若ifrit-agent啟動時網(wǎng)絡服務未啟動。則會導致機器在數(shù)分鐘內無法使用部署、監(jiān)控、日志服務等功能,同時也無法采集到docker容器類應用的初始化日志,因此ifrit-agent啟動時配備重試機制,以確保網(wǎng)絡服務已經啟動。
ifrit-agent在訪問master接口獲取期望agent狀態(tài)信息時,需要帶上機器類型和機器uuid(例如內網(wǎng)中的ip、云主機上的instance-id等)。其中機器類型(主要是操作系統(tǒng)、cpu架構)可通過初始化時執(zhí)行命令獲取,或使用golang中的條件編譯將機器類型直接寫在程序中。

iFrit-master

ifrit-master負責agent管理工作,全網(wǎng)部署agent的增刪查改都是通過ifirt-manage調用ifrit-master接口完成的。當集群規(guī)模增大時,直接讀取mysql獲取agent版本信息會對數(shù)據(jù)庫造成很大壓力,為了避免這類問題,ifrit-master中采用redis緩存,以固定時間間隔讀取mysql中agent版本信息,并合成為ifrit-agent可直接讀取的數(shù)據(jù)緩存到redis,如下圖所示:
為了減少因agent升級導致的全網(wǎng)業(yè)務故障,ifrit-master提供了灰度發(fā)布機制,即指定一批機器更新agent到指定版本灰度運行。待灰度驗證通過后,在集群內全量部署該agent。同時,ifrit系統(tǒng)可以根據(jù)不同機器類型部署不同的業(yè)務agent,目前京東云內支持了容器、linux物理機、arm64架構機器和windows系統(tǒng)機器。

iFrit-manage

ifrit-manage統(tǒng)一管理多個集群的master,主要功能如下:
? 用戶權限管理
? 分級發(fā)布(集群粒度)
? agent狀態(tài)查詢
? 操作審計
ifrit-manage本身作為運營后臺的一部分,可讀權限由運營后臺統(tǒng)一管理。ifrit寫操作是高危操作,默認只有超級管理員(一般為公司運維人員)有寫權限,其他人員可以通過在配置文件中添加寫權限。
根據(jù)業(yè)務需要,可以將機器劃分到不同集群中,當有agent需要變更時,運維人員在灰度驗證通過后,按照給定的集群順序分集群進行部署。運維完成一個集群的agent部署后,15分鐘內(ifrit-agent主循環(huán)周期+ifrit-master redis緩存周期)該集群內所有指定類型機器應當變更生效,運維驗證部署生效后方可對下一個集群進行部署。

單集群分級發(fā)布

以上的ifrit系統(tǒng)已經具備了集群粒度的分級發(fā)布功能,但是隨著集群規(guī)模越來越大,集群粒度的agent上線仍然有很大風險,因此需要一套更細粒度的分級發(fā)布機制,以便于降低agent上線事故帶來的影響。
ifrit中根據(jù)集群規(guī)模大小,使用一致性hash算法將集群中的機器均勻分成若干批,并分批上線。一致性hash算法是hash算法的改進,和普通hash算法的關鍵區(qū)別是,對于節(jié)點和數(shù)據(jù)(ifrit中使用機器uuid)都做一次hash運算,并比較節(jié)點和數(shù)據(jù)的hash值,順時針方向取距離數(shù)據(jù)點的節(jié)點。若hash后的節(jié)點分布不均勻,可通過引入虛擬節(jié)點增大節(jié)點數(shù)目,從而使得散落在hash環(huán)上的節(jié)點更加均勻,如下圖。
集群分批完成后,集群內進行agent全量上線時首先進行小流量驗證,驗證通過后按照一定時間間隔更新redis緩存信息, 新增鍵值expect_default_hash2_CONTAINER等。此時ifrit-agent獲取agent版本信息的優(yōu)先級為:灰度數(shù)據(jù)>hash數(shù)據(jù)>全量數(shù)據(jù)(時間戳相同的情況)。還可以通過暫停更新/刪除redis中hash類型的數(shù)據(jù),實現(xiàn)agent上線的暫停與回滾(操作mysql數(shù)據(jù)間接實現(xiàn))。
自此,ifrit實現(xiàn)了單集群內的agent上線分級發(fā)布。
看完本文后,您是否有所收獲呢,如果您想了解更多關于京東云翼的訊息,歡迎點擊 閱讀 了解更多~
也歡迎點擊“ 京東云 ”了解更多精彩內容
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI