@@ -44,13 +44,13 @@ total 1048
4444
4545可以暂时忽略无关的文件,我们主要分析 ` types.go ` 、` zz_generated.deepcopy.go ` 和 ` register.go ` 三个文件。
4646
47- 1 . types.go:定义本 ` <group>/<version> ` 下所有的资源类型,即 codegen 注释;
48- 2 . zz_generated.deepcopy.go:` deepcopy-gen ` 工具自动创建的、包含各资源类型的 ` DeepCopyObject() ` 方法的文件;
47+ 1 . types.go:定义本 ` <group>/<version> ` 下所有的资源类型和 codegen 注释;
48+ 2 . zz_generated.deepcopy.go:` deepcopy-gen ` 工具创建的、定义各资源类型 ` DeepCopyObject() ` 方法的文件;
49493 . register.go:定义了 ` AddToScheme() ` 函数,用于将本 ` <group>/<version> ` 下的各资源类型注册到 Clientset 使用的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/);
5050
5151### types.go 文件
5252
53- 该文件定义了资源类型相关的 go struct 及 codegen 命令行工具使用的注释:
53+ 该文件包含资源类型的 go struct 定义及 codegen 命令行工具使用的注释:
5454
5555``` go
5656// 来源于:k8s.io/api/extensions/v1beta1/types.go
@@ -106,13 +106,15 @@ type Object interface {
106106
107107K8S 各资源类型的 go struct 定义都嵌入了 ` metav1.TypeMeta ` 类型,而该类型实现了 ` GetObjectKind() ` 方法,故各资源类型只需要实现 ` DeepCopyObject() ` 方法。
108108
109- 我们不需要手动为各资源类型定义 ` DeepCopyObject() ` 方法,而是使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成该方法 。
109+ 我们不需要手动为各资源类型定义 ` DeepCopyObject() ` 方法,而是使用 ` deepcopy-gen ` 工具命令统一、自动地生成该方法 。
110110
111111deepcopy-gen 工具读取 ` types.go ` 文件中的 ` +k8s:deepcopy-gen ` 注释,如:
112112
113113 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
114114
115- 然后将生成的结果保存到 ` zz_generated.deepcopy.go ` 文件,以 ` Deployment ` 类型为例:
115+ 然后将生成的结果保存到 ` zz_generated.deepcopy.go ` 文件。
116+ 117+ 以 ` Deployment ` 类型为例:
116118
117119``` go
118120// 来源于:k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go
@@ -137,9 +139,9 @@ func (in *Deployment) DeepCopyObject() runtime.Object {
137139
138140### register.go 文件
139141
140- 使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成` DeepCopyObject() ` 方法后,各资源类型就满足了 ` runtime.Object ` 接口,进而可以注册到 Scheme 中。
142+ 使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成` DeepCopyObject() ` 方法后,各资源类型就满足了 ` runtime.Object ` 接口,进而可以注册到 Scheme 中。
141143
142- 各 API Group 的各 Version 目录下,都有一个 ` register.go ` 文件,该文件对外提供的 ` AddToScheme() ` 方法用于将本 Group/Version 下的各资源类型注册到** 传入** 的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/register.go 中创建该 Scheme 对象),然后 Clientset 就可以使用它对各类型对象进行编解码了 。
144+ 各 API Group/ Version 目录下都有一个 ` register.go ` 文件,该文件对外提供的 ` AddToScheme() ` 方法用于将本 Group/Version 下的各资源类型注册到** 传入** 的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/register.go 中创建该 Scheme 对象),然后 Clientset 就可以使用它进行 Wired-data 和对象之间的转换了 。
143145
144146``` go
145147// 来源于:k8s.io/api/extensions/v1beta1/register.go
@@ -178,11 +180,12 @@ func addKnownTypes(scheme *runtime.Scheme) error {
178180
179181## 注册所有内置资源类型到 Scheme 对象
180182
181- 需要将 ` k8s.io/api/<group>/<version> ` 目录下的各资源类型注册到** 全局 Scheme 对象** ,这样 Clienset 才能识别和使用它们的对象 。
183+ 需要将 ` k8s.io/api/<group>/<version> ` 目录下的各资源类型注册到** 全局 Scheme 对象** ,这样 Clienset 才能识别和使用它们 。
182184
183185client-go 的 ` scheme package ` (k8s.io/client-go/kubernetes/scheme/)定义了这个全局 ` Scheme ` 对象,并将各 ` k8s.io/api/<Group>/<Version> ` 目录下的资源类型注册到它上面。
184186
185187Scheme 对象还被用于创建另外两个外部对象:
188+ 1861891 . 对资源类型对象进行编解码(序列化/反序列化)的工厂对象 ` Codecs ` ,后续使用它配置 ` rest.Config.NegotiatedSerializer ` ;
1871902 . 参数编解码对象 ` ParameterCodec ` ,后续调用 RestFul 的方法时使用,如 ` VersionedParams(&options, scheme.ParameterCodec) ` 。
188191
@@ -279,6 +282,7 @@ func (c *Clientset) ExtensionsV1beta1() extensionsv1beta1.ExtensionsV1beta1Inter
279282` k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go ` 。
280283
281284比较关键的是 ` setConfigDefaults() ` 函数,它负责为 Clientset 配置参数:
285+ 2822861 . 资源对象的 GroupVersion;
2832872 . 资源对象的 root path;
2842883 . 对 wired data 进行编解码(序列化/反序列化)的 ` NegotiatedSerializer ` ,使用的 ` scheme.Codecs ` 为前面介绍过的 ` scheme package ` ;
0 commit comments