用于配置/代码生成的标记(Markers)

Kubebuilder 使用 controller-gen 来生成实用代码与 Kubernetes YAML。生成行为由 Go 代码中的特殊“标记注释”控制。

“标记注释”是以加号开头的单行注释,后跟标记名称,并可选带有该标记的配置:

// +kubebuilder:validation:Optional
// +kubebuilder:validation:MaxItems=2
// +kubebuilder:printcolumn:JSONPath=".status.replicas",name=Replicas,type=string

See each subsection for information about different types of code and YAML generation.

在 Kubebuilder 中生成代码与产物

Kubebuilder 项目通常使用两个与 controller-gen 相关的 make 目标:

完整概览请见生成 CRD

标记语法(Marker Syntax)

精确语法可参阅 controller-tools 的 godocs

一般而言,标记可分为:

  • 空标记(Empty,+kubebuilder:validation:Optional):类似命令行里的布尔开关,仅标注即可开启某行为。

  • 匿名标记(Anonymous,+kubebuilder:validation:MaxItems=2):接收一个无名参数。

  • 多选项标记(Multi-option, +kubebuilder:printcolumn:JSONPath=".status.replicas",name=Replicas,type=string): 接收一个或多个具名参数。第一个参数与标记名以冒号分隔,其后参数以逗号分隔。参数顺序无关,且部分参数可选。

标记参数可以是字符串、整型、布尔、切片或这些类型的映射。字符串、整型和布尔值遵循 Go 语法:

// +kubebuilder:validation:ExclusiveMaximum=false
// +kubebuilder:validation:Format="date-time"
// +kubebuilder:validation:Maximum=42

为方便起见,在简单场景下字符串可省略引号(不建议在除单词外的场景使用):

// +kubebuilder:validation:Type=string

切片可以使用花括号加逗号分隔:

// +kubebuilder:webhooks:Enum={"crackers, Gromit, we forgot the crackers!","not even wensleydale?"}

或在简单场景下使用分号分隔:

// +kubebuilder:validation:Enum=Wallace;Gromit;Chicken

映射以字符串为键、任意类型为值(等价于 map[string]interface{})。使用花括号包裹({}),键值以冒号分隔(:),键值对之间以逗号分隔:

// +kubebuilder:default={magic: {numero: 42, stringified: forty-two}}