在kubernetes中使用deployment管理rs时,可以利用deployment滚动升级的特性,达到服务零停止升级的目的

命令行创建一个deploymen
1
kubectl run nginx --image=nginx
多副本deployment
1
kubectl run nginx --image=nginx --replicas=2 --record
滚动升级 (可以加上–record参数可以记录命令)
1
2
3
4
5
6
7
8
kubectl set image deploy/nginx nginx=nginx:1.9.1

# 滚动策略:
kubectl edit deployment nginx
strategy:
rollingUpdate:
maxSurge: 1 # 升级过程中可以比预设的 pod 的数量多出的个数,默认值是25%
maxUnavailable: 1 # 最多有几个 pod 处于无法工作的状态,默认值是25%
滚动升级状态查看
1
kubectl rollout status deploy/nginx
查看升级历史
1
2
3
kubectl rollout history deploy/nginx
# 查看单个revision 的详细信息:
kubectl rollout history deploy/nginx --revision=2
资源调整:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
kubectl set resources deploy/nginx -c=nginx  --limits=cpu=100m,memory=200m

# 此时在查看历史状态:
$ kubectl rollout history deploy/nginx
deployments "nginx"
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>

# 查看revision 3 的内容,可以看出刚才调整了pod的资源记录了到了升级历史当中
$ kubectl rollout history deploy/nginx --revision=3
eployments "nginx" with revision #3
Pod Template:
Labels: pod-template-hash=440294079
run=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: <none>
Limits:
cpu: 100m
memory: 200m
Environment: <none>
Mounts: <none>
Volumes: <none>
回滚操作:
1
2
3
# 回滚到第二个版本去
$ kubectl rollout undo deploy nginx --to-revision=2
deployment "nginx"
应用弹性伸缩:
1
2
$ kubectl scale deploy nginx --replicas=10
deployment "nginx" scaled

如果集群中对接了heapster,和HPA联动后,可以通过autoscale自动弹性伸缩

1
$ kubectl autoscale deployment nginx --min=10 --max=15 --cpu-percent=80
暂停和恢复Deployment

您可以在发出一次或多次更新前暂停一个 Deployment,然后再恢复它。这样您就能多次暂停和恢复 Deployment,在此期间进行一些更新,修复工作,而不会发出不必要的 rollout。

例如使用刚刚创建 Deployment:

1
2
3
$ kubectl get deploy nginx
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 3 3 3 3 27s

使用以下命令暂停 Deployment:

1
2
$ kubectl rollout pause deployment/nginx
deployment "nginx" paused

然后更新 Deplyment中的镜像:

1
2
$ kubectl set image deploy/nginx nginx=nginx:1.9.1
deployment "nginx-deployment" image updated

您可以进行任意多次更新,例如更新使用的资源:

1
2
$ kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=256Mi
deployment "nginx" resource requirements updated
Deployment 暂停前的初始状态将继续它的功能,而不会对 Deployment 的更新产生任何影响,只要 Deployment是暂停的。

那么新的更新或者改动的结果将是在暂停期间所有做的操作都是顺序生效取相同操作的最后一步,
比如,暂停后我做了以下操作:
1.更新了版本: 1.9.1
2.更新了资源: memory=222Mi
3.又更新了版本: 1.9.3
4.又调整了资源: memory=211Mi

最后,恢复这个 Deployment,观察完成更新的 ReplicaSet 已经创建出来了:

注意: 在恢复 Deployment 之前您无法回退一个已经暂停的 Deployment。