应用版本管理

简介

overall-arch

在 KubeVela 中,ApplicationRevision 保持了应用在发布时刻的快照,包括所有 Application 的配置以及依赖的外部项(如组件定义、外置策略或是引用对象)。 这个版本可以用来比对应用的变化,并在应用的发布出故障时进行回滚。

在 KubeVela v1.3 中,对于使用 PublishVersion 特性的应用,支持浏览历史版本、跨版本配置比对、版本回滚以及版本重新发布。

对于带有 app.oam.dev/publishVersion annotation 的应用,工作流的运行会被严格限制在版本快照的范围内。 这个 annotation(在下文中简称为 publishVersion),可被用来代表应用的一个静态版本快照。

当这个 annotation 被更新时,应用会为当前的配置和依赖项生成一个静态版本,然后针对这个静态版本触发相应的工作流从头开始运行,已有的工作流会被中止。

在工作流运行的过程中,所有相关数据都会从版本快照中取出,这代表着直到应用的 publishVersion 被更新为止,应用配置或依赖项的变化都不会生效。

使用指南

我们以一个带有外置工作流和策略的应用为例,该应用将会将 podinfo 服务部署在子集群中。

对于外置工作流和策略,请参考 多集群应用交付 以获取更多信息。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: podinfo
  5. namespace: examples
  6. annotations:
  7. app.oam.dev/publishVersion: alpha1
  8. spec:
  9. components:
  10. - name: podinfo
  11. type: webservice
  12. properties:
  13. image: stefanprodan/podinfo:6.0.1
  14. workflow:
  15. ref: make-release-in-hangzhou
  16. ---
  17. apiVersion: core.oam.dev/v1alpha1
  18. kind: Policy
  19. metadata:
  20. name: override-high-availability
  21. namespace: examples
  22. type: override
  23. properties:
  24. components:
  25. - type: webservice
  26. traits:
  27. - type: scaler
  28. properties:
  29. replicas: 3
  30. ---
  31. apiVersion: core.oam.dev/v1alpha1
  32. kind: Policy
  33. metadata:
  34. name: topology-hangzhou-clusters
  35. namespace: examples
  36. type: topology
  37. properties:
  38. clusterLabelSelector:
  39. region: hangzhou
  40. ---
  41. apiVersion: core.oam.dev/v1alpha1
  42. kind: Workflow
  43. metadata:
  44. name: make-release-in-hangzhou
  45. namespace: examples
  46. steps:
  47. - name: deploy-hangzhou
  48. type: deploy
  49. properties:
  50. policies: ["topology-hangzhou-clusters", "override-high-availability"]

你可以运行 vela status podinfo -n examples 来查看应用的部署状态,也可以运行 vela status podinfo -n examples --tree --detail 来查看所有相关资源的实时状态。

  1. $ vela status podinfo -n examples
  2. vela status podinfo -n examples
  3. About:
  4. Name: podinfo
  5. Namespace: examples
  6. Created at: 2022-04-13 19:32:02 +0800 CST
  7. Status: runningWorkflow
  8. Workflow:
  9. mode: DAG
  10. finished: false
  11. Suspend: false
  12. Terminated: false
  13. Steps
  14. - id:auqaxnbix2
  15. name:deploy-hangzhou
  16. type:deploy
  17. phase:running
  18. message:wait healthy
  19. Services:
  20. - Name: podinfo
  21. Cluster: velad-003 Namespace: examples
  22. Type: webservice
  23. Unhealthy Ready:0/3
  24. Traits:
  25. scaler
  26. - Name: podinfo
  27. Cluster: velad-002 Namespace: examples
  28. Type: webservice
  29. Unhealthy Ready:0/3
  30. Traits:
  31. scaler
  32. $ vela status podinfo -n examples --tree --detail
  33. CLUSTER NAMESPACE RESOURCE STATUS APPLY_TIME DETAIL
  34. hangzhou1 ─── examples ─── Deployment/podinfo updated 2022-04-13 19:32:03 Ready: 3/3 Up-to-date: 3 Available: 3 Age: 4m16s
  35. hangzhou2 ─── examples ─── Deployment/podinfo updated 2022-04-13 19:32:03 Ready: 3/3 Up-to-date: 3 Available: 3 Age: 4m16s

这个应用会在一段时间后进入正常运行的状态。 现在我们修改组件的镜像,并把它设置成一个不合法的镜像,如 stefanprodan/podinfo:6.0.xxx。 因为 publishVersion 的存在,这个应用不会自动地重新运行工作流。 但由于应用的配置发生了变化,这意味着下一次工作流的运行会更新部署的 Deployment 的镜像。

查看版本变化

现在,应用正在运行的版本和当前环境中应用的配置(也就是下一次要运行的配置)产生了差异,我们可以运行 vela live-diff podinfo -n examples 来查看这一变化。

  1. $ vela live-diff podinfo -n examples
  2. * Application (podinfo) has been modified(*)
  3. apiVersion: core.oam.dev/v1beta1
  4. kind: Application
  5. metadata:
  6. annotations:
  7. app.oam.dev/publishVersion: alpha1
  8. name: podinfo
  9. namespace: examples
  10. spec:
  11. components:
  12. - name: podinfo
  13. properties:
  14. - image: stefanprodan/podinfo:6.0.1
  15. + image: stefanprodan/podinfo:6.0.xxx
  16. type: webservice
  17. workflow:
  18. ref: make-release-in-hangzhou
  19. status: {}
  20. * External Policy (topology-hangzhou-clusters) has no change
  21. * External Policy (override-high-availability) has no change
  22. * External Workflow (make-release-in-hangzhou) has no change

我们可以看到所有关于应用配置以及依赖项的变化。 现在我们来更新一下应用的版本。 有两种方式可以更新应用版本,你可以任选其一。

  1. 更新应用中的 publishVersion annotation 到 alpha2 来触发工作流的重新运行。
  2. 运行 vela up podinfo -n examples --publish-version alpha2 来发布新版本。

我们会发现,由于 Deployment 的镜像不合法,应用卡在了 runningWorkflow 状态。

现在我们可以运行 vela revision list podinfo -n examples 来列出所有可用的版本。

  1. $ vela revision list podinfo -n examples
  2. NAME PUBLISH_VERSION SUCCEEDED HASH BEGIN_TIME STATUS SIZE
  3. podinfo-v1 alpha1 true 65844934c2d07288 2022-04-13 19:32:02 Succeeded 23.7 KiB
  4. podinfo-v2 alpha2 false 44124fb1a5146a4d 2022-04-13 19:46:50 Executing 23.7 KiB

回滚到最近成功的版本

在回滚应用之前,我们需要先停下应用工作流。运行 vela workflow suspend podinfo -n examples。 在应用的工作流被暂停后,运行 vela workflow rollback podinfo -n examples,工作流会被撤销,同时应用会恢复到最近一次的成功状态。

  1. $ vela workflow suspend podinfo -n examples
  2. Successfully suspend workflow: podinfo
  3. $ vela workflow rollback podinfo -n examples
  4. Find succeeded application revision podinfo-v1 (PublishVersion: alpha1) to rollback.
  5. Application spec rollback successfully.
  6. Application status rollback successfully.
  7. Application rollback completed.
  8. Application outdated revision cleaned up.

现在我们可以看到所有的资源都已经被恢复到了原有的镜像状态。

  1. $ vela status podinfo -n examples --tree --detail --detail-format wide
  2. CLUSTER NAMESPACE RESOURCE STATUS APPLY_TIME DETAIL
  3. hangzhou1 ─── examples ─── Deployment/podinfo updated 2022-04-13 19:32:03 Ready: 3/3 Up-to-date: 3 Available: 3 Age: 17m Containers: podinfo Images: stefanprodan/podinfo:6.0.1 Selector: app.oam.dev/component=podinfo
  4. hangzhou2 ─── examples ─── Deployment/podinfo updated 2022-04-13 19:32:03 Ready: 3/3 Up-to-date: 3 Available: 3 Age: 17m Containers: podinfo Images: stefanprodan/podinfo:6.0.1 Selector: app.oam.dev/component=podinfo

重新发布历史版本

这个功能在 KubeVela v1.3.1 之后被引入。

版本回滚可以让你直接回退到上一次成功的状态。另一种方式是重新发布一个旧版本,这种方式的区别在于它可以回退到任一可用的历史版本中(不只是最近成功的),但是会触发工作流的重新运行。

例如,你可能保存了多个历史版本可供恢复

  1. $ vela revision list podinfo -n examples
  2. NAME PUBLISH_VERSION SUCCEEDED HASH BEGIN_TIME STATUS SIZE
  3. podinfo-v1 alpha1 true 65844934c2d07288 2022-04-13 20:45:19 Succeeded 23.7 KiB
  4. podinfo-v2 alpha2 true 4acae1a66013283 2022-04-13 20:45:45 Succeeded 23.7 KiB
  5. podinfo-v3 alpha3 false 44124fb1a5146a4d 2022-04-13 20:46:28 Executing 23.7 KiB

这种情况下,你可以使用 vela up podinfo -n examples --revision podinfo-v1 --publish-version beta1 来重新发布最早的版本。这个过程会让应用使用过去的历史版本来重跑整个工作流。新的版本会和声明使用的历史版本完全一致。

  1. NAME PUBLISH_VERSION SUCCEEDED HASH BEGIN_TIME STATUS SIZE
  2. podinfo-v1 alpha1 true 65844934c2d07288 2022-04-13 20:45:19 Succeeded 23.7 KiB
  3. podinfo-v2 alpha2 true 4acae1a66013283 2022-04-13 20:45:45 Succeeded 23.7 KiB
  4. podinfo-v3 alpha3 false 44124fb1a5146a4d 2022-04-13 20:46:28 Failed 23.7 KiB
  5. podinfo-v4 beta1 true 65844934c2d07288 2022-04-13 20:46:49 Succeeded 23.7 KiB

你会发现 beta1 版本和 alpha1 版本的哈希值完全一致。

默认情况下,应用最多能持有 10 个历史版本。如果你想要修改这个数字,可以在控制器启动参数中设置 --application-revision-limit