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