k8s工作负载-Deployment的参数与灰度发布

一、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
相关推荐
fajianchen2 小时前
如何设计微服务统一认证中心
微服务·云原生·架构·iam
大鹏说大话2 小时前
云原生深水区:2026 年 Serverless 函数计算落地实战与成本极致优化
云原生·serverless
道清茗2 小时前
【Kubernetes知识点问答题】常规维护管理操作 / ETCD 备份与恢复
docker·kubernetes·etcd
lpruoyu2 小时前
【云原生】可观测性系统—Istio
云原生·istio
lpruoyu2 小时前
【云原生】Harbor
云原生·harbor
lpruoyu2 小时前
【云原生】Kubernetes平台存储系统搭建_CRI、CNI、CSI
ceph·云原生·容器·kubernetes
Gold Steps.3 小时前
GitOps之Jenkins 构建镜像自动更新 Helm 并触发 ArgoCD 自动同步
运维·ci/cd·云原生
一殊酒3 小时前
【Docker】实战用例:前后端分离项目多容器Docker化设计
运维·docker·容器
小江的记录本3 小时前
【HashMap】HashMap 系统性知识体系全解(附《HashMap 面试八股文精简版》)
java·前端·后端·容器·面试·hash·哈希