一键创建/销毁环境

    本章将介绍如何使用 KubeVela 在交付应用时对环境进行快速初始化和销毁。

    一个应用开发团队通常需要做一些初始化工作来满足应用部署时方方面面的需要,即“初始化环境”。 这里的环境是一个逻辑概念,既可以表示应用部署时依赖的公共资源,也可以表示应用运行必要的准备工作。

    KubeVela 可以使用 Application 对象做环境的初始化,可以初始化的资源类型包括但不限于下列类型:

    1. 一个或多个 Kubernetes 集群,不同的环境可能需要不同规模和不同版本的 Kubernetes 集群。同时环境初始化还可以将多个 Kubernetes 集群注册到一个中央集群进行统一的多集群管控。

    2. 任意类型的 Kubernetes 自定义资源(CRD)和系统插件,一个环境会拥有很多种不同的自定义资源来提供系统能力,比如不同的工作负载、不同的运维管理功能等等。初始化环境可以包含环境所依赖的一系列功能的初始化安装,比如各类中间件工作负载、流量管理、日志监控等各类运维系统。

    3. 各类共享资源和服务,一个微服务在不同环境中测试验证时,除了自身所开发的组件以外,往往还会包含一系列其他团队维护的组件和一些公共资源。环境初始化功能可以将其他组件和公共资源统一部署,在无需使用时销毁。这些共享资源可以是一个微服务组件、云数据库、缓存、负载均衡、API网关等等。

    4. 各类管理策略和流程,一个环境可能会配备不同的全局策略和流程,举例来说,环境策略可能会包括混沌测试、安全扫描、错误配置检测、SLO指标等等;而流程则可以是初始化一个数据库表、注册一个自动发现配置等。

    不仅如此,KubeVela 的环境初始化能力还可以跟工作流、策略、依赖等功能相结合,做不同环境的差异化部署,依赖管理等。

    若不同环境初始化存在依赖关系,可以初始化的公共资源分离出一个单独的 Application 作为依赖,这样可以形成可以被复用的初始化模块。 例如,测试环境和开发环境都依赖了一些相同的控制器,可以将这些控制器提取出来作为单独的环境初始化,在开发环境和测试环境中都指定依赖该环境初始化。

    如果我们希望在环境中使用一个自定义 CRD 控制器(如 OpenKruise),那么,我们可以使用 Helm 组件初始化 kruise。

    我们可以直接使用 KubeVela 的应用部署计划来初始化 kruise 的环境,该应用会帮你在集群中部署一个 OpenKruise 的控制器,给集群提供 kruise 的各种能力。

    由于我们使用 Helm 组件完成 kruise 的部署,我们首先要在集群中使用 开启 helm 功能。 当环境初始化具备多个模块时,可以对初始化的内容进行拆分,同时使用工作流的 步骤,描述不同初始化模块的依赖关系。 比如我们可以在这个例子里,使用 depends-on-app 表示环境初始化 kruise 依赖环境初始化 addon-fluxcd 提供的能力。同时,使用 apply-once 策略来确保资源只会部署一次来完成初始化。

    部署如下文件:

    查看集群中应用的状态:

    1. vela status kruise -n vela-system

    期望输出

    1. About:
    2. Name: kruise
    3. Namespace: vela-system
    4. Created at: 2022-10-31 18:10:27 +0800 CST
    5. Status: running
    6. Workflow:
    7. mode: StepByStep-DAG
    8. finished: true
    9. Suspend: false
    10. Terminated: false
    11. Steps
    12. - id: l6apfsi5c2
    13. name: check-flux
    14. type: depends-on-app
    15. phase: succeeded
    16. - id: p2nqell47w
    17. name: apply-kruise
    18. type: apply-component
    19. Services:
    20. - Name: kruise
    21. Cluster: local Namespace: vela-system
    22. Type: helm
    23. Healthy Fetch repository successfully, Create helm release successfully
    24. No trait applied

    kruise 已经成功运行!之后,你可以在环境中使用 kruise 的能力。如果需要配置新的环境初始化,也只需要类似的定义一个部署计划。

    在环境中,一些通用的 ConfigMap / PVC 等资源是十分常用的。 如果你希望在部署应用前内置一些通用资源,可以在应用部署中加入初始化的工作流来完成。

    部署如下应用,初始化一个带有 ConfigMap / PVC 的环境。同时,部署两个组件,第一个组件会不断向 PVC 中写入数据,第二个组件会读取 PVC 中的数据:

    查看集群中的 PVC 以及 ConfigMap:

    1. vela status server-with-pvc-and-cm --detail --tree

    期望输出

    1. CLUSTER NAMESPACE RESOURCE STATUS APPLY_TIME DETAIL
    2. local ─── default ─┬─ ConfigMap/my-cm updated 2022-10-31 18:00:52 Data: 1 Age: 57s
    3. ├─ PersistentVolumeClaim/my-claim updated 2022-10-31 10:00:52 Status: Bound Volume: pvc-b6f88ada-af98-468d-8cdd-31ca110c5e1a Capacity: 8Gi Access Modes: RWO StorageClass: standard Age: 57s
    4. ├─ Deployment/log-gen-worker updated 2022-10-31 10:00:52 Ready: 1/1 Up-to-date: 1 Available: 1 Age: 57s
    5. └─ Deployment/log-read-worker updated 2022-10-31 10:00:52 Ready: 1/1 Up-to-date: 1 Available: 1 Age: 57s

    查看集群中应用的状态:

    期望输出

    1. $ vela status server-with-pvc-and-cm
    2. About:
    3. Name: server-with-pvc-and-cm
    4. Namespace: default
    5. Created at: 2022-10-31 18:00:51 +0800 CST
    6. Status: running
    7. Workflow:
    8. mode: StepByStep-DAG
    9. finished: true
    10. Suspend: false
    11. - id: xboizfjo28
    12. name: apply-pvc
    13. type: apply-object
    14. phase: succeeded
    15. - id: 4ngx25mrx8
    16. name: apply-cm
    17. type: apply-object
    18. phase: succeeded
    19. - id: 1gzzt3mfw1
    20. name: deploy-comp
    21. type: deploy
    22. phase: succeeded
    23. Services:
    24. - Name: log-gen-worker
    25. Cluster: local Namespace: default
    26. Type: worker
    27. Healthy Ready:1/1
    28. No trait applied
    29. - Name: log-read-worker
    30. Cluster: local Namespace: default
    31. Type: worker
    32. Healthy Ready:1/1
    33. No trait applied

    检查第二个组件的日志输出:

    1. vela logs server-with-pvc-and-cm --component log-read-worker

    期望输出

    可以看到,应用中的两个组件均已正常运行。同时,这两个组件共享同一个 PVC,并使用相同的 ConfigMap 进行配置。

    因为我们已经通过应用(Application)这个统一的模型做了环境初始化,所以销毁环境变得非常简单,只需要删除这个应用即可。