Application 部署
在Marathon中,對應用程序或組定義的每一個修改都會作爲部署操作進行。部署是一組操作,會做以下操作:
- 開始/停止一個或多個應用
- 升級的一個或多個應用
- 縮放一個或多個應用
部署不馬上生效 - 需要一定時間。直到部署成功完成,這個部署纔會在Marathon中激活。
多個部署可以在同一時間進行,只要一個應用程序僅通過一個部署更改。如果一個部署被請求,它會嘗試修改由之前已經通過部署激活並已經完成的修改,新的部署請求將被拒絕。
依賴
沒有依賴的應用程序可以沒有任何限制的,以任何順序進行部署。如果應用程序之間有依賴關係,那麼部署操作將按照一個特定的順序執行。
在應用上面的例子中,app依賴於應用db。
- Starting:如果db和app被添加到系統中,db先啓動,然後再啓動app
- Stoping:如果db和app從系統中刪除,app先被刪除,然後再刪除db
- Upgrade:請參見滾動重啓章節。
- Scaling:如果db和app得到規模,db縮放,然後再應用
滾動重啓
開發人員和運維人員面對的最常見的問題是如何推出的應用程序的新版本。這個過程包括兩個階段:啓動新版本的一組進程和停止舊版本的一組進程。有很多種模式進行這一過程。
在Marathon中,有一個在應用級別中定義的升級策略屬性minimumHealthCapacity。minimumHealthCapacity的值是一個百分比,當應用到實例計數的時候,用來定義某一個應用程序的特定版本在更新期間任何時候都必須保有的健康實例數量。
- minimumHealthCapacity == 0:在新版本部署之前,所有舊的實例可以被停掉。
- minimumHealthCapacity == 1:在舊版本被停止前,新版本的所有實例都被並行部署
- 0和1之間minimumHealthCapacity:根據minimumHealthCapacity的值scale舊版本,同事啓動與minimumHealthCapacity的值相同數量的新版本。如果這成功完成,則新版本被調整爲100%,舊版本被停止。
如果有依賴關係這種操作就變得有點複雜。當上面依賴例子中的應用程序被更新時,以下操作將被執行:
- 升級應用程序的db,直到所有實例都替換,準備和健康(考慮設置upgradeStartegy)
- 升級應用程序的app,直到所有實例都替換,準備和健康(考慮設置upgradeStrategy)
如果你選擇一個大於0.5的minimumHealthCapacity 的值,在更新過程中,集羣環境需要預留更多的可用容量。在這種情況下,一半以上的相同的應用程序的實例是並行的。如果應用有依賴性,就要總結這些容量限制在我們的例子中,我們定義了db爲0.6,app爲0.8。這意味着,在更新的情況下,我們有12個db實例(6個老版本和6個新版本),32個應用實例(16個老版本和16新新版本)並行運行。
注:這裏的數量,咋一看有點不知所以,要對照上圖上的數字看。
強制部署
一個應用程序在同一時間只能被一個部署修改。其他對應用程序的修改必須等待上一個部署完成。運行帶有強制標誌部署可以打破了這一規則。REST接口允許爲所有的更改狀態操作添加強制標誌。
注意:強制標誌;只應在部署失敗的情況下使用!
如果強制標誌被設置,則受此影響的所有部署都被取消。這可能會使系統處於不一致的狀態。具體而言,當一個應用程序在滾動升級過程中時部署被取消,它可能會處在一些應用是老的版本,一些應用是新版本的情況。如果新的部署不更新應用程序,它會留在狀態,直到未來的部署應用在程序。
相反,唯一的安全強制更新的一種部署方式就是隻影響單一的應用程序。
因此,使用強制更新的情況,就是用於修復之前失敗的部署。
一個失敗的部署
一個部署有幾個步驟。部署步驟被一步一步執行。如果先前步驟已成功完成,下一個步驟纔會執行,。
有些情況下,某一步永遠不會成功完成。例如:
- 新的應用程序不能正常啓動
- 新的應用程序出在不健康狀態
- 新應用程序的依賴沒有聲明同時不可用
- 羣集的容量耗盡
- 應用程序使用Docker容器,修改被列在[Running Docker Containers on Marathon]沒有執行。(https://mesosphere.github.io/marathon/docs/native-docker.html)
- …
在這種情況下,將會一直執行部署。爲了修復系統,一個新的部署必須應用被應用到當前出問題的部署上以解決問題。
在/V2/deployments端點
可被訪問運行部署的列表經由在/V2/deployments端點。幾個項目適用於所有部署的建議:
- affectedApps:哪些應用程序受此部署
- step:此部署執行的步驟
- currentStep:這實際上執行的步驟
每一步都可以有幾個動作。一個步驟內的操作是同時進行的。可能的操作是:
- ResolveArtifacts解決應用程序的所有構建和將其保存在構建倉庫中
- StartApplication啓動指定的應用程序
- StopApplication停止指定的應用程序
- ScaleApplication縮放指定的應用程序
- RestartApplication重新啓動指定的應用程序的minimumHealthStrategy
- KillAllOldTasksOf停止指定應用程序任務的其餘部分
參考資料:
[1]: http://mesosphere.github.io/marathon/docs/deployments.html