@@ -44,13 +44,13 @@ total 1048
44
44
45
45
可以暂时忽略无关的文件,我们主要分析 ` types.go ` 、` zz_generated.deepcopy.go ` 和 ` register.go ` 三个文件。
46
46
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() ` 方法的文件;
49
49
3 . register.go:定义了 ` AddToScheme() ` 函数,用于将本 ` <group>/<version> ` 下的各资源类型注册到 Clientset 使用的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/);
50
50
51
51
### types.go 文件
52
52
53
- 该文件定义了资源类型相关的 go struct 及 codegen 命令行工具使用的注释:
53
+ 该文件包含资源类型的 go struct 定义及 codegen 命令行工具使用的注释:
54
54
55
55
``` go
56
56
// 来源于:k8s.io/api/extensions/v1beta1/types.go
@@ -106,13 +106,15 @@ type Object interface {
106
106
107
107
K8S 各资源类型的 go struct 定义都嵌入了 ` metav1.TypeMeta ` 类型,而该类型实现了 ` GetObjectKind() ` 方法,故各资源类型只需要实现 ` DeepCopyObject() ` 方法。
108
108
109
- 我们不需要手动为各资源类型定义 ` DeepCopyObject() ` 方法,而是使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成该方法 。
109
+ 我们不需要手动为各资源类型定义 ` DeepCopyObject() ` 方法,而是使用 ` deepcopy-gen ` 工具命令统一、自动地生成该方法 。
110
110
111
111
deepcopy-gen 工具读取 ` types.go ` 文件中的 ` +k8s:deepcopy-gen ` 注释,如:
112
112
113
113
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
114
114
115
- 然后将生成的结果保存到 ` zz_generated.deepcopy.go ` 文件,以 ` Deployment ` 类型为例:
115
+ 然后将生成的结果保存到 ` zz_generated.deepcopy.go ` 文件。
116
+
117
+ 以 ` Deployment ` 类型为例:
116
118
117
119
``` go
118
120
// 来源于:k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go
@@ -137,9 +139,9 @@ func (in *Deployment) DeepCopyObject() runtime.Object {
137
139
138
140
### register.go 文件
139
141
140
- 使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成` DeepCopyObject() ` 方法后,各资源类型就满足了 ` runtime.Object ` 接口,进而可以注册到 Scheme 中。
142
+ 使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成 ` DeepCopyObject() ` 方法后,各资源类型就满足了 ` runtime.Object ` 接口,进而可以注册到 Scheme 中。
141
143
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 和对象之间的转换了 。
143
145
144
146
``` go
145
147
// 来源于:k8s.io/api/extensions/v1beta1/register.go
@@ -178,11 +180,12 @@ func addKnownTypes(scheme *runtime.Scheme) error {
178
180
179
181
## 注册所有内置资源类型到 Scheme 对象
180
182
181
- 需要将 ` k8s.io/api/<group>/<version> ` 目录下的各资源类型注册到** 全局 Scheme 对象** ,这样 Clienset 才能识别和使用它们的对象 。
183
+ 需要将 ` k8s.io/api/<group>/<version> ` 目录下的各资源类型注册到** 全局 Scheme 对象** ,这样 Clienset 才能识别和使用它们 。
182
184
183
185
client-go 的 ` scheme package ` (k8s.io/client-go/kubernetes/scheme/)定义了这个全局 ` Scheme ` 对象,并将各 ` k8s.io/api/<Group>/<Version> ` 目录下的资源类型注册到它上面。
184
186
185
187
Scheme 对象还被用于创建另外两个外部对象:
188
+
186
189
1 . 对资源类型对象进行编解码(序列化/反序列化)的工厂对象 ` Codecs ` ,后续使用它配置 ` rest.Config.NegotiatedSerializer ` ;
187
190
2 . 参数编解码对象 ` ParameterCodec ` ,后续调用 RestFul 的方法时使用,如 ` VersionedParams(&options, scheme.ParameterCodec) ` 。
188
191
@@ -279,6 +282,7 @@ func (c *Clientset) ExtensionsV1beta1() extensionsv1beta1.ExtensionsV1beta1Inter
279
282
` k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go ` 。
280
283
281
284
比较关键的是 ` setConfigDefaults() ` 函数,它负责为 Clientset 配置参数:
285
+
282
286
1 . 资源对象的 GroupVersion;
283
287
2 . 资源对象的 root path;
284
288
3 . 对 wired data 进行编解码(序列化/反序列化)的 ` NegotiatedSerializer ` ,使用的 ` scheme.Codecs ` 为前面介绍过的 ` scheme package ` ;
0 commit comments