3. values.schema.json 入门:JSON Schema 标准简介,Helm 对 JSON Schema 的支持版本
在 Helm 应用交付中,values.yaml 是用户与 Chart 交互的核心接口。然而,纯 YAML 格式缺乏类型校验与约束机制,用户传入的错误数据类型或缺失字段往往在运行时才暴露。JSON Schema 正是解决这一问题的标准方案,而 Helm 从 3.x 版本开始内置了对 values.schema.json 的原生支持。
3.1 JSON Schema 标准简介
JSON Schema 是一种基于 JSON 格式的声明式语言,用于描述和验证 JSON 数据结构。它定义了一套关键字规则,可以约束数据的类型、范围、格式、必填字段以及嵌套结构。其核心价值在于:在数据消费之前完成校验,将错误拦截在配置阶段。
核心概念: JSON Schema 本身也是一个 JSON 文件,通过
$schema 关键字声明所遵循的草案版本(如 http://json-schema.org/draft-07/schema#),通过 type、properties、required、items 等关键字定义数据约束。
以下是最常用的 JSON Schema 关键字及其用途:
| 关键字 | 用途 | 示例 |
|---|---|---|
type |
指定字段的数据类型 | "type": "string" |
properties |
定义对象下的子字段及其约束 | "properties": { "replicas": { "type": "integer" } } |
required |
声明哪些字段必须存在 | "required": ["image", "port"] |
minimum / maximum |
数值范围约束 | "minimum": 1, "maximum": 100 |
pattern |
字符串正则匹配 | "pattern": "^[a-z0-9-]+$" |
enum |
限定字段值只能从枚举列表中选取 | "enum": ["dev", "staging", "prod"] |
items |
定义数组元素的约束 | "items": { "type": "object", ... } |
additionalProperties |
是否允许对象包含未定义的字段 | "additionalProperties": false |
实践建议: 在 Helm Chart 中,推荐始终设置
"additionalProperties": false 来禁止用户传入未在 Schema 中定义的字段,从而避免因拼写错误导致的配置漂移。
一个完整的 JSON Schema 示例(描述一个简单的 Deployment 配置):
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["image", "replicas"],
"properties": {
"image": {
"type": "string",
"description": "容器镜像地址"
},
"replicas": {
"type": "integer",
"minimum": 1,
"maximum": 50
},
"env": {
"type": "object",
"additionalProperties": { "type": "string" }
}
},
"additionalProperties": false
}
3.2 Helm 对 JSON Schema 的支持版本
Helm 对 JSON Schema 的支持经历了从无到有、从实验到稳定的演进过程。理解版本支持矩阵,有助于团队在升级 Helm 时评估 Schema 功能的可用性。
| Helm 版本 | JSON Schema 支持状态 | 关键说明 |
|---|---|---|
| Helm 2.x | ❌ 不支持 | 无原生 Schema 校验能力;社区通过 Chart 钩子或外部工具实现 |
| Helm 3.0 – 3.4 | ⚠️ 实验性支持 | 通过 --schema 标志手动指定 Schema 文件,未集成到 helm install 默认流程 |
| Helm 3.5+ | ✅ 原生支持 | values.schema.json 自动加载;helm install / helm upgrade 默认执行校验 |
| Helm 3.10+ | ✅ 增强校验 | 支持 $ref 引用、更完善的错误信息输出、子 Chart Schema 合并 |
版本陷阱: 如果团队仍在使用 Helm 3.4 或更早版本,
values.schema.json 文件会被忽略,不会触发任何校验。升级到 Helm 3.5+ 是启用 Schema 准入策略的最低门槛。
3.3 values.schema.json 文件结构与加载机制
在 Helm Chart 中,values.schema.json 必须放置在 Chart 包的根目录(与 Chart.yaml 同级)。Helm 在以下时机自动加载并执行校验:
- helm install:安装时校验用户传入的
--values/--set参数 - helm upgrade:升级时校验新的 values 数据
- helm template:渲染模板时也会执行 Schema 校验(Helm 3.5+)
校验失败时,Helm 会输出明确的错误信息,指出违反约束的字段路径和期望类型,阻止安装或升级继续执行。
3.4 从 values.yaml 到 values.schema.json 的映射关系
编写 Schema 的核心工作是将 values.yaml 中的每个字段映射为 JSON Schema 的约束定义。以下是一个典型的映射对照:
| values.yaml 字段 | JSON Schema 约束 | 校验效果 |
|---|---|---|
replicas: 3 |
{ "type": "integer", "minimum": 1 } |
拒绝字符串 "3" 或负数 |
image: nginx:1.21 |
{ "type": "string", "pattern": "^[a-z0-9./-]+:[a-z0-9.-]+$" } |
拒绝不含标签的镜像名 |
service.type: ClusterIP |
{ "type": "string", "enum": ["ClusterIP", "NodePort", "LoadBalancer"] } |
拒绝拼写错误的值 |
resources.limits.cpu: 500m |
{ "type": "string", "pattern": "^[0-9]+m?$" } |
拒绝非法单位格式 |
ingress.enabled: true |
{ "type": "boolean" } |
拒绝字符串 "true" 或数字 1 |
映射原则: 每个
values.yaml 中的字段都应在 Schema 中显式定义类型和约束。对于可选字段,不要将其加入 required 数组;对于有默认值的字段,Schema 应允许该字段缺失。
3.5 多层级嵌套结构的 Schema 写法
实际 Chart 的 values 往往包含多层嵌套对象。JSON Schema 通过递归的 properties 结构来描述这种层级。以下是一个包含嵌套结构的 Schema 片段:
{
"type": "object",
"properties": {
"global": {
"type": "object",
"properties": {
"environment": { "type": "string", "enum": ["dev", "prod"] },
"region": { "type": "string" }
},
"required": ["environment"]
},
"service": {
"type": "object",
"properties": {
"port": { "type": "integer", "minimum": 1024, "maximum": 65535 },
"targetPort": { "type": "integer" }
},
"required": ["port"]
}
},
"required": ["global", "service"]
}
3.6 常见陷阱与最佳实践
- 陷阱一:忘记设置
additionalProperties— 默认允许未定义字段,用户拼写错误不会触发告警。建议在根对象和每个嵌套对象中显式设置为false。 - 陷阱二:Schema 版本不匹配 — 使用
draft-04语法在 Helm 3.10+ 中可能产生兼容性警告。推荐统一使用draft-07。 - 陷阱三:忽略子 Chart 的 Schema — 如果主 Chart 依赖子 Chart,子 Chart 的
values.schema.json不会自动合并到主 Schema 中。需要手动在父 Schema 中定义子 Chart 的 values 结构。 - 最佳实践: 在 CI 流水线中增加
helm lint --strict步骤,该命令会同时校验 Schema 语法和 values 数据,提前发现 Schema 编写错误。
本章小结: JSON Schema 为 Helm values 提供了类型安全与约束校验能力。Helm 3.5+ 原生支持
values.schema.json,在安装、升级、模板渲染阶段自动执行校验。掌握 Schema 的嵌套结构、关键字映射以及版本兼容性,是构建可靠 Helm Chart 准入策略的第一步。