咱们k8s
集群使用的是1.7.7版本的,该版本中官方已经推荐使用Deployment
代替Replication Controller
(rc)了,Deployment
继承了rc的所有功能外,还能够查看升级详细进度和状态,当升级出现问题的时候,可使用回滚操做回滚到指定的版本,每一次对Deployment的操做,都会保存下来,变能方便的进行回滚操做了,另外对于每一次升级均可以随时暂停和启动,拥有多种升级方案:Recreate
删除如今的Pod
,从新建立;RollingUpdate
滚动升级,逐步替换现有Pod
,对于生产环境的服务升级,显然这是一种最好的方式。nginx
能够看出一个Deployment拥有多个Replica Set,而一个Replica Set拥有一个或多个Pod。一个Deployment控制多个rs主要是为了支持回滚机制,每当Deployment操做时,Kubernetes会从新生成一个Replica Set并保留,之后有须要的话就能够回滚至以前的状态。 下面建立一个Deployment,它建立了一个Replica Set来启动3个nginx pod,yaml文件以下:api
apiVersion: apps/v1beta1 kind: Deployment metadata: name: nginx-deploy labels: k8s-app: nginx-demo spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
将上面内容保存为: nginx-deployment.yaml,执行命令:app
$ kubectl create -f nginx-deployment.yaml deployment "nginx-deploy" created
而后执行一下命令查看刚刚建立的Deployment:ide
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 3 0 0 0 1s
隔一会再次执行上面命令:ui
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 3 3 3 3 4m
咱们能够看到Deployment已经建立了3个Replica Set了,执行下面的命令查看rs和pod:spa
$ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deploy-431080787 3 3 3 6m
$ kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deploy-431080787-53z8q 1/1 Running 0 7m app=nginx,pod-template-hash=431080787 nginx-deploy-431080787-bhhq0 1/1 Running 0 7m app=nginx,pod-template-hash=431080787 nginx-deploy-431080787-sr44p 1/1 Running 0 7m app=nginx,pod-template-hash=431080787
上面的Deployment的yaml文件中的replicas:3
将会保证咱们始终有3个POD在运行。3d
如今咱们将刚刚保存的yaml文件中的nginx镜像修改成nginx:1.13.3
,而后在spec下面添加滚动升级策略:code
minReadySeconds: 5 strategy: # indicate which strategy we want for rolling update type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
maxSurge
不为0时,该值也不能为0而后执行命令:orm
$ kubectl apply -f nginx-deployment.yaml deployment "nginx-deploy" configured
而后咱们可使用rollout
命令:blog
查看状态:
$ kubectl rollout status deployment/nginx-deploy Waiting for rollout to finish: 1 out of 3 new replicas have been updated.. deployment "nginx-deploy" successfully rolled out
暂停升级
$ kubectl rollout pause deployment <deployment>
继续升级
$ kubectl rollout resume deployment <deployment>
升级结束后,继续查看rs的状态:
$ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deploy-2078889897 0 0 0 47m nginx-deploy-3297445372 3 3 3 42m nginx-deploy-431080787 0 0 0 1h
根据AGE咱们能够看到离咱们最近的当前状态是:3,和咱们的yaml文件是一致的,证实升级成功了。用describe
命令能够查看升级的所有信息:
Name: nginx-deploy Namespace: default CreationTimestamp: Wed, 18 Oct 2017 16:58:52 +0800 Labels: k8s-app=nginx-demo Annotations: deployment.kubernetes.io/revision=3 kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1beta1","kind":"Deployment","metadata":{"annotations":{},"labels":{"k8s-app":"nginx-demo"},"name":"nginx-deploy","namespace":"defa... Selector: app=nginx Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.13.3 Port: 80/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deploy-3297445372 (3/3 replicas created) Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 50m 50m 1 deployment-controller Normal ScalingReplicaSet Scaled up replica set nginx-deploy-2078889897 to 1 45m 45m 1 deployment-controller Normal ScalingReplicaSet Scaled down replica set nginx-deploy-2078889897 to 0 45m 45m 1 deployment-controller Normal ScalingReplicaSet Scaled up replica set nginx-deploy-3297445372 to 1 39m 39m 1 deployment-controller Normal ScalingReplicaSet Scaled down replica set nginx-deploy-431080787 to 2 39m 39m 1 deployment-controller Normal ScalingReplicaSet Scaled up replica set nginx-deploy-3297445372 to 2 38m 38m 1 deployment-controller Normal ScalingReplicaSet Scaled down replica set nginx-deploy-431080787 to 1 38m 38m 1 deployment-controller Normal ScalingReplicaSet Scaled up replica set nginx-deploy-3297445372 to 3 38m 38m 1 deployment-controller Normal ScalingReplicaSet Scaled down replica set nginx-deploy-431080787 to 0
咱们已经可以滚动平滑的升级咱们的Deployment了,可是若是升级后的POD出了问题该怎么办?咱们可以想到的最好最快的方式固然是回退到上一次可以提供正常工做的版本,Deployment就为咱们提供了回滚机制。
首先,查看Deployment的升级历史:
$ kubectl rollout history deployment nginx-deploy deployments "nginx-deploy" REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 kubectl apply --filename=Desktop/nginx-deployment.yaml --record=true
从上面的结果能够看出在执行Deployment升级的时候最好带上record
参数,便于咱们查看历史版本信息。一样咱们可使用下面的命令查看单个REVISION的信息:
$ kubectl rollout history deployment nginx-deploy --revision=3 deployments "nginx-deploy" with revision #3 Pod Template: Labels: app=nginx pod-template-hash=3297445372 Annotations: kubernetes.io/change-cause=kubectl apply --filename=nginx-deployment.yaml --record=true Containers: nginx: Image: nginx:1.13.3 Port: 80/TCP Environment: <none> Mounts: <none> Volumes: <none>
假如如今要直接回退到当前版本的前一个版本:
$ kubectl rollout undo deployment nginx-deploy deployment "nginx-deploy" rolled back
固然也能够用revision
回退到指定的版本:
$ kubectl rollout undo deployment nginx-deploy --to-revision=2 deployment "nginx-deploy" rolled back
如今能够用命令查看Deployment如今的状态了。
前面在用apply
命令滚动升级Deployment后,无心间在Dashboard
中发现了Replica Sets
下面有不少Pods为0/0
的RS,因为本人有轻微的强迫症,眼里是容不下0/0
这种东西的,而后就给删除
了,结果后面更新的时候又出现了,觉得是yaml脚本有误,结果到如今才清楚这个是用于Deployment回滚用的,不能随便删除的(感受本身就是个棒槌啊~~~)。
Kubernetes
默认是会将Deployments的每次改动操做生成一个新的RS,并保存下来的。不过你能够设置参数.spec.revisonHistoryLimit
来来指定Deployment最多保留多少revision 历史记录。若是将该项设置为0,Deployment就不容许回退了。