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 ) 
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
46462 .  zz_generated.deepcopy.go:` deepcopy-gen `  工具自动创建的、包含各资源类型的 ` DeepCopyObject() `  方法的文件;
47473 .  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 struct 及  codegen 命令行工具使用的注释 :
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
181181client-go 的 ` scheme package ` (k8s.io/client-go/kubernetes/scheme/)定义了这个全局 ` Scheme `  对象,并将各 ` k8s.io/api/<Group>/<Version> `  目录下的资源类型注册到它上面。
182182
183- 同时用  Scheme 对象创建 :
183+ Scheme 对象还被用于创建另外两个外部对象 :
1841841 .  对资源类型对象进行编解码(序列化/反序列化)的工厂对象 ` Codecs ` ,后续使用它配置 ` rest.Config.NegotiatedSerializer ` ;
1851852 .  参数编解码对象 ` ParameterCodec ` ,后续调用 RestFul 的方法时使用,如 ` VersionedParams(&options, scheme.ParameterCodec) ` 。
186186
@@ -239,13 +239,11 @@ deploy, err := c.kubeclientset.ExtensionsV1beta1().Deployments(aolDeploy.ObjectM
2392392 .  使用 Kubernetes 的 RestFul 配置参数,创建 Clientset;
2402403 .  调用 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;
2492472 .  后续可以使用 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