iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
DevOps

從題目中學習k8s系列 第 10

【從題目中學習k8s】-【Day10】第二題 - Deployment Rolling Update


title: 【從題目中學習k8s】-【Day10】第二題 - Deployment Rolling Update
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day10】第二題 - Deployment Rolling Update

tags: DevOps CICD K8s Docker

Question

Create a deployment as follows:

Name:nginx-app

Using container nginx with version 1.11.0-alpine

The deployment should contain 3 replicas

Next, deploy the app with new version 1.11.3-alpine by performing a rolling update and record that update.

Finally, rollback that update to the previous version 1.11.0-alpine

概念

這題的考點是rolling updaterollout,也就是K8s中重要的版本控制、版本升級與版本回滾。

這邊指的版本是指image的版本

K8s中有兩種版本升級的strategies,一種是recreate,一種為rolling updaterecreate方法很直覺,就是直接將所有Pod一次升級,一次刪除所有舊版Pod,再一次創建所有新版Pod,缺點是更新過程會暫時中斷服務;而rolling update則是將舊版Pod一個一個刪除,再一個一個創建新的,可以保證更新期間提供的服務不會中斷。

創建Deployment時不必特別指定update strategy type,K8s中default的策略就是RollingUpdate
可以用kubectl describe deploy命令查看

這題還包含了rollback的概念,即版本回滾。K8sDeployment的升級機制其實是透過replicaSet物件完成。更新時會創建一個新的replicaSet,新舊版replicaSet透過rolling update機制更新完成。所以你可以在更新完成後查看replicaSet,其中一個沒有Pod運行(舊版replicaSet,裡面的Pod被刪除),另一個則有3個Pod(新版replicaSet)。

所以K8s為甚麼可以實現版本回滾,就是因為它舊版的replicaSet其實還在,並沒有被刪除,只要重新將它run起來並刪除新replicaSet就可以實現回滾了。

有了這些概念後,我們就可以來解這道題目了。步驟如下:

  1. 創建一個Deployment
  2. replicas設定為3
  3. 更新image版本並記錄
  4. 回滾image版本

Answer

創建Deployment

$ kubectl create deploy nginx-app --image=nginx:1.11.0-alpine
## 將replicas設定為3
$ kubectl edit deploy nginx-app
...
spec:
  replicas: 3
...

Deployment image update為1.11.3-alpine版本

## 升級image為1.11.3-alpine,並記錄此升級
## 不必特別指定update policy,因為default就是rolling update
## nginx=nginx:1.11.3-alpine的nginx是container name
$ kubectl set image deployment nginx-app nginx=nginx:1.11.3-alpine --record
deployment.apps/nginx-app image updated

## 查看升級紀錄
$ kubectl rollout history deploy nginx-app
deployment.apps/nginx-app 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deploy nginx-app nginx=nginx:1.11.3-alpine --record=true

## 檢查deployment的image版本,確定成功升級
$ kubectl get deploy -o wide
NAME        READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                SELECTOR
nginx-app   3/3     3            3           9m19s   nginx        nginx:1.11.3-alpine   app=nginx-app

回滾為1.11.0-alpine版本

## 回滾上一個版本
$ kubectl rollout undo deployment nginx-app
deployment.apps/nginx-app rolled back

## 檢查deployment的image版本,確定成功回滾
$ kubectl get deploy -o wide
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                SELECTOR
nginx-app   3/3     2            3           10m   nginx        nginx:1.11.0-alpine   app=nginx-app

## 確認回滾狀態
$ kubectl rollout status deployment nginx-app
deployment "nginx-app" successfully rolled out

結論

今天主要介紹K8s中的版本升級,這類考題還滿常見的,但是其實不難,步驟指令就是這幾個,忘記了也不要緊,到官網找資料就行了~ 好啦,今天就到這囉,謝謝大家~

參考資料

Deployments
透過 Kubernetes Deployments 實現滾動升級
更新/回復系統別中斷服務行嗎:Rolling

Thank you!

You can find me on


上一篇
【從題目中學習k8s】-【Day9】第一題 - Pod Scheduling 1
下一篇
【從題目中學習k8s】-【Day11】第三題 - Service
系列文
從題目中學習k8s31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言