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 会输出明确的错误信息,指出违反约束的字段路径和期望类型,阻止安装或升级继续执行。

values.schema.json 在 Helm 工作流中的校验位置 values.schema.json 在 Helm 工作流中的校验位置 用户 values 输入 Schema 校验引擎 values.schema.json 校验通过 继续渲染 校验失败 报错退出 说明:Schema 校验在模板渲染之前执行,确保只有符合约束的数据进入模板引擎,从源头阻断配置错误。

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"]
}
values.schema.json 嵌套结构与校验层级 values.schema.json 嵌套结构与校验层级 根对象 (type: object) global (object) service (object) ingress (object) environment (enum) region (string) port (integer) targetPort (integer) enabled (boolean) 每个层级独立定义 type、properties、required;叶子节点定义具体类型与约束,形成完整的校验树。

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 准入策略的第一步。