Kubernetes--應用滾動升級

1.預備知識

滾動升級(rolling update)是每一次只更新一小部分的副本,成功后再繼續更新更多的副本,最終把所有副本更新。
好處:不用停機,實現平滑的升級。


2.Deployment的滾動升級

2.1 Deployment與Replica Set與Pod的關系

如下圖所示(網上找的),

deployment.png

一個Deployment管理多個Replica Set,一個Replica Set 管理多個Pod
正因為這樣,Deployment能夠實現回滾,每一次部署新的Deployment時,都會生成一個新的Replica Set,并且會保留下來,所以以后想回退版本的話,就能直接利用舊的Replica Set回滾回到先前版本。

2.2 開始動手

  1. 部署一個需要3個Pod的Deployment,鏡像為httpd:2.2.31,yam文件如下
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd
spec: 
  replicas: 3
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadate:
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:2.2.31
        ports:
        - containerPort: 80

2.執行部署并查看

[root@ceph1 sector7]# kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            1           13s       httpd        httpd:2.2.31   run=httpd
[root@ceph1 sector7]# kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            3           1m        httpd        httpd:2.2.31   run=httpd
[root@ceph1 sector7]# kubectl get pods -o wide
NAME                    READY     STATUS    RESTARTS   AGE       IP            NODE
httpd-9658687dd-7q7fw   1/1       Running   0          1m        10.244.0.36   ceph1
httpd-9658687dd-f9r9t   1/1       Running   0          1m        10.244.2.11   localhost.localdomain
httpd-9658687dd-ql46w   1/1       Running   0          1m        10.244.1.36   ceph3
[root@ceph1 sector7]# kubectl get rs
NAME              DESIRED   CURRENT   READY     AGE
httpd-9658687dd   3         3         3         2m

通過Deployment,Replica Set,Pod的名字也可以看出彼此的等級關系:(最后的是隨機字符串)
Deployment:httpd
Replica Set:httpd-9658687dd
Pod:httpd-9658687dd-7q7fw

注意當前httpd的版本為:2.2.31,下面開始升級

  1. 升級
    將httpd.yaml文件中的image修改為:httpd:2.2.32
    再執行一次部署kubectl apply -f httpd.yaml
    再次查看:
[root@ceph1 sector7]# kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         4         2            2           13m       httpd        httpd:2.2.32   run=httpd
[root@ceph1 sector7]# kubectl get rs
NAME               DESIRED   CURRENT   READY     AGE
httpd-76c8bd9f65   2         2         0         9s
httpd-9658687dd    2         2         2         13m
[root@ceph1 sector7]# kubectl get pods -o wide
NAME                     READY     STATUS              RESTARTS   AGE       IP            NODE
httpd-76c8bd9f65-kvzdh   0/1       ContainerCreating   0          2s        <none>        ceph1
httpd-76c8bd9f65-vfblg   1/1       Running             0          14s       10.244.1.37   ceph3
httpd-76c8bd9f65-wfqkg   1/1       Running             0          15s       10.244.2.12   localhost.localdomain
httpd-9658687dd-f9r9t    0/1       Terminating         0          13m       10.244.2.11   localhost.localdomain
[root@ceph1 sector7]# kubectl get pods -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
httpd-76c8bd9f65-kvzdh   1/1       Running   0          16s       10.244.0.37   ceph1
httpd-76c8bd9f65-vfblg   1/1       Running   0          28s       10.244.1.37   ceph3
httpd-76c8bd9f65-wfqkg   1/1       Running   0          29s       10.244.2.12   localhost.localdomain
[root@ceph1 sector7]# kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            3           13m       httpd        httpd:2.2.32   run=httpd
[root@ceph1 sector7]# kubectl get rs
NAME               DESIRED   CURRENT   READY     AGE
httpd-76c8bd9f65   3         3         3         4m
httpd-9658687dd    0         0         0         17m

更新完成后,httpd的鏡像變為了httpd:2.2.32了。

  1. 滾動升級過程
    通過查看log,kubectl describe deployment httpd
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  21m   deployment-controller  Scaled up replica set httpd-9658687dd to 3
  Normal  ScalingReplicaSet  8m    deployment-controller  Scaled up replica set httpd-76c8bd9f65 to 1
  Normal  ScalingReplicaSet  8m    deployment-controller  Scaled down replica set httpd-9658687dd to 2
  Normal  ScalingReplicaSet  8m    deployment-controller  Scaled up replica set httpd-76c8bd9f65 to 2
  Normal  ScalingReplicaSet  8m    deployment-controller  Scaled down replica set httpd-9658687dd to 1
  Normal  ScalingReplicaSet  8m    deployment-controller  Scaled up replica set httpd-76c8bd9f65 to 3
  Normal  ScalingReplicaSet  8m    deployment-controller  Scaled down replica set httpd-9658687dd to 0

從Message中可以看出,兩個Replica Set是逐步更新Pod的,
httpd-9658687dd是最開始的,有3個Pod,httpd-76c8bd9f65是新生成,有0個Pod,依次
httpd-76c8bd9f65 up 為1,httpd-9658687dd down 為2
httpd-76c8bd9f65 up 為2,httpd-9658687dd down 為1
httpd-76c8bd9f65 up 為3,httpd-9658687dd down 為0
當然,滾動升級每次更新的Pod數量是可以指定的,通過兩個參數maxSurgemaxUnavailable控制。

  • maxSurge
    升級過程中,最多可以比原先設定所多出的Pod數量,可以是具體的數值,也可以是百分比(百分比的話向上取整,默認為25%,比如10個,那就是10*25%=2.5,向上取整為3)
  • maxUnavailable
    最多有多少個Pod處于不可用的狀態,可以是具體的數值,也可以是百分比(百分比是向下取整,默認為25%)

所以,maxSurge的值越大,初始創建的Pod就越多,maxUnavailable的值越大,初始銷毀的舊Pod就越多

  1. 升級相關的命令操作
  • 查詢升級狀態
    kubectl rollout status deployment <deployment_name>
  • 暫停滾動升級
    kubectl rollout pause deployment <deployment_name>
  • 恢復滾動升級
    kubectl rollout resume deployment <deployment_name>

3.回退版本

kubectl apply在每次更新應用的時候,都會記錄下當前的配置,保存為一個版本revision,默認情況kubernetes只會保留最近的幾個revision,但可以在Deployment的配置文件中指定保存的revision的數量,通過revisionHistoryLimit屬性設置。

3.1 驗證

將上面的httpd.yaml文件復制三份,分別命名為httpd1.yaml,httpd2.yaml,httpd3.yaml,對應鏡像修改為httpd:2.4.16,httpd:2.4.17,httpd:2.4.18.

  1. 執行部署
[root@ceph1 sector7]# kubectl apply -f httpd1.yaml --record
deployment.apps "httpd" created
[root@ceph1 sector7]# kubectl get deployment -o wide   
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            3           29s       httpd        httpd:2.4.16   run=httpd
[root@ceph1 sector7]# kubectl apply -f httpd2.yaml  --record
deployment.apps "httpd" configured
[root@ceph1 sector7]# kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            3           1m        httpd        httpd:2.4.17   run=httpd
[root@ceph1 sector7]# kubectl apply -f httpd3.yaml 
deployment.apps "httpd" configured
[root@ceph1 sector7]# kubectl get deployment -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            3           5m        httpd        httpd:2.4.18   run=httpd

由上面信息可知,這一次版本從2.4.16升級到2.4.17再升級到2.4.18,總共有三次操作,而且這一次執行kubectl apply時候加上了--record.

--record的作用是將當前命令記錄到revision記錄中,如果沒加上(比如上面更新為httpd3,.yaml時)在revision記錄中會顯示為<none>,這樣子就無法看出更新的信息。

查看歷史版本

[root@ceph1 sector7]# kubectl rollout history deployment httpd
deployments "httpd"
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=httpd1.yaml --record=true
2         kubectl apply --filename=httpd2.yaml --record=true
3         <none>

這里的CHANGE_CAUSE就是加上了--record的結果。REVISION就是版本,如果想回退到revision=1,可以執行命令:
kubectl rollout undo deployment httpd --to-revision=1
如果是想回退到上一個版本,則可以不用指定--to-revision

  1. 總結
    所以在執行apply時候需要加上--record對于以后回退版本會比較清晰。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容