Skip to content

Commit 9b5abf3

Browse files
author
Zhang Jun
committed
update
1 parent 4e307a5 commit 9b5abf3

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

client-go/5.scheme-clientset-codegen.md

+12-8
Original file line numberDiff line numberDiff line change
@@ -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()` 方法的文件;
4949
3. 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

107107
K8S 各资源类型的 go struct 定义都嵌入了 `metav1.TypeMeta` 类型,而该类型实现了 `GetObjectKind()` 方法,故各资源类型只需要实现 `DeepCopyObject()` 方法。
108108

109-
我们不需要手动为各资源类型定义 `DeepCopyObject()` 方法,而是使用 `deepcopy-gen` 工具命令统一、自动地为各资源类型生成该方法
109+
我们不需要手动为各资源类型定义 `DeepCopyObject()` 方法,而是使用 `deepcopy-gen` 工具命令统一、自动地生成该方法
110110

111111
deepcopy-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

183185
client-go 的 `scheme package`(k8s.io/client-go/kubernetes/scheme/)定义了这个全局 `Scheme` 对象,并将各 `k8s.io/api/<Group>/<Version>` 目录下的资源类型注册到它上面。
184186

185187
Scheme 对象还被用于创建另外两个外部对象:
188+
186189
1. 对资源类型对象进行编解码(序列化/反序列化)的工厂对象 `Codecs`,后续使用它配置 `rest.Config.NegotiatedSerializer`
187190
2. 参数编解码对象 `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+
282286
1. 资源对象的 GroupVersion;
283287
2. 资源对象的 root path;
284288
3. 对 wired data 进行编解码(序列化/反序列化)的 `NegotiatedSerializer`,使用的 `scheme.Codecs` 为前面介绍过的 `scheme package`

client-go/README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Kubernetes client-go 库介绍
1+
# Kubernetes client-go 库介绍和源码解析
22

33
client-go 项目地址:https://github.com/kubernetes/client-go
44

@@ -122,4 +122,5 @@ github 上关于 client-go 的设计有一副[概览图](https://github.com/kube
122122
controller可以直接创建上述两个引用对象去处理,也可以采用工厂模式,官方都有相关示例
123123

124124
## 参考
125-
1. [Kubernetes的client-go库介绍](https://www.jianshu.com/p/d17f70369c35)
125+
1. [Kubernetes的client-go库介绍](https://www.jianshu.com/p/d17f70369c35)
126+
2. [client-go under the hood](https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md)

0 commit comments

Comments
 (0)