Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 12 additions & 8 deletions
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‎

Lines changed: 3 additions & 2 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /