如何使用 Pulumi 构建云平台 Apps 项目

zerix

zerix

Posted on January 11, 2023

如何使用 Pulumi 构建云平台 Apps 项目

背景

Iac 领域,terraform 应用比较广,之前公司主要也是使用 kubevela 来进行整个平台组件的架构部署。
在使用过程中,kubevela 本身的弊端也显而易见。

  1. kubevela 本身不支持模板,为了支持不同的测试、预发布、生产环境的配置,或者其他需要动态化配置,则需要在 kubevela 之上再封装一层模板解析过程代码,增加了整体维护复杂性。
  2. 在一些全局功能中,比如日志收集 sidecar 注入或者 Prometheus 数据接入等通用功能,依赖平台对 kubevela 的扩展能力,即 workload type 和 traits 的自定义支持,从而增加了对底层平台开发人员的依赖,影响 app 开发集成效率。

基于这两点考虑,我们调研了 Pulumi 对此类问题的解决方案。

  1. Pulumi 使用 golang 等通用编程语言来管理整个 app 的部署生命周期,并且使用 stack 来管理不同的测试、预发布、生产环境的配置,增加了整个架构部署平台的代码复用能力。
  2. Pulumi 在构建整个架构代码时,每个 app 都是独立的 pulumi project,用户直接使用 Pulumi api 来操作,并不需要依赖底层架构开发人员的支持,减少了沟通成本,增加了 app 开发部署效率。

目标

基于目前公司的业务,我们对底层基础架构平台有两点基本要求,后续所有问题解决方案参考该基本要求来确认边界。

  1. app 的增加集成要方便开发人员测试,开发人员可以使用 pulumi 相关原生命令来测试整个 app 的创建、更新、删除等等流程管理,而不需要其他外部资源支持。
  2. 对于整体基础架构的发布,要方便平台发布人员操作使用,平台发布人员不需要对基础架构代码进行任何修改,完成一键发布、更新等操作,对于每次发布,需要生成相关的发布 preview ,方便和开发人员来确认发布计划是否存在偏差。
  3. 所有 app 的管理统一集中管理,方便运维开发人员进行整体平台创建。

Pulumi 项目结构规划

确认了目标之后,我们确定 pulumi-apps 的项目结构需要围绕这两个目标来构建。
由于Pulumi stack机制的限制,如果两个project都公用相同的stack名称时,操作一个project会删除掉另外一个project,主要原因还是pulumi后台stack管理的BUG,官方有相关讨论,暂时还未修复,参见Issues:
https://github.com/pulumi/pulumi/issues/8402
在基于此情况下,我们在automation中管理各个apps的安装,删除和与发布操作时,每个app都使用其app名称+dev/prod/test后缀来命名每个app project对应的stack名称,整个automation使用Pulumi automation API实现,参见文档:
https://www.pulumi.com/docs/guides/automation-api/getting-started-automation-api/
整体结构如下所示:

|____automation
|        |______main.go
|        |______go.mod
|        |______go.sum
|        |______Pulumi.Yaml
|        |______utils
|____apps
      |______minio.app
      |         |______main.go
      |         |______go.mod
      |         |______go.sum
      |         |______Pulumi.Yaml
      |         |______Pulumi.minio.app.dev.Yaml
      |_______volcano.app
      |         |______main.go
      |         |______go.mod
      |         |______go.sum
      |         |______Pulumi.Yaml
      |         |______Pulumi.volcano.app.dev.Yaml
      |________x.app
      |________y.app
Enter fullscreen mode Exit fullscreen mode

该结构有以下几个特点:
1、automation目录是给平台升级维护人员使用,可以管理所有apps。
2、apps目录主要是给app开发人员使用,开发人员添加一个新的app,只需要使用pulumi new命令来操作生成即可,并且,不限制pulumi app project的开发语言,开发人员可以根据自己喜好来选择app开发语言。

后续更新

1、后续会在automation目录下提炼出整个系统的全局变量维护和底层服务(promethues/logging)统一接入维护。
2、会利用automation不同的stack来维护整体对应不同集群配置。
3、automation功能会识别pulumi up/destroy/preview等命令,来达到pulumi原生命令的统一支持。
4、可以再封装一层使用户不关注 pulumi api。

💖 💪 🙅 🚩
zerix
zerix

Posted on January 11, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related