应用版本管理

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

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

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

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

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

    使用指南

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

    你可以运行 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. Steps
    13. - id:auqaxnbix2
    14. name:deploy-hangzhou
    15. phase:running
    16. message:wait healthy
    17. Services:
    18. - Name: podinfo
    19. Cluster: velad-003 Namespace: examples
    20. Type: webservice
    21. Unhealthy Ready:0/3
    22. Traits:
    23. scaler
    24. - Name: podinfo
    25. Cluster: velad-002 Namespace: examples
    26. Type: webservice
    27. Unhealthy Ready:0/3
    28. scaler
    29. $ vela status podinfo -n examples --tree --detail
    30. CLUSTER NAMESPACE RESOURCE STATUS APPLY_TIME DETAIL
    31. hangzhou1 ─── examples ─── Deployment/podinfo updated 2022-04-13 19:32:03 Ready: 3/3 Up-to-date: 3 Available: 3 Age: 4m16s
    32. hangzhou2 ─── examples ─── Deployment/podinfo updated 2022-04-13 19:32:03 Ready: 3/3 Up-to-date: 3 Available: 3 Age: 4m16s

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

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

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

    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

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

    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

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

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

    这种情况下,你可以使用 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

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