灰度发布和扩缩容

灰度发布( Rollout )运维特征可以用于对工作负载的滚动发布和扩缩容。

目前灰度发布运维特征支持的组件类型为:

  • webservice
  • worker

如何使用

启用插件

在开始使用灰度发布运维特征之前,你需要先通过以下命令启用 rollout 插件

  1. vela addon enable rollout

首次发布

应用下面的 YAML 来创建一个应用部署计划,该应用包含了一个使用了灰度发布运维特征的 webservice 类型的组件,并指定组件版本名称为 express-server-v1 。如果你不指定,每次对组件的修改都会自动产生一个组件版本(ControllerRevision),组件版本名称的默认产生规则是:<组件名>-<版本序号>

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. # 设置组件版本为 express-server-v1
  11. externalRevision: express-server-v1
  12. properties:
  13. image: stefanprodan/podinfo:4.0.3
  14. traits:
  15. - type: rollout
  16. # 缺省设置 targetRevision 直接指向最新的组件版本也就是 express-server-v1
  17. properties:
  18. # 设置部署5个副本
  19. targetSize: 5
  20. # 分两批发布,上一批次副本全部就绪之后部署下一批次
  21. rolloutBatches:
  22. - replicas: 2
  23. - replicas: 3
  24. EOF

这个灰度发布运维特征表示分两个批次发布工作负载,目标工作负载的副本个数为5个,第一批发布2个副本,第二批发布3个副本。前一批次的副本全部就绪之后,才会发布下一批次。

等待一段时间发布成功之后查看应用状态。

  1. $ kubectl get app rollout-trait-test
  2. NAME COMPONENT TYPE PHASE HEALTHY STATUS AGE
  3. rollout-trait-test express-server webservice running true 2d20h

查看组件版本。

  1. $ kubectl get controllerRevision -l controller.oam.dev/component=express-server
  2. NAME CONTROLLER REVISION AGE
  3. express-server-v1 application.core.oam.dev/rollout-trait-test 1 2d22h

查看灰度发布运维特征的状态, ROLLING-STATE 为 rolloutSucceed 说明发布成功,BATCH-STATE 为 batchReady 表明当前批次的副本已全部就绪。TARGET UPGRADED READY 三列说明目标的副本5个,完成升级的副本为5个,就绪的副本为5个。

  1. $ kubectl get rollout express-server
  2. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  3. express-server 5 5 5 batchReady rolloutSucceed 2d20h

查看工作负载状态( webservice/worker 的底层工作负载是 Deployment )

  1. $ kubectl get deploy -l app.oam.dev/component=express-server
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. express-server-v1 5/5 5 5 2d20h

灰度升级

应用下面的 YAML 来修改容器的镜像,将工作负载升级到新的组件版本。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. # 设置更新后的组件版本为 express-server-v2
  11. externalRevision: express-server-v2
  12. properties:
  13. image: stefanprodan/podinfo:5.0.2
  14. traits:
  15. - type: rollout
  16. properties:
  17. targetSize: 5
  18. # 只灰度发布第一批次的副本
  19. batchPartition: 0
  20. # 分两批灰度发布
  21. rolloutBatches:
  22. - replicas: 2
  23. - replicas: 3
  24. EOF

该灰度发布运维特征表示,目标副本个数为5个,分两批升级,第一批升级2个副本,第二批升级3个副本,并通过设置 batchPartition 为0来指定只升级第1批的2个副本。

查看组件版本,可见生成了一个新的组件版本 express-server-v2。

  1. $ kubectl get controllerRevision -l controller.oam.dev/component=express-server
  2. NAME CONTROLLER REVISION AGE
  3. express-server-v1 application.core.oam.dev/rollout-trait-test 1 2d22h
  4. express-server-v2 application.core.oam.dev/rollout-trait-test 2 1m

一段时间之后,成功升级第一批次后,查看灰度发布运维特征的状态。 TARGET UPGRADED READY 表示这次升级目标版本的副本5个,已经升级完成了2个,2个已经就绪。 batchReady 状态表示当前的第1批次的副本全部就绪, rollingInBatches 状态表示还未完成全部批次的升级,仍在升级当中。

  1. $ kubectl get rollout express-server
  2. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  3. express-server 5 2 2 batchReady rollingInBatches 2d20h

查看工作负载状态进行验证,可见新版本的工作负载 express-server-v2 已经升级完成2个副本,老版本的工作负载 express-server-v1 尚有3个副本。

  1. $ kubectl get deploy -l app.oam.dev/component=express-server
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. express-server-v1 3/3 3 3 2d20h
  4. express-server-v2 2/2 2 2 1m

应用下面的 YAML 来去掉灰度发布运维特征的 batchPartition 字段来将全部副本升级到最新版本。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. externalRevision: express-server-v2
  11. properties:
  12. image: stefanprodan/podinfo:5.0.2
  13. traits:
  14. - type: rollout
  15. properties:
  16. targetSize: 5
  17. rolloutBatches:
  18. - replicas: 2
  19. - replicas: 3
  20. EOF

查看灰度发布运维特征,可见已经升级成功。

  1. $ kubectl get rollout express-server
  2. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  3. express-server 5 5 5 batchReady rolloutSucceed 2d20h

查看工作负载状态,可见新版本的工作负载已经完成升级,并且老版本的工作负载已经被删除。

  1. $ kubectl get deploy -l app.oam.dev/component=express-server
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. express-server-v2 5/5 5 5 1m

回滚

应用下面的 YAML 来指定灰度发布运维特征的 targetRevision 将组件回滚到 express-server-v1 组件版本。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. externalRevision: express-server-v2
  11. properties:
  12. image: stefanprodan/podinfo:5.0.2
  13. traits:
  14. - type: rollout
  15. properties:
  16. # 设置目标版本为之前的组件版本来进行回滚
  17. targetRevision: express-server-v1
  18. targetSize: 5
  19. rolloutBatches:
  20. - replicas: 2
  21. - replicas: 3
  22. EOF

回滚成功之后查看灰度发布运维特征状态。

  1. $ kubectl get rollout express-server
  2. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  3. express-server 5 5 5 batchReady rolloutSucceed 2d20h

查看工作负载状态,可见工作负载状态回滚到了 express-server-v1 组件版本。

  1. $ kubectl get deploy -l app.oam.dev/component=express-server
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. express-server-v1 5/5 5 5 15s

扩容

灰度发布运维特征还可以完成工作负载的扩容操作,应用下面的 YAML 来修改targetSize,将副本个数由原来的5个增加至7个。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. externalRevision: express-server-v2
  11. properties:
  12. image: stefanprodan/podinfo:5.0.2
  13. traits:
  14. - type: rollout
  15. properties:
  16. targetRevision: express-server-v1
  17. # 扩容至7个副本
  18. targetSize: 7
  19. EOF

这个灰度发布运维特征的表示,从刚才的5个副本个数扩容至目标的7个副本,你也可以通过设置 rolloutBatches 精确控制每个批次需要扩容的副本个数。 请注意,如果你缺省指定发布策略进行连续两次以上扩缩容会有已知的问题,所以建议你在扩缩容的时候填写 rolloutBatches 字段。

扩容成功之后,查看资源状态。

  1. $ kubectl get rollout express-server
  2. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  3. express-server 7 7 7 batchReady rolloutSucceed 2d20h
  4. $ kubectl get deploy -l app.oam.dev/component=express-server
  5. NAME READY UP-TO-DATE AVAILABLE AGE
  6. express-server-v1 7/7 7 7 2m

缩容

应用下面的 YAML 将副本个数由之前的7个缩减至3个

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test
  6. spec:
  7. components:
  8. - name: express-server
  9. type: webservice
  10. externalRevision: express-server-v2
  11. properties:
  12. image: stefanprodan/podinfo:5.0.2
  13. traits:
  14. - type: rollout
  15. properties:
  16. targetRevision: express-server-v1
  17. # 缩容至5个副本。
  18. targetSize: 5
  19. EOF

这个灰度发布运维特征的表示,将工作负载缩容至5个副本,你也可以通过设置 rolloutBatches 精确控制每个批次需要扩容的副本个数。

缩容成功之后,查看资源状态。

  1. $ kubectl get rollout express-server
  2. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  3. express-server 5 5 5 batchReady rolloutSucceed 2d20h
  4. $ kubectl get deploy -l app.oam.dev/component=express-server
  5. NAME READY UP-TO-DATE AVAILABLE AGE
  6. express-server-v1 5/5 5 5 5m

针对 cloneset 类型工作负载的灰度发布

启用 kruise 的扩展插件。

  1. $ vela addon enable kruise

查看组件类型

  1. $ vela components
  2. NAME NAMESPACE WORKLOAD DESCRIPTION
  3. cloneset vela-system clonesets.apps.kruise.io

应用下面的 YAML 来创建一个应用部署计划,该应用包含一个 cloneset 类型的工作负载和一个灰度发布运维特征。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test-cloneset
  6. spec:
  7. components:
  8. - name: cloneset-server
  9. type: cloneset
  10. externalRevision: cloneset-server-v1
  11. properties:
  12. image: stefanprodan/podinfo:4.0.3
  13. traits:
  14. - type: rollout
  15. properties:
  16. targetSize: 5
  17. rolloutBatches:
  18. - replicas: 2
  19. - replicas: 3
  20. EOF

查看相关资源。

  1. $ kubectl get app rollout-trait-test-cloneset
  2. NAME COMPONENT TYPE PHASE HEALTHY STATUS AGE
  3. rollout-trait-test-cloneset cloneset-server clonset running true 4m18s
  4. $ kubectl get controllerRevision -l controller.oam.dev/component=cloneset-server
  5. NAME CONTROLLER REVISION AGE
  6. cloneset-server-v1 application.core.oam.dev/rollout-trait-test-cloneset 1 4m45s
  7. $ kubectl get rollout cloneset-server
  8. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  9. cloneset-server 5 5 5 batchReady rolloutSucceed 5m10s

查看工作负载状态,可以看到由于 cloneset 工作负载支持原地升级,它与 webservice/worker 的最大区别是底层工作负载的名称就是组件名称。

  1. $ kubectl get cloneset -l app.oam.dev/component=cloneset-server
  2. NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE
  3. cloneset-server 5 5 5 5 5 7m3s

查看镜像。

  1. $ kubectl get cloneset cloneset-server -o=jsonpath='{.spec.template.spec.containers[0].image}'
  2. stefanprodan/podinfo:4.0.3

应用下面的 YAML 更新镜像。

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: rollout-trait-test-cloneset
  6. spec:
  7. components:
  8. - name: cloneset-server
  9. type: cloneset
  10. externalRevision: cloneset-server-v2
  11. properties:
  12. image: stefanprodan/podinfo:5.0.2
  13. traits:
  14. - type: rollout
  15. properties:
  16. targetSize: 5
  17. rolloutBatches:
  18. - replicas: 2
  19. - replicas: 3
  20. EOF

升级完成之后,查看相关资源。

  1. $ kubectl get controllerRevision -l controller.oam.dev/component=cloneset-server
  2. NAME CONTROLLER REVISION AGE
  3. cloneset-server-v1 application.core.oam.dev/rollout-trait-test-cloneset 1 6m43s
  4. cloneset-server-v2 application.core.oam.dev/rollout-trait-test-clonesett 2 108s
  5. $ kubectl get rollout cloneset-server
  6. NAME TARGET UPGRADED READY BATCH-STATE ROLLING-STATE AGE
  7. cloneset-server 5 5 5 batchReady rolloutSucceed 6m10s

查看工作负载状态,可见升级之后的工作负载仍是 cloneset-server。

  1. $ kubectl get cloneset -l app.oam.dev/component=cloneset-server
  2. NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE
  3. cloneset-server 5 5 5 5 5 7m3s

进一步通过查看镜像进行验证。

  1. $ kubectl get cloneset cloneset-server -o=jsonpath='{.spec.template.spec.containers[0].image}'
  2. stefanprodan/podinfo:5.0.2

其他的扩缩容,回滚等操作与 webservice/worker 类型的工作负载的操作方式完全一致。

子集群中运行的注意事项

如果你期望灰度发布运维特征工作在子集群中,你需要先在子集群中执行下面的命令安装相应的控制器。

  1. helm install vela-rollout kubevela/vela-rollout --version 1.1.5

支持的组件类型

灰度发布运维特征支持 webserviceworkerclonset 类型的工作负载。

当使用 webservice 和 worker 作为工作负载类型并配合使用灰度发布运维特征时,工作负载的名称将被命名为组件版本的名称。 当工作负载类型为 cloneset 时,由于 clonset 支持原地更新,工作负载的名称将被命名为组件的名称。