這篇文章是官網上 Kosko 1.0 Released 的中文翻譯版。關於 Kosko 本身,除了官網,也可以參考這篇文章。
自從上一個穩定版本 v0.9 已經過了好一段時間了。最近我決定開始實作工作上一直都想用的一些功能,希望這些功能也能幫助到你。
Nested Manifests
從 v1.0 開始,component 內的 array 和 function 會被展開,這功能對於在不同 component 之間共用 manifest 會很有用。
舉例來說,通常在 Kubernetes 裡,資料庫會由一個 Deployment
和一個 Service
組成。如果要在 component 裡使用資料庫的話,在 v1.0 之前,必須要自行展開這兩個 manifest;在 v1.0 之後,就能自動展開了。
這樣的話,就可以把資料庫當成單一資源,在 component 到處使用了。
function createDatabase() {
return [new Deployment(), new Service()];
}
// v1.0 之前
module.exports = [new Deployment(), ...createDatabase()];
// v1.0 之後
module.exports = [new Deployment(), createDatabase()];
ValidationError
包含更詳細的資訊
在 v1.0 之前,ValidationError
只包含 path
和 index
,有時可能會難以定位問題;在 v1.0 之後,ValidationError
加上了 apiVersion
、kind
、namespace
和 name
。以下是新的錯誤訊息的範例。
ValidationError: data.metadata.annotations['dependencies'] should be string
- path: ".../components/config-api"
- index: [0]
- kind: "apps/v1/Deployment"
- name: "config-api"
at resolveComponent (.../node_modules/@kosko/generate/src/generate.ts:81:15)
at resolveComponent (.../node_modules/@kosko/generate/src/generate.ts:59:28)
at Object.generate (.../node_modules/@kosko/generate/src/generate.ts:134:30)
at generateHandler (.../node_modules/@kosko/cli/src/commands/generate/index.ts:156:18)
at handler (.../node_modules/@kosko/cli/src/commands/generate/index.ts:200:20)
at Object.run (.../node_modules/@kosko/cli/src/index.ts:12:3)
載入 Kubernetes YAML
如果你過去已經使用 Kubernetes 一陣子的話,可能會像我一樣有一堆 Kubernetes 的 YAML 檔。現在你不需要把這些 YAML 改寫成 JavaScript 了,可以試用看看新的 package @kosko/yaml
。
@kosko/yaml
會讀取 YAML 檔案,並建立對應的 kubernetes-models class,所以你的 manifest 就能使用 Kubernetes OpenAPI schema 來驗證。
const { loadFile } = require("@kosko/yaml");
module.exports = loadFile("manifest.yaml");
這個功能有 “nested manifests” 的支援才會更完善,所以別忘了先更新到 Kosko v1.0 喔。
更多資訊請參考文件。
Breaking Changes
- 放棄支援 Node.js 8。
@kosko/generate
Manifest.index
和ValidationError.index
的型別由number
改為number[]
。Manifest.data
的型別由any
改為unknown
。
後記
這段只會寫在這邊,不會放在原文上。
我在實作完上述的功能之後,又花了一點時間稍微改了下文件,原本有些只放在 examples
資料夾裡的東西,現在也放到文件裡了,所以整體來說應該會變得更易讀。我之後應該會再花一點時間來研究如何基於 @kosko/yaml
來實作 Helm 的支援。