ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kubebuilder CRD 校验标记(Validation Markers)完全指南:用 OpenAPI v3 Schema 声明式约束你的自定义资源

Kubebuilder CRD 校验标记(Validation Markers)完全指南:用 OpenAPI v3 Schema 声明式约束你的自定义资源 开发者工具代码生成CLI云原生后端【免费下载链接】kubebuilderKubebuilder - SDK for building Kubernetes APIs using CRDs项目地址https://gitcode.com/gh_mirrors/ku/kubebuilder点击查看免费下载本文以 Kubebuilder 官方文档《CRD Validation》为核心系统讲解kubebuilder:validation:*系列标记markers如何驱动 controller-gen 生成 CustomResourceDefinitionCRD的 OpenAPI v3 校验 Schema涵盖数值、字符串、数组、枚举、默认值等各类约束的写法、语法规则与生成产物验证并结合仓库中的 CronJob 教程源码与生成后的 CRD YAML帮助你写出可被 Kubernetes API Server 在运行时强制执行的字段约束。Kubebuilder 通过controller-gen从 Go 类型定义生成 CRD 清单而标记注释marker comments是声明校验规则的唯一入口。自定义资源CR的校验能力完全由生成的 OpenAPI v3 Schema 决定——只有能在 CRD Schema 中表达出来的字段类型与约束才会被 API Server 强制执行。因此理解校验标记的语义与写法是构建健壮、可预期 API 的基础。一、校验标记与 OpenAPI v3 Schema 的关系这些标记用于修改生成 CRD 校验 Schema 的方式作用于被标记的类型type与字段field。每个标记大致对应一个 OpenAPI/JSON Schema 选项例如Minimum对应minimum、MaxLength对应maxLength、Enum对应enum。Kubebuilder 使用 controller-gen 生成工具代码和 Kubernetes 对象 YAML如 CRD。controller-gen 读取 Go 源码中形如// 开头的注释即 markers将其转换为 CRD 中的openAPIV3Schema定义。CRD 的声明式校验在validationOpenAPI v3 schema一节中体现详见 生成 CRD 指南 中的示例。Schema 兼容性的关键约束自定义资源使用生成的 OpenAPI v3 Schema 进行校验并且必须遵守 Kubernetes 结构化 Schemastructural schema规则。这意味着只有能在 CRD Schema 中表示的字段类型和约束才会被 API Server 强制执行数值类型受 Kubernetes CRD OpenAPI v3 Schema 兼容性约束整数仅支持int32与int64两种格式实践中应优先选择能干净映射到受支持 OpenAPI 格式的 Go 类型——例如整数用int32和int64如果需要十进制decimal表示的值请使用resource.Quantity来自k8s.io/apimachinery/pkg/api/resource而不是浮点数或自定义字符串格式。文档中的标记分组说明在官方标记文档中某些标记看起来重复出现。这是因为标记文档按照其使用上下文分组——字段fields、类型types或数组arrays。例如kubebuilder:validation:Enum既可以应用于单个字段也可以应用于数组元素这种灵活性直接反映在文档分组中。分组只是为了清晰展示同一标记如何被复用于不同场景。二、标记语法基础Marker Syntax在深入校验标记之前先理解标记注释的三种形态。详见 标记总览空标记Empty如kubebuilder:validation:Optional像命令行布尔开关只需写出来即启用行为匿名标记Anonymous如kubebuilder:validation:MaxItems2接收单个值作为参数多选项标记Multi-option如kubebuilder:printcolumn:JSONPath.status.replicas,nameReplicas,typestring接收一个或多个命名参数第一个参数与名称之间用冒号分隔后续参数逗号分隔参数顺序无关部分参数可选。标记参数可以是字符串、整数、布尔值、切片或映射语法遵循 Go 语法// kubebuilder:validation:ExclusiveMaximumfalse // kubebuilder:validation:Formatdate-time // kubebuilder:validation:Maximum42 // kubebuilder:validation:Typestring简单情况下字符串可以省略引号如上例Typestring但官方不鼓励对多词字符串这样做。切片既可以用花括号包裹、逗号分隔// kubebuilder:webhooks:Enum{crackers, Gromit, we forgot the crackers!,not even wensleydale?}也可以在简单情况下用分号分隔// kubebuilder:validation:EnumWallace;Gromit;Chicken映射用花括号{}包裹键值用冒号:分隔键值对用逗号分隔// kubebuilder:default{magic: {numero: 42, stringified: forty-two}}三、常用校验标记详解以下标记按用途分类均可结合controller-gen crd -www输出的完整标记文档核对。3.1 数值约束Numeric Constraints标记生成 Schema 字段说明kubebuilder:validation:Minimum1minimum最小值含边界kubebuilder:validation:Maximum3maximum最大值含边界kubebuilder:validation:ExclusiveMinimumtrueexclusiveMinimum最小值是否排除边界kubebuilder:validation:ExclusiveMaximumfalseexclusiveMaximum最大值是否排除边界kubebuilder:validation:MultipleOf2multipleOf数值必须是该值的倍数注意数值类型仅支持int32/int64以及resource.Quantity对应的特殊处理浮点类型不会被写入 Schema 的format。控制器代码可据此将约束值解析为对应的 OpenAPI 数值选项。3.2 字符串约束String Constraints标记生成 Schema 字段说明kubebuilder:validation:MinLength1minLength最小字符长度kubebuilder:validation:MaxLength15maxLength最大字符长度kubebuilder:validation:Pattern^[a-z]$pattern正则表达式匹配采用 ECMA 262 正则语法kubebuilder:validation:Formatdate-timeformat声明格式如date-time、email、ip等 OpenAPI 格式3.3 数组与映射约束List / Map Constraints标记生成 Schema 字段说明kubebuilder:validation:MinItems1minItems数组/映射最少元素数kubebuilder:validation:MaxItems500maxItems数组/映射最多元素数kubebuilder:validation:UniqueItemstrueuniqueItems数组元素是否必须唯一3.4 枚举与类型约束Enum / Type Constraints标记生成 Schema 字段说明kubebuilder:validation:EnumLion;Wolf;Dragonenum允许的取值列表分号分隔kubebuilder:validation:Typestringtype显式声明字段的 JSON 类型覆盖 Go 类型推断3.5 默认值与必填/可选Default / Required / Optional标记生成 Schema 字段说明kubebuilder:default:Allowdefault字段默认值在对象创建/更新时由 API Server 写入kubebuilder:validation:Requiredrequired父级字段必填kubebuilder:validation:Optional无可选标记字段可选可置于字段或包级别关于// optional与// kubebuilder:validation:Optional的区别controller-gen 两者都支持见controller-gen crd -www输出。kubebuilder:validation:Optional还可以放在包级别使其作用于包内所有字段。若你同时使用其他生成器或为开发者提供自建客户端建议同时保留optional。在 1.x 中获取optional最可靠的方式是使用omitempty。四、完整实战示例从 Go 类型到生成的 CRD4.1 基础示例官方文档原例将校验标记附加到字段或类型上。定义复杂校验、需要复用校验、或需要校验切片元素时最好定义一个新类型来承载校验逻辑type ToySpec struct { // kubebuilder:validation:MaxLength15 // kubebuilder:validation:MinLength1 Name string json:name,omitempty // kubebuilder:validation:MaxItems500 // kubebuilder:validation:MinItems1 // kubebuilder:validation:UniqueItemstrue Knights []string json:knights,omitempty Alias Alias json:alias,omitempty Rank Rank json:rank } // kubebuilder:validation:EnumLion;Wolf;Dragon type Alias string // kubebuilder:validation:Minimum1 // kubebuilder:validation:Maximum3 // kubebuilder:validation:ExclusiveMaximumfalse type Rank int32要点Name通过字段级标记限制长度 1~15Knights限制元素数量 1~500 且元素必须唯一Alias、Rank通过类型级标记声明约束可被多个字段复用例如Alias Alias字段直接继承类型的Enum约束。4.2 仓库中的真实案例CronJob 教程在 CronJob 教程类型定义 中你可以看到校验标记与 GoDoc 注释、optional/required的配合用法// CronJobSpec defines the desired state of CronJob type CronJobSpec struct { // schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. // kubebuilder:validation:MinLength0 // required Schedule string json:schedule // startingDeadlineSeconds defines in seconds for starting the job if it misses scheduled // time for any reason. Missed jobs executions will be counted as failed ones. // optional // kubebuilder:validation:Minimum0 StartingDeadlineSeconds *int64 json:startingDeadlineSeconds,omitempty // concurrencyPolicy specifies how to treat concurrent executions of a Job. // Valid values are: // - Allow (default): allows CronJobs to run concurrently; // - Forbid: forbids concurrent runs, skipping next run if previous run hasnt finished yet; // - Replace: cancels currently running job and replaces it with a new one // optional // kubebuilder:default:Allow ConcurrencyPolicy ConcurrencyPolicy json:concurrencyPolicy,omitempty // successfulJobsHistoryLimit defines the number of successful finished jobs to retain. // optional // kubebuilder:validation:Minimum0 SuccessfulJobsHistoryLimit *int32 json:successfulJobsHistoryLimit,omitempty // failedJobsHistoryLimit defines the number of failed finished jobs to retain. // optional // kubebuilder:validation:Minimum0 FailedJobsHistoryLimit *int32 json:failedJobsHistoryLimit,omitempty } // kubebuilder:validation:EnumAllow;Forbid;Replace type ConcurrencyPolicy string注意ConcurrencyPolicy是一个自定义字符串类型Enum约束被放在类型定义上而非字段上官方注释解释这种做法的价值自定义类型不仅承载了文档语义还可以在多个字段间复用校验规则。4.3 生成的 CRD 产物验证在 生成的 CronJob CRD 中可以直观看到标记被翻译成 OpenAPI v3 Schema 的结果apiVersion: apiextensions.k8s.io/v1由 controller-gen v0.22.0 生成spec: properties: concurrencyPolicy: default: Allow enum: - Allow - Forbid - Replace type: string failedJobsHistoryLimit: format: int32 minimum: 0 type: integer对应关系一目了然kubebuilder:default:Allow→default: Allowkubebuilder:validation:EnumAllow;Forbid;Replace类型级→enum: [Allow, Forbid, Replace]kubebuilder:validation:Minimum0→minimum: 0int32字段 →format: int32, type: integer印证了前文整数仅支持 int32 / int64的兼容性说明。该教程测试数据中的 CRD 清单、安装产物dist/install.yaml等都可以用来对照学习标记的最终效果。五、如何触发校验 Schema 生成Kubebuilder 项目通过make manifests目标调用 controller-gen 生成 CRD。它默认把 CRD 产物输出到config/crd/bases目录。对应的 Makefile 规则略作精简为# Generate manifests for CRDs manifests: controller-gen $(CONTROLLER_GEN) rbac:roleNamemanager-role crd webhook paths./... output:crd:artifacts:configconfig/crd/bases其中output:crd:artifacts:configconfig/crd/bases是 controller-gen 的输出规则output rule把 CRD 相关配置产物写入config/crd/bases而非config/crd。运行make manifests后校验标记即会体现在config/crd/bases/*.yaml的spec.versions[].schema.openAPIV3Schema中应用该 CRD 后API Server 会在写入时强制校验这些约束如超出maximum、违反enum、未满足MinLength等请求会被拒绝。如需查看 controller-gen 全部生成器与选项$ controller-gen -h # 或查看更详细信息 $ controller-gen -hhh六、最佳实践与注意事项优先使用类型级标记承载复杂校验。需要复用校验、需要校验切片元素时定义独立类型如ConcurrencyPolicy比把标记堆在字段上更清晰、更可维护遵循数值类型兼容性。整数字段用int32/int64需要小数表示时使用resource.Quantity避免使用无法映射到 OpenAPI 格式的类型GoDoc 注释会被一并写入 Schema。字段的 GoDoc 形成 CRD 中的描述description文本编写字段注释时尽量同时服务于 API 文档默认值会在 API Server 侧生效。kubebuilder:default:...生成的default会在对象创建或更新时由 API Server 填充注意其与控制器侧默认值的差异结构化 Schema 规则是硬约束。校验只对能在 CRD Schema 中表达的内容生效无法表达的逻辑校验如跨字段关系需要借助 admission webhook 或 CEL 校验x-kubernetes-validations在运行时处理。七、延伸阅读生成 CRD 指南包含更完整的校验示例、printer columns、subresources 与多版本说明标记总览标记语法、optional与kubebuilder:validation:Optional的区别CRD 生成标记kubebuilder:printcolumn、kubebuilder:subresource:*、kubebuilder:storageversion等CRD 处理标记控制 API Server 如何处理请求的标记CronJob 教程 及其 类型定义源码 与 生成的 CRD从零到一的完整落地案例快速开始快速搭建一个启用校验标记的项目骨架。赞分享开发者工具代码生成CLI云原生后端【免费下载链接】kubebuilderKubebuilder - SDK for building Kubernetes APIs using CRDs项目地址https://gitcode.com/gh_mirrors/ku/kubebuilder点击查看免费下载相关推荐Cosmos 物理世界视频生成完整上手指南从 Docker 到第一个 Text2World 视频只需 5 步Cosmos 物理世界视频生成完整上手指南从 Docker 到第一个 Text2World 视频只需 5 步 NVIDIA Cosmos 是一个开源的物理世界开发者工具代码生成CLI云原生后端iii 队列 worker 全解析命名队列、Pub/Sub 主题、重试策略与死信队列DLQ实战iii 队列 worker 全解析命名队列、Pub/Sub 主题、重试策略与死信队列DLQ实战 queue worker 是 iii 中用于解耦生产者与消开发者工具代码生成CLI云原生后端Litestar 中间件约束MiddlewareConstraints完全指南声明式校验中间件顺序Litestar 中间件约束MiddlewareConstraints完全指南声明式校验中间件顺序 本指南以 docs/reference/middlew后端Web框架上一篇JLink V9.5 固件资源包解锁调试器的高级功能下一篇项目推荐Logger - 简单、美观且强大的Android日志工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表