1. 程式人生 > >Kubernetes Deployment滾動更新場景分析

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

      如下所示:

這裡寫圖片描述

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的滾動更新。

這裡寫圖片描述

更新後,再次觸發滾動升級:

這裡寫圖片描述

  1. 第二次滾動升級webserver-2480438009初始DESIRED=0,因為兩個老的RS當前例項總數為12+7=19,已經達到最大值,所以初始為0。
  2. 縮減老的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

所以將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 收入:無 比例:較小 典型場景:想要整理自己上課所記的筆記,或者對某些內容的想法 環境:宿舍,自習室 生活/工作情況:大學生,熱愛學習,經常去自習 知識層次和