Kubernetes Deployment滾動更新場景分析
基於Kubernetes v1.7.4
關於Kubernetes Deployment滾動更新
場景1:正常滾動更新流程
- 新建deployment:webserver,replicas=10,image=tomcat。
- 滾動更新應用映象為:nginx
- 觀察Replicasets的變化,可發現升級後會建立新的Replicasets,刪除老的Replicasets例項,滾動建立新例項。
- 觀察deployment的變化
- DESIRED: 10(一直為10)
- CURRENT: 在[replicas-maxUnavailable, replicas+maxSurge]:[8,13]之間變動,最終等於DESIRED值
- UP-TO-DATE: 已更新為nginx映象的例項,最終等於DESIRED值。
- AVALIABLE: 新老replicaset總的例項數,最終等於DESIRED值。
場景2:應用滾動更新時,使用者刪除應用
- 新建deployment:webserver,replicas=10,image=tomcat。
- 更改容器映象,觸發deployment的滾動更新。
- 新老Replicaset開始進行滾動更新。
- 使用kubectl刪除正在滾動更新的deployment。
- 新老replicaset的例項數被縮減為0,例項開始被刪除。
- 觀察deployment例項變化如下
從紅框處,DESIRED=0,例項逐漸被刪除。
場景3:應用滾動更新時,使用者對該應用進行擴容
- 新建deployment:webserver,replicas=15,image=tomcat。
- 更改容器映象,觸發deployment的滾動更新。
開始進行滾動更新:
- 更改deployment的例項數到20
新老RS根據比例進行例項數擴容
- RS例項數根據比例進行相應的增加:
RS擴容後的例項數=擴容前例項數佔比*擴容後最大例項數
在此次升級中,在擴容前
NAME DESIRED CURRENT READY Webserver-1078791221 10 10 12 Webserver-3236788441 7 7 3 升級前的總例項數:10+7=17
升級前最多例項數:15+MaxSurge(25%)=19
升級後最多例項數:20+ MaxSurge(25%)=25
當前需擴容的總數:25-17=8
所以:
webserver-1078791221擴容後例項數=(10/19)*25=13.15(+0.5取整)=13
webserver-3236788441擴容後例項數=(7/19)*25=9.21(+0.5取整)=9剩餘的例項分配給例項數最多的rs
webserver-1078791221 較擴容前增加:13-10=3
webserver-3236788441較擴容前增加:9-7=2
仍剩餘的例項(8-3-2=3個)分配給webserver-1078791221
所以webserver-1078791221總例項數=10+3+3=16如下所示:
- RS例項數根據比例進行相應的增加:
5)例項數更新以後,滾動升級繼續進行,最終老的replicaset例項被刪,替換為新的
場景4:應用滾動更新時,使用者對該應用進行縮容
- 新建deployment:webserver,replicas=15,image=tomcat。
- 更改容器映象,觸發deployment的滾動更新。
開始進行滾動更新:
- 更改deployment的例項數到4
- 新老RS根據比例進行例項數縮容
RS例項數根據比例進行相應的縮減(計算方法如擴容): RS縮容後的例項數=縮容前例項數佔比*縮容後最大例項數
NAME | DESIRED | CURRENT | READY |
---|---|---|---|
Webserver-1078791221 | 9 | 10 | 10 |
Webserver-3236788441 | 9 | 8 | 4 |
升級前的總例項數:9+9=18
升級前最多例項數:15+MaxSurge(25%)=19
升級後最多例項數:4+ MaxSurge(25%)=5
當前需縮容的總數:18-5=13
所以
webserver-1078791221縮容後例項數=-(9/19)*5=-2.36(-0.5取整)=2
webserver-3236788441縮容後例項數=-(9/19)*5=-2.36(-0.5取整)=2
多縮容的例項分配給例項數最多的rs
webserver-1078791221 較縮容前減少:9-2=7
webserver-3236788441較縮容前減少:9-2=7
多縮容的例項(7+7-13=1個)分配給例項數最多的rs(由於新老RS例項數都為9,則按照建立時間進行排序,分給最新的例項webserver-3236788441)
所以webserver-3236788441總例項數=9-7+1=3如下所示:
- 最終老的replicaset例項被刪,替換為新的,且縮容到指定個數。
從deployment角度觀察結果如下:
場景5:應用擴容時,進行滾動更新
- 新建deployment:webserver,replicas=10,image=tomcat。
- 更改deployment的例項數到20
RS的例項數變為20,開始擴容
- 更改容器映象,觸發deployment的滾動更新。
- 新老的replicaset的例項變化。
建立新的RS,按照滾動升級策略開始更新,如下:
- 最終老的replicaset例項被刪,替換為新的
- 觀察deployment的例項變化如下:
場景6:應用縮容時,進行滾動更新
- 新建deployment:webserver,replicas=25,image=tomcat。
- 更改deployment的例項數到4
RS的例項數變為4,開始縮容
- 更改容器映象,觸發deployment的滾動更新。
- 新老的replicaset的例項變化
老的RS的例項會被逐漸刪除,同時新的RS開始滾動更新,符合滾動升級策略。
- 最終老的replicaset例項被刪,替換為新的
- 觀察deployment的例項變化如下:
deployment的例項數先被縮容到4;
UP-TO-DATE從25-0-4,表明例項被滾動到最新版本。
CURRENT 例項數在開始滾動更新後,最大數不超過5,符合滾動更新的例項數區間。
場景7:應用回滾
- 新建deployment:webserver,replicas=10,image=tomcat。
- 更改容器映象為nginx,觸發deployment的滾動更新。
等待滾動更新完成:
3)更改容器映象為httpd,觸發deployment的滾動更新。
等待滾動更新完成:
4)回滾到nginx版本。
等待滾動更新完成:
回滾到 –to-revision=2 nginx版本後,nginx版本又成為了最新的版本vision:4。
場景8:滾動更新未完成時,又開始新的滾動更新
- 新建deployment:webserver,replicas=15,image=tomcat。
- 更改容器映象為nginx,觸發deployment的滾動更新。
更新後,觸發滾動升級:
- 在上個滾動更新未完成的情況下,接著更改容器映象為httpd,再次觸發deployment的滾動更新。
更新後,再次觸發滾動升級:
- 第二次滾動升級webserver-2480438009初始DESIRED=0,因為兩個老的RS當前例項總數為12+7=19,已經達到最大值,所以初始為0。
- 縮減老的RS時,遵循兩個原則
- 遍歷所有老的RS,優先縮減那些unavailable的例項。
webserver-3236788441縮減前7/7/ 3(還有4個unacailable),所以先被縮減到3/7/3。 - 在保證最小available個例項的前提下,縮減老的RS。
計算方法如下:
最小可用數minAvailable = deployment.Replicas – maxUnavailable;
當前總可用數:availablePodCount = 所有RS的AvailableReplicas總和;
可縮減的總數:totalScaleDownCount = availablePodCount - minAvailable;
將老的RS按建立時間從新到老排序,逐個進行縮減。
例如,在第一次縮減webserver-1078791221時:
webserver-2480438009 7/7/1
webserver-1078791221 9/9/9
webserver-3236788441 3/3/3
minAvailable=15-15*25%=12
availablePodCount=1+9+3=13
totalScaleDownCount=13-12=1
- 遍歷所有老的RS,優先縮減那些unavailable的例項。
所以將webserver-1078791221縮減1個例項到 8/9/9(如上圖最下面的紅框)
再次縮減時:
webserver-2480438009 8/8/2
webserver-1078791221 8/8/8
webserver-3236788441 3/3/3
minAvailable=15-15*25%=12
availablePodCount=2+8+3=13
totalScaleDownCount=13-12=1
webserver-1078791221縮減為0/0/0,開始用同樣的方法縮減
webserver-3236788441,這裡不再敖述。
相關處理Replicasets程式碼在:
pkg/controller/deployment/rolling.go:reconcileOldReplicaSets
- 從deployment角度觀察滾動過程如下:
附錄:
感謝同事陳俊超辛苦的測試分析。
相關推薦
Kubernetes Deployment滾動更新場景分析
基於Kubernetes v1.7.4 關於Kubernetes Deployment滾動更新 場景1:正常滾動更新流程 新建deployment:webserver,replicas=10,image=tomcat。 滾動更新
聊聊你可能誤解的Kubernetes Deployment滾動更新機制
Author: [email protected] 摘要: Kubernetes Deployment滾動更新機制不同於ReplicationController rolling update,Deployment rollout還提供了滾
Kubernetes Service滾動更新
cond 發出 point rpo use 應用 一次 歷史 針對 [toc] 簡介 滾動更新 當kubernetes集群中的某個服務需要升級時,傳統的做法是,先將要更新的服務下線,業務停止後再更新版本和配置,然後重新啟動並提供服務。如果業務集群規模較大時,這個工作就變成了
kubernetes 滾動更新發布及回滾
bsp uber record kubectl 滾動 app 記錄 post 回滾 基本命令 記錄歷史 --record kubectl apply -f **** --record 查看當前狀態 kubectl rollout status deployment/dem
Kubernetes集群中Service的滾動更新
k8s config level apiserver div restfu ceph 成功 lac Kubernetes集群中Service的滾動更新 二月 9, 2017 0 條評論 在移動互聯網時代,消費者的消費行為已經“全天候化”,為此,商家的業務系統也要保持7
kubernetes 滾動更新
set grace ini 版本 mina desc mman exp pau 示例: 創建一個app:kubectl create deployment nginx --image=nginx:1.11 創建service kubectl expose deploy
Kubernetes Pod應用的滾動更新(八)
一、環境準備 我們緊接上一節的環境,進行下面的操作,如果不清楚的,可以先檢視上一篇博文。 滾動更新是一次只更新一小部分副本,成功後,再更新更多的副本,最終完成所有副本的更新。滾動更新的最大的好處是零停機,整個更新過程始終有副本在執行,從而保證了業務的連續性。 二、更新 我們檢視一下上一節的配置檔案my
Kubernetes滾動更新介紹及使用
我們 k8s叢集使用的是1.7.7版本的,該版本中官方已經推薦使用 Deployment代替 ReplicationController(rc)了, Deployment繼承了rc的全部功能外,還可以檢視升級詳細進度和狀態,當升級出現問題的時候,可以使用回滾操作回滾到指
kubernetes學習(一) Scale應用 & 滾動更新
一、Scale應用 預設請款下應用只會執行一個副本,可通過kubectl get deployments 檢視副本數。 ~$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILA
kubernetes DaemonSet的滾動更新
DaemonSet的滾動更新 DaemonSet 更新策略 DaemonSet 有兩種更新策略 : OnDelete: 預設的向後相容更新策略. 只有當你手動刪除老的DaemonSet pods
詳細聊聊k8s deployment的滾動更新(二)
roo 10.10 metadata 系統 lifecycle aliyun container head 能夠 原文:詳細聊聊k8s deployment的滾動更新(二) 一、知識準備 ● 本文詳細探索deployment在滾動更新時候的行為 ● 相關的參數介紹
典型用戶和場景分析
水平 用途 環境 大學生 空間 黑板 層次 重要性 可能 1. 名字:韓梅梅 年齡:39 職業:食堂阿姨 代表的用戶在市場上的比例和重要性:5% 較重要 知識層次和能力:可能不太會熟練使用手機APP 使用本軟件的環境:食堂或其他地方 典型場景:食堂阿姨撿到一張飯卡,將此信
用戶場景分析i
ble lpad tab 環境 知識 span 場景 其他人 解決 名字 學生(註重飲食選擇,挑剔) 年齡 20 收入 無 知
用戶場景分析
接受 alt 快遞 png 技術分享 信用 發布任務 背景 .cn 用戶場景分析: 典型用戶: 張三:有諸多事務等抽不開身;李四:比較懶 1、背景 (1)典型用戶:張三李四 (2)用戶需求/迫切需要解決的問題:有事不能抽開身,誰能幫我個忙啊;一些小事不想自己幹,誰可
sodu 命令場景分析
and 還要 無需 空格 這樣的 .cn member 資料 commands 摘自:http://www.cnblogs.com/hazir/p/sudo_command.html sudo 命令情景分析 Linux 下使用 sudo 命令,可以讓普通
第三組 典型場景分析 一個追求滿星通關的用戶
嘗試 獲得 想要 分析 了無 原因 功能 障礙 沒有 場景:用戶進行遊戲1.背景1)典型用戶:張某2)用戶的需求/迫切需要解決的問題;a.自身水平有限,無法完成全部問題或無法實現滿星通關;b.出於虛榮心/探索欲/求知欲/強迫癥等各種原因想要獲得滿星通關。3)假設:a.遊戲提
ThreadLocal的理解與應用場景分析
位置 理解 原理 解釋 als 存取 cti 只需要 his 對於Java ThreadLocal的理解與應用場景分析 一、對ThreadLocal理解 ThreadLocal提供一個方便的方式,可以根據不同的線程存放一些不同的特征屬性,可以方便的在線程中進行存取。
Java CAS ABA問題發生的場景分析
進行 有一個 pri 出棧 .com package pan compare 變量 提到了CAS操作存在問題,就是在CAS之前A變成B又變回A,CAS還是能夠設置成功的,什麽場景下會出現這個問題呢?查了一些資料,發現在下面的兩種情況下會出現ABA問題。 1.A最開始
如何滾動更新 Service?- 每天5分鐘玩轉 Docker 容器技術(102)
docker容器教程swarm在前面的實驗中,我們部署了多個副本的服務,本節將討論如何滾動更新每一個副本。滾動更新降低了應用更新的風險,如果某個副本更新失敗,整個更新將暫停,其他副本則可以繼續提供服務。同時,在更新的過程中,總是有副本在運行的,因此也保證了業務的連續性。下面我們將部署三副本的服務,鏡像使用 h
團隊項目 用戶及場景分析
沒有 大學生 nbsp 但是 需求 另一個 進入 clas 情況 典型用戶模板: 用戶1 姓名:楚子航 年齡:20 收入:無 比例:較小 典型場景:想要整理自己上課所記的筆記,或者對某些內容的想法 環境:宿舍,自習室 生活/工作情況:大學生,熱愛學習,經常去自習 知識層次和