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 自身的语法有一些其他配置格式里不常见的坑:缩进是有意义的,制表符和空格混用有时不会报错,而是悄悄产生另一种(错误的)结构;在包含多个资源的长文件里,`---` 文档分隔符很容易被忽略;多出的一层嵌套读起来仍是合法的 YAML,对 Kubernetes 来说却完全是另一个意思。本工具采用能在解析过程中保留完整源码位置信息的同类解析库,因此语法问题会指向它真正出现的那一行,而不是只告诉你“这个 200 行的文件里某处有问题”。
已弃用的 apiVersion 是一个发作更慢的陷阱:`extensions/v1beta1` 的 Deployment、`apps/v1beta1`/`apps/v1beta2` 的 StatefulSet 和 DaemonSet,以及 `networking.k8s.io/v1beta1` 的 Ingress,作为 YAML 解析起来都完全合法,在旧集群上甚至也能正常运行——直到集群升级到 Kubernetes 最终彻底移除旧 API 组的那个版本,所有使用它的清单就会毫无预警地开始 apply 失败。在编辑时就发现这些问题(并给出确切的替换 apiVersion),可以避免在集群升级时才发现。
对照真实 Kubernetes OpenAPI 规范的 Schema 校验则能抓出其余的错误:`replicas` 字段被写成了带引号的字符串而不是数字,`containerPort` 超出有效范围,或是在清单之间复制粘贴时误删了 Deployment 必需的 `spec.selector` 字段。这些都不是 YAML 语法错误——文件本身能正常解析——这正是专门做一遍 Schema 校验能发现的、而快速浏览文件时往往看不出的问题。
常见问题
它能取代 `kubectl apply --dry-run` 或 `kubeconform` 吗?
不能。`kubectl apply --dry-run=server` 是唯一一种针对你实际集群 API 服务器(包括其中安装的 CRD 和准入 Webhook)运行的检查,而 `kubeconform`/`kubeval` 是为 CI 流水线打造的成熟命令行工具。本工具校验的是同一类内容——YAML 语法、Schema 结构、已弃用的 apiVersion——只是在浏览器标签页里完成,适用于你还没在任何环境配置 `kubectl`,或者正在审阅别人发来的清单时。
Schema 来自哪里?
来自 `yannh/kubernetes-json-schema`,这是一个由社区维护、自动更新的镜像,其内容源自 Kubernetes 官方 OpenAPI 生成的 JSON Schema,会根据你选择的 Kubernetes 版本从公共 CDN 按需获取。你的清单内容不会被发送到任何地方——下载的只是带版本号的公开 Schema 文件本身,所有校验同一类型/版本的用户下载的都是同一个文件。
为什么只支持 10 种资源类型?
Deployment、Service、Ingress、ConfigMap、Secret、StatefulSet、DaemonSet、Job、CronJob 和 PersistentVolumeClaim 涵盖了绝大多数手写清单。其他类型同样会进行完整的 YAML 语法检查和已弃用 apiVersion 检测——只是暂时还没有 Schema 结构校验。
我的 YAML 会离开浏览器吗?
不会。解析和 Schema 校验都用纯 JavaScript 在本标签页中运行——本工具唯一发出的网络请求,就是获取你所选资源类型和 Kubernetes 版本对应的公开 JSON Schema 文件,绝不会涉及你的清单内容。