简短插曲:其他这些东西是什么?

如果你瞥了一眼 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

Copyright 2025 The Kubernetes authors.

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.

First, we have some package-level markers that denote that there are Kubernetes objects in this package, and that this package represents the group batch.tutorial.kubebuilder.io. The object generator makes use of the former, while the latter is used by the CRD generator to generate the right metadata for the CRDs it creates from this package.

// 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"
)

Then, we have the commonly useful variables that help us set up our Scheme. Since we need to use all the types in this package in our controller, it’s helpful (and the convention) to have a convenient method to add all the types to some other Scheme. SchemeBuilder makes this easy for us.

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 包含了前面提到的 runtime.Object 接口的自动生成实现,它将我们所有的根类型标记为代表某个 Kind。

runtime.Object 接口的核心是一个深拷贝方法 DeepCopyObject

controller-tools 中的 object 生成器还会为每个根类型及其所有子类型生成另外两个实用方法:DeepCopyDeepCopyInto