1.預備知識
滾動升級(rolling update)是每一次只更新一小部分的副本,成功后再繼續更新更多的副本,最終把所有副本更新。
好處:不用停機,實現平滑的升級。
2.Deployment的滾動升級
2.1 Deployment與Replica Set與Pod的關系
如下圖所示(網上找的),
一個Deployment管理多個Replica Set,一個Replica Set 管理多個Pod
正因為這樣,Deployment能夠實現回滾,每一次部署新的Deployment時,都會生成一個新的Replica Set,并且會保留下來,所以以后想回退版本的話,就能直接利用舊的Replica Set回滾回到先前版本。
2.2 開始動手
- 部署一個需要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,下面開始升級
- 升級
將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了。
- 滾動升級過程
通過查看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數量是可以指定的,通過兩個參數maxSurge和maxUnavailable控制。
- maxSurge
升級過程中,最多可以比原先設定所多出的Pod數量,可以是具體的數值,也可以是百分比(百分比的話向上取整,默認為25%,比如10個,那就是10*25%=2.5,向上取整為3) - maxUnavailable
最多有多少個Pod處于不可用的狀態,可以是具體的數值,也可以是百分比(百分比是向下取整,默認為25%)
所以,maxSurge的值越大,初始創建的Pod就越多,maxUnavailable的值越大,初始銷毀的舊Pod就越多
- 升級相關的命令操作
- 查詢升級狀態
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.
- 執行部署
[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
- 總結
所以在執行apply時候需要加上--record對于以后回退版本會比較清晰。