在前面的實驗中,我們部署了多個副本的服務,本節将讨論如何滾動更新每一個副本。
滾動更新降低了應用更新的風險,如果某個副本更新失敗,整個更新将暫停,其他副本則可以繼續提供服務。同時,在更新的過程中,總是有副本在運作的,是以也保證了業務的連續性。
下面我們将部署三副本的服務,鏡像使用 httpd:2.2.31,然後将其更新到 httpd:2.2.32。
建立服務:
将 service 更新到 httpd:2.2.32:
<code>--image</code> 指定新的鏡像。
Swarm 将按照如下步驟執行滾動更新:
停止第一個副本。
排程任務,選擇 worker node。
在 worker 上用新的鏡像啟動副本。
如果副本(容器)運作成功,繼續更新下一個副本;如果失敗,暫停整個更新過程。
<code>docker service ps</code> 檢視更新結果。
三個副本都已經更新到 httpd:2.2.32。
預設配置下,Swarm 一次隻更新一個副本,并且兩個副本之間沒有等待時間。我們可以通過 <code>--update-parallelism</code> 設定并行更新的副本數目,通過 <code>--update-delay</code> 指定滾動更新的間隔時間。
比如執行如下指令:
service 增加到六個副本,每次更新兩個副本,間隔時間一分半鐘。
<code>docker service inspect</code> 檢視 service 的目前配置。
<code>docker service ps</code> 確定6個副本處于正常狀态。
執行如下指令,将鏡像更新到 httpd:2.4.16。
等待一會,檢視更新的狀态。
有4個副本已經更新到 httpd:2.4.16,從啟動時間看,确實是分了兩批進行,之間間隔90秒,每次更新兩個副本。
Swarm 還有個友善的功能是復原,如果更新後效果不理想,可以通過 <code>--rollback</code> 快速恢複到更新之前的狀态。
service 所有副本都已經恢複到 httpd:2.2.32。
請注意,<code>--rollback</code> 隻能復原到上一次執行 <code>docker service update</code> 之前的狀态,并不能無限制地復原。
滾動更新就讨論到這裡,下一節我們學習 Docker Swarm 如何管理資料。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>
2.《每天5分鐘玩轉OpenStack》
<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>