初识代码生成器#
在 Kubernetes 源码中,默认保留了通过代码生成器生成代码文件的功能,如 pkg/apis/core/zz_generated.deepcopy.go 文件 。顶层 Makefile 中定义了 generated_files 命令,该命令用于构建代码生成器,generated_files 在 Makefile.generated_files 中的定义如下:
.PHONY: generated_files
generated_files: gen_prerelease_lifecycle gen_deepcopy gen_defaulter gen_conversion gen_openapigenerated_files 中定义了 5 个代码生成器的二进制工具,经过 make all 操作后,这些二进制工具被输出到 _output/bin/ 目录下 。如果二进制文件不存在,则可以通过 make generated_files 命令单独构建代码生成器的二进制工具 。下面分别介绍这些代码生成器 :
tree _output/bin/
_output/bin/
├── conversion-gen
├── deepcopy-gen
├── defaulter-gen
├── openapi-gen
└── prerelease-lifecycle-gen此处的 5 种代码生成器是构建 Kubernetes 源码过程中所需要的,除了以上 5 种代码生成器,Kubernetes 还支持更多代码生成器,如 client-gen、lister-gen、informer-gen、applyconfiguration-gen 等,如下表所示 。
| 代码生成器 | 生成的代码文件 | 说明 |
|---|---|---|
| deepcopy-gen | zz_generated.deepcopy.go | 自动生成 DeepCopy 相关函数的代码生成器,用于资源对象的深复制操作函数 |
| defaulter-gen | zz_generated.defaults.go | 自动生成 Defaulter 相关函数的代码生成器,用于资源对象的默认值函数 |
| conversion-gen | zz_generated.conversion.go | 自动生成 Convert 相关函数的代码生成器,用于资源对象的版本转换函数 |
| openapi-gen | zz_generated.openapi.go | 自动生成 OpenAPI 定义文件 (OpenAPI Definition File) 的代码生成器 |
| prerelease-lifecycle-gen | zz_generated.prerelease-lifecycle.go | 为 beta 资源自动生成 API 生命周期管理 (APILifecycle) 函数的代码生成器 |
| client-gen | k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed 目录下的代码文件 | 自动生成资源对应的 ClientSet 客户端,ClientSet 客户端对资源组、资源版本、资源进行了封装,可以针对资源执行生产资源操作方法 (create、update、delete、get 等) |
| lister-gen | k8s.io/kubernetes/vendor/k8s.io/client-go/listers 目录下的代码文件 | 自动生成资源对应的 Lister,为每一个 Kubernetes 资源提供 Lister 功能 (即提供 Get 和 List 方法) |
| informer-gen | k8s.io/kubernetes/vendor/k8s.io/client-go/informers 目录下的代码文件 | 自动生成资源对应的 Informer,为 client-go 提供与 kube-apiserver 通信的机制 |
| applyconfiguration-gen | k8s.io/kubernetes/vendor/k8s.io/client-go/applyconfigurations 目录下的代码文件 | 自动为资源的 Apply 和 ApplyStatus 方法生成专属的 ApplyConfiguration 资源配置应用类型 |

