DevOps
CICD
K8s
Docker
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 update
和rollout
,也就是K8s
中重要的版本控制、版本升級與版本回滾。
這邊指的版本是指
image
的版本
在K8s
中有兩種版本升級的strategies,一種是recreate
,一種為rolling update
。recreate
方法很直覺,就是直接將所有Pod
一次升級,一次刪除所有舊版Pod
,再一次創建所有新版Pod
,缺點是更新過程會暫時中斷服務;而rolling update
則是將舊版Pod
一個一個刪除,再一個一個創建新的,可以保證更新期間提供的服務不會中斷。
創建
Deployment
時不必特別指定update strategy type,K8s
中default的策略就是RollingUpdate
可以用kubectl describe deploy
命令查看
這題還包含了rollback
的概念,即版本回滾。K8s
中Deployment
的升級機制其實是透過replicaSet
物件完成。更新時會創建一個新的replicaSet
,新舊版replicaSet
透過rolling update
機制更新完成。所以你可以在更新完成後查看replicaSet
,其中一個沒有Pod
運行(舊版replicaSet
,裡面的Pod
被刪除),另一個則有3個Pod
(新版replicaSet
)。
所以
K8s
為甚麼可以實現版本回滾,就是因為它舊版的replicaSet
其實還在,並沒有被刪除,只要重新將它run起來並刪除新replicaSet
就可以實現回滾了。
有了這些概念後,我們就可以來解這道題目了。步驟如下:
Deployment
replicas
設定為3image
版本並記錄image
版本創建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
You can find me on