Kubernetes YAML驗證工具
貼上一個或多個 Kubernetes 清單(用 --- 分隔),在 kubectl apply 之前對照真實 schema 進行驗證。
將 .yaml/.yml 檔案拖放到這裡,或在上方貼上清單文字。
用 "---" 分隔的多個清單會作為獨立文件分別驗證。
進階選項
解析與驗證都在你的瀏覽器內完成 —— 從公開 CDN 取得的只有資源 schema,絕不會是你的清單內容。
請在上方貼上 Kubernetes 資源清單(或載入範例),驗證結果就會顯示在這裡。
在 kubectl 之前先抓出 Kubernetes 資源清單的錯誤
`kubectl apply` 被拒絕,往往是你第一次發現 Kubernetes 資源清單有錯誤的時候,而這時你通常正在部署途中,盯著一則引用 JSON Schema 驗證路徑的錯誤訊息(`spec.template.spec.containers[0].image: Required value`),卻很難對應回你剛剛編輯的那份 YAML 檔案。如果能更早發現同一類錯誤,並把確切的那一行標示出來,原本得切換情境處理的麻煩,就變成五秒鐘的小修正。
YAML 本身的語法有許多在其他設定檔格式中不常見的陷阱:縮排有意義,在某些情況下 Tab 與空格混用不會報錯,而是默默產生另一個(錯誤的)結構;`---` 文件分隔線在很長的多資源檔案中很容易看漏;多縮排一層在 YAML 中仍是合法的,但對 Kubernetes 來說意思完全不同。本工具採用能在解析過程中保留完整原始碼位置資訊的函式庫來解析,因此語法問題會回報在實際發生的那一行,而不只是告訴你「這份 200 行的檔案裡某個地方有錯」。
已棄用的 apiVersion 則是一種慢動作陷阱:`extensions/v1beta1` 的 Deployment、`apps/v1beta1`/`apps/v1beta2` 的 StatefulSet 與 DaemonSet,以及 `networking.k8s.io/v1beta1` 的 Ingress,全都仍是完全合法的 YAML,在舊叢集上也能運作,直到叢集升級到 Kubernetes 徹底移除舊 API 群組的版本,所有使用它們的資源清單就會在沒有任何預警下無法套用。在編輯階段就發現這些問題(並附上建議的新 apiVersion),就能避免在叢集升級時才措手不及。
依據真正的 Kubernetes OpenAPI 規格進行 Schema 驗證,則能抓出其餘的問題:被加上引號變成字串的 `replicas` 欄位、超出有效範圍的 `containerPort`、在資源清單之間複製貼上時不小心刪掉的 Deployment 必要欄位(例如 `spec.selector`)。這些都不是 YAML 語法錯誤,檔案本身可以正常解析,這也正是專門的 Schema 檢查能找出肉眼快速瀏覽通常看不出來的問題的原因。
常見問題
這個工具可以取代 `kubectl apply --dry-run` 或 `kubeconform` 嗎?
不行。`kubectl apply --dry-run=server` 是唯一會對你實際叢集的 API 伺服器(包含已安裝的 CRD 與 admission webhook)進行檢查的方式,而 `kubeconform`/`kubeval` 則是專為 CI 流程打造、已相當成熟的命令列工具。本工具檢查的是同一類問題,包括 YAML 語法、Schema 結構與已棄用的 apiVersion,只是在瀏覽器分頁中就能進行,適合在你還沒設定好 `kubectl`,或正在審閱別人傳來的資源清單時使用。
Schema 是從哪裡來的?
來自 `yannh/kubernetes-json-schema`,這是社群維護、自動更新的 Kubernetes 官方 OpenAPI 衍生 JSON Schema 鏡像,會依你選擇的 Kubernetes 版本,從公開 CDN 依需求取得。你的資源清單內容不會被傳送到任何地方,只會下載(有版本、公開的)Schema 檔案本身,驗證同一種 kind/版本的所有使用者下載的都是同一個檔案。
為什麼只有 10 種資源類型?
Deployment、Service、Ingress、ConfigMap、Secret、StatefulSet、DaemonSet、Job、CronJob 與 PersistentVolumeClaim 涵蓋了絕大多數手寫的資源清單。其他類型仍然可以進行完整的 YAML 語法檢查與已棄用 apiVersion 偵測,只是目前還沒有 Schema 結構驗證。
我的 YAML 會離開瀏覽器嗎?
不會。解析與 Schema 驗證都在這個分頁中以純 JavaScript 執行。本工具唯一會發出的網路請求,是取得你所選資源類型與 Kubernetes 版本的公開 JSON Schema 檔案,絕不會傳送你的資源清單內容。