Skip to content

Commit 55eb288

Browse files
author
Zhang Jun
committed
clientset: update
1 parent bed6427 commit 55eb288

File tree

1 file changed

+19
-21
lines changed

1 file changed

+19
-21
lines changed

client-go/5.scheme-clientset.md

+19-21
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# Kubernetes API Client
1+
# Kubernetes Clientset
22

33
<!-- TOC -->
44

5-
- [Kubernetes API Client](#kubernetes-api-client)
5+
- [Kubernetes Clientset](#kubernetes-clientset)
66
- [资源类型 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-文件)
1010
- [注册所有内置资源类型到 Scheme 对象](#注册所有内置资源类型到-scheme-对象)
1111
- [创建和使用 Kubernetes Clientset](#创建和使用-kubernetes-clientset)
1212
- [创建支持所有资源类型的全局 Clientset](#创建支持所有资源类型的全局-clientset)
@@ -19,11 +19,11 @@
1919

2020
## 资源类型 Scheme
2121

22-
Clienset 是调用资源对象类型相关的方法来对它进行操作,所以在和 apiserver 通信时,需要能对资源对象类型及参数进行**编解码(序列化/反序列化)**
22+
Clienset apiserver 通信时,需要根据资源对象的类型生成 Resource URL、对 Wire-data 进行**编解码(序列化/反序列化)**
2323

24-
资源对象的 Group、Version、Kind、go struct 定义、编解码(序列化/反序列化) 等内容构成了它的 `Scheme`
24+
资源类型的 Group、Version、Kind、go struct 定义、编解码(序列化/反序列化) 等内容构成了它的 `Scheme`
2525

26-
对于 K8S 内置资源对象,它们的 Scheme 位于 `k8s.io/api/<group>/<version>` 目录下,以 `Deployment` 为例:
26+
K8S 内置资源类型的 Scheme 位于 `k8s.io/api/<group>/<version>` 目录下,以 `Deployment` 为例:
2727

2828
``` bash
2929
$ pwd
@@ -46,9 +46,9 @@ total 1048
4646
2. zz_generated.deepcopy.go:`deepcopy-gen` 工具自动创建的、包含各资源类型的 `DeepCopyObject()` 方法的文件;
4747
3. register.go:定义了 `AddToScheme()` 函数,用于将本 `<group>/<version>` 下的各资源类型注册到 Clientset 使用的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/);
4848

49-
### 定义资源类型的 types.go 文件
49+
### types.go 文件
5050

51-
该文件定义了资源类型相关的 go struct,以及 codegen 工具注释
51+
该文件定义了资源类型相关的 go structcodegen 命令行工具使用的注释
5252

5353
``` go
5454
// 来源于:k8s.io/api/extensions/v1beta1/types.go
@@ -90,9 +90,9 @@ type DeploymentSpec struct {
9090
}
9191
```
9292

93-
### runtime.Object 接口和 DeepCopyObject() 方法
93+
### zz_generated.deepcopy.go 文件
9494

95-
所有注册到 Scheme 的资源类型,都需要实现 `runtime.Object` 接口:
95+
所有注册到 Scheme 的资源类型都要实现 `runtime.Object` 接口:
9696

9797
``` go
9898
// 来源于:k8s.io/apimachinery/pkg/runtime/interfaces.go
@@ -102,7 +102,7 @@ type Object interface {
102102
}
103103
```
104104

105-
K8S 各资源类型的 go struct 定义都嵌入了 `metav1.TypeMeta` 类型,该类型实现了 `GetObjectKind()` 方法,故各资源类型只需要实现 `DeepCopyObject()` 方法即可
105+
K8S 各资源类型的 go struct 定义都嵌入了 `metav1.TypeMeta` 类型,而该类型实现了 `GetObjectKind()` 方法,故各资源类型只需要实现 `DeepCopyObject()` 方法
106106

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

@@ -133,11 +133,11 @@ func (in *Deployment) DeepCopyObject() runtime.Object {
133133
}
134134
```
135135

136-
### 各资源类型 Scheme 的 register.go 文件
136+
### register.go 文件
137137

138138
使用 `deepcopy-gen` 工具命令统一、自动地为各资源类型生成`DeepCopyObject()` 方法后,各资源类型就满足了 `runtime.Object` 接口,进而可以注册到 Scheme 中。
139139

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 就可以使用它对各类型对象进行编解码了
141141

142142
``` go
143143
// 来源于:k8s.io/api/extensions/v1beta1/register.go
@@ -176,11 +176,11 @@ func addKnownTypes(scheme *runtime.Scheme) error {
176176

177177
## 注册所有内置资源类型到 Scheme 对象
178178

179-
需要将 `k8s.io/api/<group>/<version>` 目录下的各资源类型注册到**全局 Scheme 对象**,这样 Clienset 才能识别和使用它们
179+
需要将 `k8s.io/api/<group>/<version>` 目录下的各资源类型注册到**全局 Scheme 对象**,这样 Clienset 才能识别和使用它们的对象
180180

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

183-
同时用 Scheme 对象创建
183+
Scheme 对象还被用于创建另外两个外部对象
184184
1. 对资源类型对象进行编解码(序列化/反序列化)的工厂对象 `Codecs`,后续使用它配置 `rest.Config.NegotiatedSerializer`
185185
2. 参数编解码对象 `ParameterCodec`,后续调用 RestFul 的方法时使用,如 `VersionedParams(&options, scheme.ParameterCodec)`
186186

@@ -239,13 +239,11 @@ deploy, err := c.kubeclientset.ExtensionsV1beta1().Deployments(aolDeploy.ObjectM
239239
2. 使用 Kubernetes 的 RestFul 配置参数,创建 Clientset;
240240
3. 调用 Clientset 的方法对资源对象进行 CRUD;
241241

242-
在详细分析 kuberntes 的 `NewForConfig()` 函数前。
243-
244242
## 创建支持所有资源类型的全局 Clientset
245243

246244
`k8s.io/client-go/kubernetes/clientset.go` 文件中创建的 Clientset 实际上是对各资源类型的 Clientset 做了一次封装:
247245

248-
1. 调用各资源类型的 NewForConfig() 函数创建对应的 Clientset,并注册到内部的同名 field 中
246+
1. 调用各资源类型的 NewForConfig() 函数创建对应的 Clientset;
249247
2. 后续可以使用 Clientset.<Group><Version>(),如 Clientset.ExtensionsV1beta1() 来调用具体资源类型的 Clientset;
250248

251249
``` go
@@ -326,7 +324,7 @@ func (c *ExtensionsV1beta1Client) Deployments(namespace string) DeploymentInterf
326324

327325
## 各资源类型的 RestFul 方法
328326

329-
调用 RestClient 时需要指定参数的编解码工厂 `scheme.ParameterCodec`,位于前面介绍的 `scheme package` 中。
327+
使用各资源类型的 Clientset 创建资源类型的 RestFul 方法,参数的编解码工厂 `scheme.ParameterCodec` 来源于前面介绍的 `scheme package` 中。
330328

331329
``` go
332330
// 来源于 k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go

0 commit comments

Comments
 (0)