基于鏡像的日常發(fā)布
場景介紹
我們在使用ECS的時候要更時常地面臨更新軟件的問題,如運行的后端服務版本更新,安全打補丁等情況。我們可以使用ECS鏡像來維護需要更新的程序版本,更新好鏡像后對需要發(fā)布的機器更換下系統(tǒng)盤重新啟動就能完成對單臺機器的程序更新。對于在線上運行的機器我們需要分批的去更換系統(tǒng)盤。總結下來,我們需要做的操作如下:
更新鏡像后,可以啟動一臺新的機器,或者在一臺機器上執(zhí)行命令后打成一個鏡像。
用新鏡像分批更新系統(tǒng)盤。
對于以上操作,我們一步一步的操作實在是太繁瑣了,這種發(fā)布流程對運維人員是一種考驗,一個不留神可能就出錯了,那么我們有沒有自動化方案呢?有!使用系統(tǒng)運維管理。
解決方案
機器分組
首先建議對機器進行分組,可以給機器打上相應的tag,比如我們可以給我們的ECS按環(huán)境來分組env:test和env:product這樣比較方便管理,批量執(zhí)行時候只需要選好相應的標簽即可。
打鏡像
然后我們需要解決更新鏡像的問題,有了ECS云助手我們有了到機器上執(zhí)行命令的通道,而OOS可以編排云產(chǎn)品的API,我們可以將一系列命令編排起來執(zhí)行。更新鏡像的話我們可以按原有鏡像啟動一臺ECS,在ECS上執(zhí)行命令,執(zhí)行成功后關閉當前實例并給當前實例生成鏡像,然后再釋放臨時實例。如下圖所示。
以上步驟可以用OOS模板一步搞定,具體操作步驟如下。
請到OOS控制臺執(zhí)行更新鏡像。
并填寫相應的參數(shù)。
執(zhí)行后,需要運行一段時間,我們可以看到運行的步驟和運行結果。
最后生成了一個新的鏡像ID。
批量更新系統(tǒng)盤
這個步驟就相當于對每臺機器執(zhí)行,停止機器,等機器變成Stopped,更換系統(tǒng)盤,把機器啟動,等機器到Running,循環(huán)直到所有機器操作完畢,這個過程不建議手動完成。
通過OOS也可以比較簡單地解決這個問題,到OOS控制臺搜索系統(tǒng)盤,找到批量更換系統(tǒng)盤模板。
創(chuàng)建執(zhí)行,選擇實例,這里可以手動選擇實例也可以按tag來,我之前已經(jīng)給機器打好了標簽env:test這里就用tag來操作,批次控制支持并發(fā)執(zhí)行和分批執(zhí)行,這兩個的區(qū)別是并發(fā)執(zhí)行永遠保持n個運行中的,而分批執(zhí)行是執(zhí)行完第一批再執(zhí)行第二批,我這里就選并發(fā)執(zhí)行,每次1臺。
單擊執(zhí)行,我們可以看到已經(jīng)在運行中,并且符合預期地一臺一臺地執(zhí)行。等待執(zhí)行成功,整個分批更換系統(tǒng)盤的操作就完成了。
總結
我們通過以上步驟實現(xiàn)了一套ECS基于鏡像的發(fā)布流程。如果我使用了負載均衡ECS掛載到了SLB上,希望在替換系統(tǒng)盤前先從SLB移除,更換好再掛載上去實現(xiàn)無縫升級能做到嗎?這兩個步驟有辦法合并成一個模板嗎?有辦法在提交代碼后自動觸發(fā)整個過程嗎?
答案當然是肯定的,CI以后調用OOS aliyuncli或者SDK做集成觸發(fā)模板就可以了,對于全自動整個過程,可以自定義模板來做,我們也整打算把這個功能變成一個公共模板來使用。我們幫助一個客戶實現(xiàn)了整個流程大大的提升了客戶的運維效率,帶來自動化的同時為客戶也提供了白屏化的操作工具。將整個發(fā)布過程變得順暢透明安全。