這篇文章是官網上 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 只包含 pathindex,有時可能會難以定位問題;在 v1.0 之後,ValidationError 加上了 apiVersionkindnamespacename。以下是新的錯誤訊息的範例。

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.indexValidationError.index 的型別由 number 改為 number[]
    • Manifest.data 的型別由 any 改為 unknown

後記

這段只會寫在這邊,不會放在原文上。

我在實作完上述的功能之後,又花了一點時間稍微改了下文件,原本有些只放在 examples 資料夾裡的東西,現在也放到文件裡了,所以整體來說應該會變得更易讀。我之後應該會再花一點時間來研究如何基於 @kosko/yaml 來實作 Helm 的支援。