4、CRD 设计规范:自定义资源定义的结构、版本与校验

在 Operator 开发中,自定义资源定义(CRD)是声明式 API 的核心载体。CRD 的 YAML 结构、版本管理策略以及校验规则直接决定了 Operator 的扩展性、兼容性与生产就绪度。本章从这三个维度展开,帮助你在流水线集成中建立自动化的 CRD 合规验证能力。

4.1 CRD YAML 结构规范

一个标准的 CRD 由顶层元数据、Spec 与状态子结构组成。以下是一个典型的 CRD YAML 骨架:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myresources.example.io
spec:
  group: example.io
  names:
    kind: MyResource
    plural: myresources
    singular: myresource
    shortNames:
      - mr
  scope: Namespaced
  versions:
    - name: v1alpha1
      served: true
      storage: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 100
                image:
                  type: string
            status:
              type: object
              properties:
                availableReplicas:
                  type: integer
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: ["v1", "v1beta1"]
结构要点:
  • group/names:定义 API 组与资源名称,必须符合 DNS 子域名规范。
  • scope:选择 Namespaced 或 Cluster,影响资源隔离范围。
  • versions:核心数组,每个版本独立定义 schema、服务状态与存储标志。
  • conversion:多版本共存时,必须配置转换策略(None 或 Webhook)。

4.2 版本管理策略:从 v1alpha1 到 v1

Kubernetes 社区推荐的版本演进路径分为三个阶段,每个阶段对应不同的稳定性承诺与变更自由度:

版本 稳定性 变更自由度 生产推荐 存储标志
v1alpha1 实验性 可任意变更,不保证向后兼容 仅开发/测试环境 通常不设为 storage
v1beta1 Beta 级 可少量非破坏性变更,需保留字段兼容 预生产/小规模生产 可选 storage
v1 稳定 GA 仅允许新增可选字段,禁止删除或重命名 生产环境 必须设为 storage
版本共存原则: 在同一个 CRD 中,可以同时声明多个 served: true 的版本。但 storage: true 只能有一个版本,用于持久化存储。其他版本通过转换 Webhook 实现读写兼容。

以下 SVG 展示了 CRD 版本从开发到生产的标准演进路径:

CRD 版本演进路径 v1alpha1 实验性 · 可任意变更 v1beta1 Beta · 少量兼容变更 v1 (GA) 稳定 · 仅新增可选字段 存储版本(storage: true)规则 • 同一 CRD 只能有一个版本设置 storage: true • 升级存储版本需通过转换 Webhook 迁移已有数据 • 生产环境建议将 v1 设为存储版本

4.3 校验规则:OpenAPI v3 Schema

CRD 的校验规则通过 openAPIV3Schema 字段定义,支持类型约束、值范围、枚举、必填字段、嵌套对象校验等。以下是最常用的校验模式:

校验类型 关键字 示例 说明
类型约束 type type: integer 支持 string / integer / number / boolean / array / object
数值范围 minimum / maximum minimum: 1, maximum: 100 仅对 integer / number 生效
字符串模式 pattern pattern: '^[a-z0-9-]+$' 正则表达式校验
枚举值 enum enum: [dev, staging, prod] 限定可选值列表
必填字段 required required: [name, image] 在对象级别声明必填属性
数组长度 minItems / maxItems minItems: 1, maxItems: 10 限制数组元素个数
嵌套对象 properties properties: { spec: { type: object, ... } } 支持多层嵌套与递归校验
常见陷阱:
  • additionalProperties:默认允许未知字段,建议显式设置为 false 以严格校验。
  • nullable:对于可选字段,明确设置 nullable: true 避免空值报错。
  • default:CRD 不支持 default 关键字,默认值需在 Operator 控制器中处理。

以下 SVG 展示了 OpenAPI v3 Schema 在 CRD 中的校验层级结构:

OpenAPI v3 Schema 校验层级 openAPIV3Schema type: object required: [...] properties spec (object) status (object) metadata (object) replicas: integer image: string env: array 校验规则可组合使用:如 replicas 可同时设置 type: integer + minimum: 1 + maximum: 100

4.4 流水线中的 CRD 合规验证

在 CI/CD 流水线中,自动化验证 CRD 合规性通常包含以下步骤:

  1. YAML 语法检查:使用 kubectl apply --dry-run=server --validate=true 或 kubeconform 工具。
  2. Schema 结构校验:对比 CRD YAML 与 OpenAPI v3 Schema 模板,确保字段类型、范围、枚举值一致。
  3. 版本兼容性检查:验证新版本是否包含所有旧版本字段(仅允许新增可选字段)。
  4. 存储版本唯一性:确保只有一个版本设置 storage: true。
  5. 转换 Webhook 配置:如果存在多个 served 版本,检查 conversion 策略是否配置正确。
自动化工具推荐:
  • kubeconform:离线 CRD 校验,支持自定义 Schema 目录。
  • datree:策略引擎,可编写 CRD 合规规则。
  • kubectl-neat:清理 CRD 输出,便于对比版本差异。
  • openapi-diff:对比两个 OpenAPI Schema 的破坏性变更。

通过以上规范与工具的结合,你可以在流水线中自动拦截不合规的 CRD 变更,确保 Operator 发布始终符合 Kubernetes 生态的最佳实践。