一、Deployment的参数
pc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: test
spec:
replicas: 4
#保存历史版本数量
revisionHistoryLimit: 2
#控制滚动更新的速度(秒)
minReadySeconds: 0
#标识Deployment只做数量维持、不做新的发布(默认值false,代表当前deploy可以更新)
paused: false
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 0
type: RollingUpdate
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18
revisionHistoryLimit
Deployment保留一部分更新历史中旧版本的 ReplicaSet 对象,当我们执行回滚操作的时候,就直接使用旧版本的ReplicaSet,在 Deployment 资源保存历史版本数量有 spec.revisionHistoryLimit 属性进行定义。
minReadySeconds
Deployment支持使用 spec.minReadySeconds 字段来控制滚动更新的速度,默认值为0,表示新建的Pod对象-旦"就绪"将立即被视作可用,随后即可开始下一轮更新过程,如果设定了 spec.minReadySeconds: 3表示新建的Pod对象至少要成功运行多久才会被视作可用,即就绪之后还要等待指定的 3s 才能开始下一批次的更新。在一个批次内新建的所有POD就绪后在转为可用状态前,更新操作会被阻塞,并且任何一个Pod就绪探测失败,都会导致滚动更新被终止。
因此,为minReadySeconds设定一个合理的值,不仅能够减缓更新的速度,还能够让Deployment提前发现一部分程序因为Bug导致的升级故障。

paused
paused暂停部署,默认是false;标识Deployment只做数量维持、不做新的发布
progressDeadlineSeconds
滚动更新故障超时时长,默认为600秒,k8s 在升级过程中有可能由于各种原因升级卡住(这个时候还没有明确的升级失败)比如在拉取镜像,权限不够等错误。如果配置 progressDeadlineSeconds,当达到了时间如果还卡着,则会上报这个异常情况,这个时候这个 Deployment 状态就被标记为 False,并且注明原因。但是它并不会阻止 Deployment 继续进行卡住后面的升级操作。
二、Deployment中的灰度发布(金丝雀发布)
是什么
金丝雀发布(又名灰度发布)是指在新与旧之间,能够精确控制发布流程的一种发布方式,在其上可以进行A/B testing,即让一部分用户继续用旧产品特性A,一部分用户开始用新产品特性B
待充分测试验证新产品特性B以后再继续推进发布(新版本的pod运行一段时间后,如果没有报错,那么就可以逐步扩大新版本的pod的数量,并逐步完成更新)
如果新版本的pod运行一段时间后,有报错,那么就可以快速回退新版本的pod降级为发布之前的老版本A,及时止损。
K8s中的灰度发布

Deployment控制器支持控制更新过程中的控制,如"暂停(pause)"或"继续(resume)"更新操作。
比如有一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。
pc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: test
spec:
replicas: 4
#滚动更新
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 0
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.18
让deployment升级,并立刻暂停
# 更新deployment的版本,第一轮迭代升级之后并立刻暂停deployment
[root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.20 -n test && kubectl rollout pause deployment pc-deployment -n test
deployment.apps/pc-deployment image updated
deployment.apps/pc-deployment paused
#观察更新状态
[root@master ~]# kubectl rollout status deploy pc-deployment -n test
Waiting for deployment "pc-deployment" rollout to finish: 2 out of 4 new replicas have been updated...
# 监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令
[root@master ~]# kubectl get rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES
pc-deployment-5d89bdfbf9 3 3 3 19m nginx nginx:1.18
pc-deployment-675d469f8b 0 0 0 14m nginx nginx:1.19.2
pc-deployment-6c9f56fcfb 2 2 2 3m16s nginx nginx:1.20.4
[root@master ~]# kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
pc-deployment-5d89bdfbf9-rj8sq 1/1 Running 0 7m33s
pc-deployment-5d89bdfbf9-ttwgg 1/1 Running 0 7m35s
pc-deployment-5d89bdfbf9-v4wvc 1/1 Running 0 7m34s
pc-deployment-6c9f56fcfb-996rt 1/1 Running 0 3m31s
pc-deployment-6c9f56fcfb-j2gtj 1/1 Running 0 3m31s
# 确保更新的pod没问题了,继续更新
[root@master ~]# kubectl rollout resume deploy pc-deployment -n test
deployment.apps/pc-deployment resumed
# 查看最后的更新情况
[root@master ~]# kubectl get rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES
pc-deployment-5d89bdfbf9 0 0 0 21m nginx nginx:1.17.1
pc-deployment-675d469f8b 0 0 0 16m nginx nginx:1.17.2
pc-deployment-6c9f56fcfb 4 4 4 5m11s nginx nginx:1.17.4
[root@master ~]# kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
pc-deployment-6c9f56fcfb-7bfwh 1/1 Running 0 37s
pc-deployment-6c9f56fcfb-996rt 1/1 Running 0 5m27s
pc-deployment-6c9f56fcfb-j2gtj 1/1 Running 0 5m27s
pc-deployment-6c9f56fcfb-rf84v 1/1 Running 0 37s
删除Deployment
# 删除deployment,其下的rs和pod也将被删除
[root@master ~]# kubectl delete -f pc-deployment.yaml
deployment.apps "pc-deployment" deleted