1 原理
kubernets中有水平擴展/收縮和滾動更新兩個編排動作,都依賴於ReplicaSet。
Deployment Controller實際操縱的是 ReplicaSet 對象,而不是 Pod 對象。ReplicaSet 通過“控制器模式”,保證系統中Pod的個數永遠等於指定的個數,Deployment Controller同樣通過“控制器模式”,來操作 ReplicaSet 的個數和屬性,進而實現水平擴展 / 收縮”和“滾動更新”這兩個編排動作。
Deployment,與 ReplicaSet,以及Pod 的關係如下圖:
2 水平擴展/收縮
deployment要進行“水平擴展 / 收縮”,Deployment Controller 只需要修改它所控制的ReplicaSet 的 Pod 副本個數就可以了。
nginx-deployment文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
執行操作
kubectl create -f nginx-deployment.yaml -n cfd
# 查看 ReplicaSet
kubectl get rs -n cfd
# replica 擴展爲4
kubectl scale deployment nginx-deployment --replicas=4 -n cfd
# 查看deployment信息,其中event展現了擴展操作
kubectl describe deployment nginx-deployment -n cfd
3 滾動更新
將一個集羣中正在運行的多個 Pod 版本,交替地逐一升級的過程,就是“滾動更新”。
在deployment創建或者更新後,會立即觸發滾動更新。
# --record,記錄下每次操作的命令,方便日後查看
kubectl create -f nginx-deployment.yaml -n cfd --record
# 實時查看 Deployment狀態
kubectl rollout status deployment/nginx-deployment --record -n cfd
kubectl get deployments -n cfd
# 將image 由 1.7.9 升級到 1.9.1
kubectl edit deployment/nginx-deployment -n cfd
# 滾動更新過程
kubectl rollout status deployment/nginx-deployment -n cfd
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
# 查看event中滾動更新的流程
kubectl describe deployment nginx-deployment -n cfd
滾動更新的好處是保證服務的連續性,在任何窗口時間內,只有指定比例的Pod處於離線狀態,同時也只有指定比例的新Pod被創建出來,這兩個比例的值可以分別通過maxSurge和maxUnavailable配置,默認都是 DESIRED 值的25%
如果滾動更新失敗,可以通過進行回滾,以版本控制爲例
# 更新一個不存在的image
kubectl set image deployment/nginx-deployment nginx=nginx:1.91 -n cfd
# 查看rs,發現有沒有處於READY的rs
kubectl get rs -n cfd
# 回滾到上個版本
kubectl rollout undo deployment/nginx-deployment -n cfd
# 查看回滾歷史
kubectl rollout history deployment/nginx-deployment -n cfd
# 回滾到指定版本
kubectl rollout history deployment/nginx-deployment --revision=2 -n cfd
# 每一次更新操作,都會生成一個新的ReplicaSet,有些多餘,在更新Deployment前執行pause,使Deployment進入pause態,在set或者edit之後,再通過resume恢復,對於在此期間的操作,只生成一個ReplicaSet
kubectl rollout pause deployment/nginx-deployment-n cfd
kubectl rollout resume deployment/nginx-deployment-n cfd