原文連接nginx
當集羣中某個服務須要升級時,咱們可能須要中止目前與該服務相關的全部Pod,而後下載新版本鏡像並建立新的Pod。 然而這個升級/回滾方案在集羣較大的時候代價是巨大的,會致使較長時間的服務不可用。K8S提供了滾動升級功能來解決這些問題。git
不一樣的管理對象的更新配置和操做是不一樣的github
對於Deployment來說,更新的過程以下json
Deployment的ReplicaSet本來有3個Pod副本api
在更新開始前,建立一個新的ReplicaSet對象,配置與舊的ReplicaSet一致bash
根據更新規則,逐漸擴容新的RS、縮容舊的RS,直到新的RS容量與舊的一致、舊的RS容量爲0markdown
根據存儲歷史版本配置決定是否刪除超出存儲數量的歷史ReplicaSetapp
type DeploymentSpec struct { // Deployment對於已經存在的Pod的替換策略 Strategy DeploymentStrategy `json:"strategy,omitempty"` // 存儲的歷史版本數量,用於回滾,默認是10 RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` } type DeploymentStrategy struct { // 替換策略,值爲Recreate或RollingUpdate,默認爲RollingUpate // Recreate會先中止全部的舊Pod,而後建立新的 Type DeploymentStrategyType `json:"type,omitempty"` // 更新回滾配置參數,只在RollingUpdate下生效 RollingUpdate *RollingUpdateDeployment `json:"rollingUpdate,omitempty"` } type RollingUpdateDeployment struct { // 滾動升級過程當中,容許不可用的Pod數量或比例 // 默認爲25%,此時升級過程當中可用的Pod數量始終爲75% // 每成功升級一個,則容許開始升級下一個 // MaxUnavailable爲0時,MaxSurge不能爲0 MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` // 滾動升級過程當中,容許最多同時建立Pod的數量或比例 // 默認爲25%,此時升級過程當中新舊Pod數量總和最多爲正常值的125% // 每刪除一箇舊的Pod則容許建立一個新的 // MaxSurge爲0時,MaxUnavailable不能爲0 MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` } 複製代碼
當前擁有一個名爲nginx-deployment的Deployment對象oop
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.13.0 ports: - containerPort: 80 複製代碼
假如要將其nginx版本從1.13.0升級到最新的1.14.0post
有兩種方案能夠進行升級,效果同樣
經過執行 kubectl edit (RESOURCE/NAME | -f FILENAME) [options]
具體用法能夠經過 kubectl edit --help
查看
經過執行 kubectl set SUBCOMMAND [options]
具體用法能夠經過 kubectl set --help
查看
咱們使用第二種方案進行升級
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.14.0 deployment.apps/nginx-deployment image updated $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-58cdcbb467 3 3 3 8m32s nginx-deployment-7f555c9b4b 1 1 0 9s $ kubectl describe deployment nginx-deployment Name: nginx-deployment Namespace: default CreationTimestamp: Sat, 28 Dec 2019 21:58:02 +0800 Labels: <none> Annotations: deployment.kubernetes.io/revision: 2 kubernetes.io/change-cause: kubectl create --filename=nginx-old.yaml --record=true Selector: app=nginx Replicas: 3 desired | 2 updated | 4 total | 3 available | 1 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.14.0 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True ReplicaSetUpdated OldReplicaSets: nginx-deployment-58cdcbb467 (2/2 replicas created) NewReplicaSet: nginx-deployment-7f555c9b4b (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 8m53s deployment-controller Scaled up replica set nginx-deployment-58cdcbb467 to 3 Normal ScalingReplicaSet 30s deployment-controller Scaled up replica set nginx-deployment-7f555c9b4b to 1 Normal ScalingReplicaSet 17s deployment-controller Scaled down replica set nginx-deployment-58cdcbb467 to 2 Normal ScalingReplicaSet 17s deployment-controller Scaled up replica set nginx-deployment-7f555c9b4b to 2 複製代碼
咱們能夠根據上面的信息看到
Annotations: deployment.kubernetes.io/revision: 2
當前Deployment的版本是2
RollingUpdateStrategy: 25% max unavailable, 25% max surge
此Deployment對象的滾動升級策略爲最多25%不可用,最多同時升級25%的Pod,Events信息中的行爲與配置要求行爲徹底一致
Replicas: 3 desired | 2 updated | 4 total | 3 available | 1 unavailable
當前的更新進度,也能夠經過 kubectl rollout status deployments nginx-deployment
來監聽
Conditions:
當前Deployment可用,正在進行ReplicaSet升級
OldReplicaSets: ... NewReplicaSet: ... 存在的新舊ReplicaSets信息
Events: ...
當前Deployment對象發生的事件
最終狀態下,原來的 nginx-deployment-7f555c9b4b
中Pod的數量將會變成0,而新的 nginx-deployment-58cdcbb467
中的Pod數量將會變爲3
因爲Deployment的配置中保留歷史版本數使用了默認的10,因此舊的RS會與新的同時存在,用於回滾
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-58cdcbb467 0 0 0 15m
nginx-deployment-7f555c9b4b 3 3 3 6m43s
複製代碼
可使用 kubectl rollout
命令來對Deployment進行回滾,經過 kubectl rollout --help
查看具體用法
在回滾版本前,能夠經過 kubectl rollout history
來查看當前存在的版本
若是在建立Deployment的時候,使用了 --record
參數,每次Deployment被修改的時候,還會記錄下來修改的命令
$ kubectl rollout history deployment/nginx-deployment deployment.apps/nginx-deployment REVISION CHANGE-CAUSE 1 kubectl create --filename=nginx-old.yaml --record=true 2 kubectl create --filename=nginx-old.yaml --record=true 複製代碼
此處能夠看到當前有兩個版本,能夠在後面加參數 --revision=<REVISION>
來查看指定版本的PotTemplate
$ kubectl rollout history deployment/nginx-deployment --revision=1 deployment.apps/nginx-deployment with revision #1 Pod Template: Labels: app=nginx pod-template-hash=58cdcbb467 Annotations: kubernetes.io/change-cause: kubectl create --filename=nginx-old.yaml --record=true Containers: nginx: Image: nginx:1.13.0 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> 複製代碼
在回滾的時候有兩種方案
kubectl rollout undo (TYPE NAME | TYPE/NAME)
kubectl rollout undo (TYPE NAME | TYPE/NAME) --to-revision=<REVISION>
使用第2中方法進行回滾,回滾到1個版本
$ kubectl rollout undo deployment/nginx-deployment --to-revision=1 deployment.apps/nginx-deployment rolled back $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-58cdcbb467 3 3 3 30m nginx-deployment-7f555c9b4b 0 0 0 22m $ kubectl describe deployment nginx-deployment OldReplicaSets: <none> NewReplicaSet: nginx-deployment-58cdcbb467 (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-7f555c9b4b to 1 Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set nginx-deployment-58cdcbb467 to 2 Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-7f555c9b4b to 2 Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set nginx-deployment-58cdcbb467 to 1 Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-7f555c9b4b to 3 Normal ScalingReplicaSet 21m deployment-controller Scaled down replica set nginx-deployment-58cdcbb467 to 0 Normal ScalingReplicaSet 14s deployment-controller Scaled up replica set nginx-deployment-58cdcbb467 to 1 Normal ScalingReplicaSet 10s deployment-controller Scaled down replica set nginx-deployment-7f555c9b4b to 2 Normal ScalingReplicaSet 10s deployment-controller Scaled up replica set nginx-deployment-58cdcbb467 to 2 Normal ScalingReplicaSet 7s (x2 over 30m) deployment-controller Scaled up replica set nginx-deployment-58cdcbb467 to 3 Normal ScalingReplicaSet 7s deployment-controller Scaled down replica set nginx-deployment-7f555c9b4b to 1 Normal ScalingReplicaSet 3s deployment-controller Scaled down replica set nginx-deployment-7f555c9b4b to 0 複製代碼
信息上能夠看到,經過縮容和擴容的操做,已經逐步切換到舊版本 nginx-deployment-58cdcbb467
上了
而且沒有更舊的版本了 OldReplicaSets: <none>
當有比較複雜的修改需求的時候,能夠先暫停Deployment的更新能力,在對Deployment進行修改完成以後,從新啓用更新,從而避免Deployment進行屢次更新
kubectl rolout pause (TYPE NAME | TYPE/NAME)
kubectl rolout resume (TYPE NAME | TYPE/NAME)