深入kubernetes:K8s的Deployment控制器( 二 )

可以看到Deployment Controller控制ReplicaSet将旧的Pod 副本数一个个减少,并创建一个新的ReplicaSet:nginx-deployment-dc46b5ffc,并将其控制的Pod副本数一个个增加 。
在这个“滚动更新”过程完成之后,你可以查看一下新、旧两个 ReplicaSet 的最终状态:
kubectl get rsNAMEDESIREDCURRENTREADYAGEnginx-deployment-9754ccbdf00057mnginx-deployment-dc46b5ffc4445m9s默认的情况下,Deployment 会保至少有75%的Pod还是可用的,所以我们的例子中,会保证至少有3个Pod是出于可用的状态 。
这个策略,是 Deployment 对象的一个字段,名叫 RollingUpdateStrategy,如下所示:
kubectl describe deploymentName:nginx-deployment...Selector:app=nginxReplicas:4 desired | 4 updated | 4 total | 4 available | 0 unavailableStrategyType:RollingUpdateMinReadySeconds:0RollingUpdateStrategy:25% max unavailable, 25% max surge...25% max unavailable表示最大25%不可用;25% max surge表示最多可以创建多少个新的Pod 。
版本控制与回滚在上面的操作中,我们将nginx的版本设置成了1.16.1,现在我们可以通过rollout undo来进行版本的回滚:
kubectl rollout undo deployment/nginx-deploymentdeployment.apps/nginx-deployment rolled back当然除了这个命令以外由于我们使用了–record,所以我们可以通过kubectl rollout history 来查看版本信息:
kubectl rollout history deployment/nginx-deploymentdeployment.apps/nginx-deploymentREVISIONCHANGE-CAUSE2kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true3kubectl apply --filename=nginx-deployment.yaml --record=true我们可以通过kubectl rollout history来看到相应版本的具体信息:
kubectl rollout history deployment/nginx-deployment --revision=2通过kubectl rollout undo命令来回滚到相应的版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2Pausing 和Resuming 一个Deployment我们在上面的操作中,每进行一步操作都会进行一次滚动更新,如果我们想一次性执行多条命令然后再一次性滚动更新,那么可以先pause Deployment然后操作完之后再resume 它 。
如下:
kubectl rollout pause deployment/nginx-deploymentdeployment.apps/nginx-deployment paused然后就可以随意的修改这个 Deployment 的内容了 。由于此时 Deployment 正处于“暂停”状态,所以我们对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet 。
操作完之后再执行:
kubectl rollout resume deployment/nginx-deploymentdeployment.apps/nginx-deployment resumed在 kubectl rollout pause 指令之后的这段时间里,我们对 Deployment 进行的所有修改,最后只会触发一次“滚动更新” 。


【深入kubernetes:K8s的Deployment控制器】


推荐阅读