Pulumi 項目組織實踐
## 背景
Iac 領(lǐng)域,terraform 應(yīng)用比較廣,之前公司主要也是使用 kubevela 來進行整個平臺組件的架構(gòu)部署。
在使用過程中,kubevela 本身的弊端也顯而易見。
1. kubevela 本身不支持模板,為了支持不同的測試、預(yù)發(fā)布、生產(chǎn)環(huán)境的配置,或者其他需要動態(tài)化配置,則需要在 kubevela 之上再封裝一層模板解析過程代碼,增加了整體維護復(fù)雜性。
2. 在一些全局功能中,比如日志收集 sidecar 注入或者 Prometheus 數(shù)據(jù)接入等通用功能,依賴平臺對 kubevela 的擴展能力,即 workload type 和 traits 的自定義支持,從而增加了對底層平臺開發(fā)人員的依賴,影響 app 開發(fā)集成效率。
基于這兩點考慮,我們調(diào)研了 Pulumi 對此類問題的解決方案。
1. Pulumi 使用 golang 等通用編程語言來管理整個 app 的部署生命周期,并且使用 stack 來管理不同的測試、預(yù)發(fā)布、生產(chǎn)環(huán)境的配置,增加了整個架構(gòu)部署平臺的代碼復(fù)用能力。
2. Pulumi 在構(gòu)建整個架構(gòu)代碼時,每個 app 都是獨立的 pulumi project,用戶直接使用 Pulumi api 來操作,并不需要依賴底層架構(gòu)開發(fā)人員的支持,減少了溝通成本,增加了 app 開發(fā)部署效率。
## 目標(biāo)
基于目前公司的業(yè)務(wù),我們對底層基礎(chǔ)架構(gòu)平臺有兩點基本要求,后續(xù)所有問題解決方案參考該基本要求來確認邊界。
1. app 的增加集成要方便開發(fā)人員測試,開發(fā)人員可以使用 pulumi 相關(guān)原生命令來測試整個 app 的創(chuàng)建、更新、刪除等等流程管理,而不需要其他外部資源支持。
2. 對于整體基礎(chǔ)架構(gòu)的發(fā)布,要方便平臺發(fā)布人員操作使用,平臺發(fā)布人員不需要對基礎(chǔ)架構(gòu)代碼進行任何修改,完成一鍵發(fā)布、更新等操作,對于每次發(fā)布,需要生成相關(guān)的發(fā)布 preview ,方便和開發(fā)人員來確認發(fā)布計劃是否存在偏差。
## Pulumi 項目結(jié)構(gòu)規(guī)劃
確認了目標(biāo)之后,我們確定 pulumi-apps 的項目結(jié)構(gòu)需要圍繞這兩個目標(biāo)來構(gòu)建。
由于Pulumi stack機制的限制,如果兩個project都公用相同的stack名稱時,操作一個project會刪除掉另外一個project,主要原因還是pulumi后臺stack管理的BUG,官方有相關(guān)討論,暫時還未修復(fù),參見Issues:
https://github.com/pulumi/pulumi/issues/8402
在基于此情況下,我們在automation中管理各個apps的安裝,刪除和與發(fā)布操作時,每個app都使用其app名稱+dev/prod/test后綴來命名每個app project對應(yīng)的stack名稱,整個automation使用Pulumi automation API實現(xiàn),參見文檔:
https://www.pulumi.com/docs/guides/automation-api/getting-started-automation-api/
整體結(jié)構(gòu)如下所示:
```code
|____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
```
該結(jié)構(gòu)有以下幾個特點:
1、automation目錄是給平臺升級維護人員使用,可以管理所有apps。
2、apps目錄主要是給app開發(fā)人員使用,開發(fā)人員添加一個新的app,只需要使用pulumi new命令來操作生成即可,并且,不限制pulumi app project的開發(fā)語言,開發(fā)人員可以根據(jù)自己喜好來選擇app開發(fā)語言。
## 后續(xù)更新
1、后續(xù)會在automation目錄下提煉出整個系統(tǒng)的全局變量維護和底層服務(wù)(promethues/logging)統(tǒng)一接入維護。
2、會利用automation不同的stack來維護整體對應(yīng)不同集群配置。
3、automation功能會識別pulumi up/destroy/preview等命令,來達到pulumi原生命令的統(tǒng)一支持。