1
- # Kubernetes API Client
1
+ # Kubernetes Clientset
2
2
3
3
<!-- TOC -->
4
4
5
- - [ Kubernetes API Client ] ( #kubernetes-api-client )
5
+ - [ Kubernetes Clientset ] ( #kubernetes-clientset )
6
6
- [ 资源类型 Scheme] ( #资源类型-scheme )
7
- - [ 定义资源类型的 types.go 文件] ( #定义资源类型的- typesgo-文件 )
8
- - [ runtime.Object 接口和 DeepCopyObject() 方法 ] ( #runtimeobject-接口和-deepcopyobject-方法 )
9
- - [ 各资源类型 Scheme 的 register.go 文件] ( #各资源类型-scheme-的- registergo-文件 )
7
+ - [ types.go 文件] ( #typesgo-文件 )
8
+ - [ zz_generated.deepcopy.go 文件 ] ( #zz_generateddeepcopygo-文件 )
9
+ - [ register.go 文件] ( #registergo-文件 )
10
10
- [ 注册所有内置资源类型到 Scheme 对象] ( #注册所有内置资源类型到-scheme-对象 )
11
11
- [ 创建和使用 Kubernetes Clientset] ( #创建和使用-kubernetes-clientset )
12
12
- [ 创建支持所有资源类型的全局 Clientset] ( #创建支持所有资源类型的全局-clientset )
19
19
20
20
## 资源类型 Scheme
21
21
22
- Clienset 是调用资源对象类型相关的方法来对它进行操作,所以在和 apiserver 通信时,需要能对资源对象类型及参数进行 ** 编解码(序列化/反序列化)** 。
22
+ Clienset 和 apiserver 通信时,需要根据资源对象的类型生成 Resource URL、对 Wire-data 进行 ** 编解码(序列化/反序列化)** 。
23
23
24
- 资源对象的 Group、Version、Kind、go struct 定义、编解码(序列化/反序列化) 等内容构成了它的 ` Scheme ` 。
24
+ 资源类型的 Group、Version、Kind、go struct 定义、编解码(序列化/反序列化) 等内容构成了它的 ` Scheme ` 。
25
25
26
- 对于 K8S 内置资源对象,它们的 Scheme 位于 ` k8s.io/api/<group>/<version> ` 目录下,以 ` Deployment ` 为例:
26
+ K8S 内置资源类型的 Scheme 位于 ` k8s.io/api/<group>/<version> ` 目录下,以 ` Deployment ` 为例:
27
27
28
28
``` bash
29
29
$ pwd
@@ -46,9 +46,9 @@ total 1048
46
46
2 . zz_generated.deepcopy.go:` deepcopy-gen ` 工具自动创建的、包含各资源类型的 ` DeepCopyObject() ` 方法的文件;
47
47
3 . register.go:定义了 ` AddToScheme() ` 函数,用于将本 ` <group>/<version> ` 下的各资源类型注册到 Clientset 使用的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/);
48
48
49
- ### 定义资源类型的 types.go 文件
49
+ ### types.go 文件
50
50
51
- 该文件定义了资源类型相关的 go struct,以及 codegen 工具注释 :
51
+ 该文件定义了资源类型相关的 go struct 及 codegen 命令行工具使用的注释 :
52
52
53
53
``` go
54
54
// 来源于:k8s.io/api/extensions/v1beta1/types.go
@@ -90,9 +90,9 @@ type DeploymentSpec struct {
90
90
}
91
91
```
92
92
93
- ### runtime.Object 接口和 DeepCopyObject() 方法
93
+ ### zz_generated.deepcopy.go 文件
94
94
95
- 所有注册到 Scheme 的资源类型,都需要实现 ` runtime.Object ` 接口:
95
+ 所有注册到 Scheme 的资源类型都要实现 ` runtime.Object ` 接口:
96
96
97
97
``` go
98
98
// 来源于:k8s.io/apimachinery/pkg/runtime/interfaces.go
@@ -102,7 +102,7 @@ type Object interface {
102
102
}
103
103
```
104
104
105
- K8S 各资源类型的 go struct 定义都嵌入了 ` metav1.TypeMeta ` 类型,该类型实现了 ` GetObjectKind() ` 方法,故各资源类型只需要实现 ` DeepCopyObject() ` 方法即可 。
105
+ K8S 各资源类型的 go struct 定义都嵌入了 ` metav1.TypeMeta ` 类型,而该类型实现了 ` GetObjectKind() ` 方法,故各资源类型只需要实现 ` DeepCopyObject() ` 方法 。
106
106
107
107
我们不需要手动为各资源类型定义 ` DeepCopyObject() ` 方法,而是使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成该方法。
108
108
@@ -133,11 +133,11 @@ func (in *Deployment) DeepCopyObject() runtime.Object {
133
133
}
134
134
```
135
135
136
- ### 各资源类型 Scheme 的 register.go 文件
136
+ ### register.go 文件
137
137
138
138
使用 ` deepcopy-gen ` 工具命令统一、自动地为各资源类型生成` DeepCopyObject() ` 方法后,各资源类型就满足了 ` runtime.Object ` 接口,进而可以注册到 Scheme 中。
139
139
140
- 各 API Group 的各 Version 目录下,都有一个 ` register.go ` 文件,该文件对外提供的 ` AddToScheme() ` 方法用于将本 Group/Version 下的各资源类型定义注册到 ** 传入** 的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/register.go 中创建该 Scheme 对象)。
140
+ 各 API Group 的各 Version 目录下,都有一个 ` register.go ` 文件,该文件对外提供的 ` AddToScheme() ` 方法用于将本 Group/Version 下的各资源类型注册到 ** 传入** 的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/register.go 中创建该 Scheme 对象),然后 Clientset 就可以使用它对各类型对象进行编解码了 。
141
141
142
142
``` go
143
143
// 来源于:k8s.io/api/extensions/v1beta1/register.go
@@ -176,11 +176,11 @@ func addKnownTypes(scheme *runtime.Scheme) error {
176
176
177
177
## 注册所有内置资源类型到 Scheme 对象
178
178
179
- 需要将 ` k8s.io/api/<group>/<version> ` 目录下的各资源类型注册到** 全局 Scheme 对象** ,这样 Clienset 才能识别和使用它们 。
179
+ 需要将 ` k8s.io/api/<group>/<version> ` 目录下的各资源类型注册到** 全局 Scheme 对象** ,这样 Clienset 才能识别和使用它们的对象 。
180
180
181
181
client-go 的 ` scheme package ` (k8s.io/client-go/kubernetes/scheme/)定义了这个全局 ` Scheme ` 对象,并将各 ` k8s.io/api/<Group>/<Version> ` 目录下的资源类型注册到它上面。
182
182
183
- 同时用 Scheme 对象创建 :
183
+ Scheme 对象还被用于创建另外两个外部对象 :
184
184
1 . 对资源类型对象进行编解码(序列化/反序列化)的工厂对象 ` Codecs ` ,后续使用它配置 ` rest.Config.NegotiatedSerializer ` ;
185
185
2 . 参数编解码对象 ` ParameterCodec ` ,后续调用 RestFul 的方法时使用,如 ` VersionedParams(&options, scheme.ParameterCodec) ` 。
186
186
@@ -239,13 +239,11 @@ deploy, err := c.kubeclientset.ExtensionsV1beta1().Deployments(aolDeploy.ObjectM
239
239
2 . 使用 Kubernetes 的 RestFul 配置参数,创建 Clientset;
240
240
3 . 调用 Clientset 的方法对资源对象进行 CRUD;
241
241
242
- 在详细分析 kuberntes 的 ` NewForConfig() ` 函数前。
243
-
244
242
## 创建支持所有资源类型的全局 Clientset
245
243
246
244
` k8s.io/client-go/kubernetes/clientset.go ` 文件中创建的 Clientset 实际上是对各资源类型的 Clientset 做了一次封装:
247
245
248
- 1 . 调用各资源类型的 NewForConfig() 函数创建对应的 Clientset,并注册到内部的同名 field 中 ;
246
+ 1 . 调用各资源类型的 NewForConfig() 函数创建对应的 Clientset;
249
247
2 . 后续可以使用 Clientset.<Group ><Version >(),如 Clientset.ExtensionsV1beta1() 来调用具体资源类型的 Clientset;
250
248
251
249
``` go
@@ -326,7 +324,7 @@ func (c *ExtensionsV1beta1Client) Deployments(namespace string) DeploymentInterf
326
324
327
325
## 各资源类型的 RestFul 方法
328
326
329
- 调用 RestClient 时需要指定参数的编解码工厂 ` scheme.ParameterCodec ` ,位于前面介绍的 ` scheme package ` 中。
327
+ 使用各资源类型的 Clientset 创建资源类型的 RestFul 方法,参数的编解码工厂 ` scheme.ParameterCodec ` 来源于前面介绍的 ` scheme package ` 中。
330
328
331
329
``` go
332
330
// 来源于 k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go
0 commit comments