Deployment继承了rc的全部功能外,还可以查看升级详细进度和状态,当升级出现问题的时候,可以使用回滚操作回滚到指定的版本,每一次对Deployment的操作,都会保存下来,方便的进行回滚操作,另外对于每一次升级都可以随时暂停和启动.
可以看出一个Deployment拥有多个Replica Set,而一个Replica Set拥有一个或多个Pod。一个Deployment控制多个rs主要是为了支持回滚机制,每当Deployment操作时,Kubernetes会重新生成一个Replica Set并保留,以后有需要的话就可以回滚至之前的状态。 下面创建一个Deployment,它创建了一个Replica Set来启动3个nginx pod,yaml文件如下:
apiVersion: extensions/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,执行命令
kubectl create -f nginx-deployment.yaml
然后执行一下命令查看刚刚创建的Deployment:
kubectl get deployments
隔一会再次执行上面命令
我们可以看到Deployment已经创建了3个Replica Set了,执行下面的命令查看rs和pod:
kubectl get rs
kubectl get pod --show-labels
上面的Deployment的yaml文件中的replicas:3将会保证我们始终有3个POD在运行。
现在我们将刚刚保存的yaml文件中的nginx镜像修改为nginx:1.13.3,然后在spec下面添加滚动升级策略:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
执行命令:
kubectl apply -f nginx-deployment.yaml
然后我们可以使用rollout命令:
查看状态:
kubectl rollout status deployment/nginx-deploy
暂停升级
kubectl rollout pause deployment <deployment>
继续升级
kubectl rollout resume deployment <deployment>
升级结束后,继续查看rs的状态:
kubectl get rs
根据AGE我们可以看到离我们最近的当前状态是:3,和我们的yaml文件是一致的,证明升级成功了。用describe命令可以查看升级的全部信息.
我们已经能够滚动平滑的升级我们的Deployment了,但是如果升级后的POD出了问题该怎么办?我们能够想到的最好最快的方式当然是回退到上一次能够提供正常工作的版本,Deployment就为我们提供了回滚机制。
首先,查看Deployment的升级历史:
kubectl rollout history deployment nginx-deploy
从上面的结果可以看出在执行Deployment升级的时候最好带上record参数,便于我们查看历史版本信息。同样我们可以使用下面的命令查看单个REVISION的信息:
kubectl rollout history deployment nginx-deploy --revision=3
假如现在要直接回退到当前版本的前一个版本:
kubectl rollout undo deployment nginx-deploy
当然也可以用revision回退到指定的版本:
kubectl rollout undo deployment nginx-deploy --to-revision=2