简要说明: 其他文件是干什么的?

api/v1/目录下除 cronjob_types.go 外还有另外两个文件:groupversion_info.gozz_generated.deepcopy.go

这两个文件都不需要编辑(前者保持不变,后者是自动生成的), 但是知道其中有什么是非常有用的。

groupversion_info.go

groupversion_info.go 包含和 group-version 有关的元数据:

project/api/v1/groupversion_info.go
Apache License

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

首先,我们有一些 package-level 的标记,+kubebuilder:object:generate=true 表示该程序包中有 Kubernetes 对象, +groupName=batch.tutorial.kubebuilder.io 表示该程序包的 Api group 是 batch.tutorial.kubebuilder.ioobject 生成器使用前者,而 CRD 生成器使用后者, 来为由此包创建的 CRD 生成正确的元数据。

// Package v1 contains API Schema definitions for the batch v1 API group
// +kubebuilder:object:generate=true
// +groupName=batch.tutorial.kubebuilder.io
package v1

import (
	"k8s.io/apimachinery/pkg/runtime/schema"
	"sigs.k8s.io/controller-runtime/pkg/scheme"
)

然后,我们定义一些全局变量帮助我们建立 Scheme。 由于我们需要在 controller 中使用此程序包中的所有 types, 因此需要一种方便的方法(或约定)可以将所有 types 添加到其他 Scheme 中。 SchemeBuilder 让我们做这件事情变的容易。

var (
	// GroupVersion is group version used to register these objects
	GroupVersion = schema.GroupVersion{Group: "batch.tutorial.kubebuilder.io", Version: "v1"}

	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}

	// AddToScheme adds the types in this group-version to the given scheme.
	AddToScheme = SchemeBuilder.AddToScheme
)

zz_generated.deepcopy.go

zz_generated.deepcopy.go 包含之前所说的+kubebuilder:object:root自动生成的 runtime.Object 接口的实现。

runtime.Object interface 的核心是一个 deep-copy 方法:DeepCopyObject

controller-tools 中的 object 生成器也为每个 root type(CronJob) 和他的 sub-types(CronJobList,CronJobSpec,CronJob1Status) 都生成了两个方法:DeepCopyDeepCopyInto