云原生学习路线导航页(持续更新中)
- 本文是 Kubernetes operator学习 系列零散知识篇,在学习过程中发现 operator开发 有很多零碎的知识,所以单独用一篇文章记录
- Kubernetes operator学习系列 快捷链接
- Kubernetes operator 前置知识篇
- Kubernetes operator(一)client-go篇
- Kubernetes operator(二)CRD篇
- Kubernetes operator(三)code-generator 篇
- Kubernetes operator(四)controller-tools 篇
- Kubernetes operator(五)api 和 apimachinery 篇
- Kubernetes operator(六)CRD控制器 开发实战篇
- Kubernetes operator(七) kubebuilder 的安装及简单使用 篇
- Kubernetes operator(八) kubebuilder 实战演练之deploy-image插件的使用
- Kubernetes operator(九) kubebuilder 实战演练 之 自定义CronJob
- Kubernetes operator 零散知识篇
1.kubebuilder
1.1.kubebuilder 的 标记学习
1.1.1.//+kubebuilder:object:root=true
- 标记
//+kubebuilder:object:root=true
- 使用位置
- 在 kubebuilder 生成的 types.go文件 中,Kind 和 KindList 的 struct 上方一般都会有这个标记
- 标记含义
- 该标记是告诉
controller-tools
,下面的struct是一个Kind,在代码生成的时候,需要为其生成runtime.Object
的实现,即自动生成GetObjectKind()
和DeepCopyObject()
方法
- 该标记是告诉
- 使用示例
//+kubebuilder:object:root=true //+kubebuilder:subresource:status// CronJob is the Schema for the cronjobs API type CronJob struct {metav1.TypeMeta `json:",inline"`metav1.ObjectMeta `json:"metadata,omitempty"`Spec CronJobSpec `json:"spec,omitempty"`Status CronJobStatus `json:"status,omitempty"` }//+kubebuilder:object:root=true// CronJobList contains a list of CronJob type CronJobList struct {metav1.TypeMeta `json:",inline"`metav1.ListMeta `json:"metadata,omitempty"`Items []CronJob `json:"items"` }
1.1.2.//+kubebuilder:subresource:status
- 标记
//+kubebuilder:subresource:status
- 使用位置
- 在 kubebuilder 生成的 types.go文件 中,Kind 的 struct 上方一般都会有这个标记
- 标记含义
- 该标记是告诉
controller-tools
,下面的 struct 是允许存在子资源的,即 允许有其他资源的ownerReferences设置成自己 - 添加了此标记,运行
make manifests
时,在生成的CRD yaml文件config/crd/bases/...yaml
中,一般会有这么一段subresources:status: {}
- 该标记是告诉
- 使用示例
//+kubebuilder:object:root=true //+kubebuilder:subresource:status// CronJob is the Schema for the cronjobs API type CronJob struct {metav1.TypeMeta `json:",inline"`metav1.ObjectMeta `json:"metadata,omitempty"`Spec CronJobSpec `json:"spec,omitempty"`Status CronJobStatus `json:"status,omitempty"` }
1.1.3.//+kubebuilder:validation 系列
- 标记
//+kubebuilder:validation
并非一个标记,而是一系列的标记
- 使用位置
- 该系列标记一般用到 types.go文件 的 Spec、Status 的 struct 字段上方
- 标记含义
- 该标记是告诉
controller-tools
,下面的 字段,值是有一些限制的 - 添加了此标记,运行
make manifests
时,在生成的CRD yaml文件config/crd/bases/...yaml
中,就会对 该字段 进行一些限制。 - 比如下面 size 字段的
maximum、minimum
:spec:description: MemcachedSpec defines the desired state of Memcachedproperties:size:description: |-Size defines the number of Memcached instancesThe following markers will use OpenAPI v3 schema to validate the valueMore info: https://book.kubebuilder.io/reference/markers/crd-validation.htmlformat: int32maximum: 3minimum: 1type: integertype: object
- 该标记是告诉
- //+kubebuilder:validation系列有哪些常用标记
+kubebuilder:validation:Enum:=<[]any>
- 限制字段值 必须是…的枚举值
- 比如:
type MyResourceSpec struct {// +kubebuilder:validation:Enum:=pending;approved;rejectedStatus string `json:"status"` }
+kubebuilder:validation:ExclusiveMaximum:=<bool>
- 限制字段值 的最大值,但是不包括最大值本身。
- 该标记仅仅指明是否包含最大值,最大值具体是多少,由
+kubebuilder:validation:Maximum
说明 - 比如:
type MyResourceSpec struct {// +kubebuilder:validation:ExclusiveMaximum:=true// +kubebuilder:validation:Maximum:=100Value int64 `json:"value"` }
+kubebuilder:validation:ExclusiveMinimum:=<bool>
- 限制字段值 的最小值,但是不包括最小值本身。
- 该标记仅仅指明是否包含最小值,最小值具体是多少,由
+kubebuilder:validation:Minimum
说明 - 比如:
type MyResourceSpec struct {// +kubebuilder:validation:ExclusiveMinimum:=true// +kubebuilder:validation:Minimum:=100Value int64 `json:"value"` }
+kubebuilder:validation:Format:=<string>
- 限制一个字符串的格式
- 比如:
type MyResourceSpec struct {// +kubebuilder:validation:Format:=emailEmail string `json:"email"` }
+kubebuilder:validation:Maximum:=<>
- 限制字段值 的最大值,默认是包含最大值本身的
- 比如:
type MyResourceSpec struct {// +kubebuilder:validation:Maximum:=100Value int64 `json:"value"` }
+kubebuilder:validation:Minimum:=<>
- 限制字段值 的最小值,默认是包含最小值本身的
- 比如:
type MyResourceSpec struct {// +kubebuilder:validation:Minimum:=100Value int64 `json:"value"` }
+kubebuilder:validation:MaxLength:=<int>
- 限制字符串字段值 的最大长度
- 比如:
type MyResourceSpec struct {// +kubebuilder:validation:MaxLength:=10Value string `json:"value"` }
+kubebuilder:validation:MinLength:=<int>
- 限制字符串字段值 的最小长度
- 比如:
type MyResourceSpec struct {// +kubebuilder:validation:MinLength:=0Value string `json:"value"` }
1.1.4.//+optional
- 标记
//+optional
- 使用位置
- 字段上方
- 标记含义
- 标识该字段 是否为 可选字段
- 添加了此标记,运行
make manifests
时,在生成的CRD yaml文件config/crd/bases/...yaml
中,就会对 该字段 进行一些可选限制。
- 使用示例
//+kubebuilder:object:root=true //+kubebuilder:subresource:status// CronJob is the Schema for the cronjobs API type CronJob struct {// +optionalSuspend *bool `json:"suspend,omitempty"` }
1.2.kubebuilder 初始化项目
1.2.1.kubebuilder init 命令的 --repo 参数
- 如果你的项目在$GOPATH目录下创建,那么在使用
kubebuilder init
命令时,可以不指定 --repo 参数 - 但如果你的项目 不是在$GOPATH目录 下创建,就必须使用 --repo 参数
1.2.2.kubebuilder create api 的CRD版本问题
- 自kubernetes的v1.16开始,kubebuilder create api 默认创建的都是 v1 版本的CRD
- 如果您的项目打算支持 kubernetes v1.16之前 的Kubernetes集群版本,则必须使用v1beta1API 版本,需要明确指定
--crd-version
:kubebuilder create api --crd-version v1beta1 ...
- 目前 v1beta1已弃用并在 Kubernetes v1.22 中删除,需要注意集群版本,防止出现预料之外的错误
1.3.API相关
1.3.1.kubernetes API设计规范
- API 字段序列化 命名规范
- 创建完API,修改 Spec 和 Status 结构体时,字段 序列化 的值,需要是 camelCase 命名法,即 首字母小写,后面单词首字母大写
- 如:json:camelCase
- 序列化时不需要 的 空字段
- 使用
omitempty
标记序列化时不需要 的 空字段
- 使用
- API 中 数量类型
- “k8s.io/apimachinery/pkg/api/resource” 的
resource.Quantity
,支持两种基数:2进制、10进制 - 2进制:1Ki,表示 1024
- 10进制:1K,表示 1000
- 另外:1m=千分之1=0.001
- “k8s.io/apimachinery/pkg/api/resource” 的
- metav1.Time和time.Time的区别
- metav1.Time 是 Kubernetes API 中的一种时间表示类型,包含一个 Time 字段,被广泛用于 资源对象的元数据(metadata)中
- time.Time 是 Go 语言标准库中的时间表示类型,位于 time 包中。它也是一个结构体,包含了年、月、日等时间信息,以及更精细的时、分、秒、纳秒等时间分量