上一篇文章里,我们主要介绍了不同组还有版本下的资源操作对象,以及资源操作对象工厂和工厂的实例化。该工厂是对于某一组下某一个版本资源操作对象的工厂,那么对于这些工厂对象是如何获取到的呢,kubernetes 提供了 clientset 这个对象用来获取所有的工厂,换句话来说,clientset 就是资源操作对象工厂的工厂。本篇文章里我们主要来介绍这个对象。
资源操作对象工厂的工厂
clientset 就是资源操作对象工厂的工厂,其图解和相关源码如下:

- // staging/src/k8s.io/client-go/kubernetes/clientset.go
- type Interface interface {
- Discovery() discovery.DiscoveryInterface
- AdmissionregistrationV1() admissionregistrationv1.AdmissionregistrationV1Interface
- AdmissionregistrationV1beta1() admissionregistrationv1beta1.AdmissionregistrationV1beta1Interface
- InternalV1alpha1() internalv1alpha1.InternalV1alpha1Interface
- AppsV1() appsv1.AppsV1Interface
- AppsV1beta1() appsv1beta1.AppsV1beta1Interface
- AppsV1beta2() appsv1beta2.AppsV1beta2Interface
- ......
- }
-
-
- type Clientset struct {
- *discovery.DiscoveryClient
- admissionregistrationV1 *admissionregistrationv1.AdmissionregistrationV1Client
- admissionregistrationV1beta1 *admissionregistrationv1beta1.AdmissionregistrationV1beta1Client
- internalV1alpha1 *internalv1alpha1.InternalV1alpha1Client
- appsV1 *appsv1.AppsV1Client
- appsV1beta1 *appsv1beta1.AppsV1beta1Client
- appsV1beta2 *appsv1beta2.AppsV1beta2Client
- ......
- }
-
-
- func (c *Clientset) AppsV1() appsv1.AppsV1Interface {
- return c.appsV1
- }
-
-
- func (c *Clientset) AppsV1beta1() appsv1beta1.AppsV1beta1Interface {
- return c.appsV1beta1
- }
-
-
- func (c *Clientset) AppsV1beta2() appsv1beta2.AppsV1beta2Interface {
- return c.appsV1beta2
- }
Interface 接口封装了所有资源操作对象的工厂,所以可以把该接口看作是资源操作对象工厂的工厂定义。
Clientset 结构体实现了上面定义的接口,所以通过该结构体可以得到某一组某一版本下所有资源操作对象的工厂,也就间接获得了所有的资源操作对象。
Clientset对象的实例化
clientset 对象的创建相关源码如下:
- // staging/src/k8s.io/client-go/kubernetes/clientset.go
- func NewForConfig(c *rest.Config) (*Clientset, error) {
- configShallowCopy := *c
- if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
- if configShallowCopy.Burst <= 0 {
- return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
- }
- configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
- }
- var cs Clientset
- var err error
- cs.admissionregistrationV1, err = admissionregistrationv1.NewForConfig(&configShallowCopy)
- if err != nil {
- return nil, err
- }
- cs.admissionregistrationV1beta1, err = admissionregistrationv1beta1.NewForConfig(&configShallowCopy)
- if err != nil {
- return nil, err
- }
- cs.internalV1alpha1, err = internalv1alpha1.NewForConfig(&configShallowCopy)
- if err != nil {
- return nil, err
- }
- cs.appsV1, err = appsv1.NewForConfig(&configShallowCopy)
- if err != nil {
- return nil, err
- }
- cs.appsV1beta1, err = appsv1beta1.NewForConfig(&configShallowCopy)
- if err != nil {
- return nil, err
- }
- cs.appsV1beta2, err = appsv1beta2.NewForConfig(&configShallowCopy)
- if err != nil {
- return nil, err
- }
- ......
- return &cs, nil
- }
Clientset 创建的核心就是利用 config 对象构造前一篇文章中介绍资源操作对象工厂。
把所有组下所有版本的资源操作对象工厂封装在实例化的 Clientset 对象中。
目前我们先写到这里,在下一篇文章中我们继续介绍 client go 中的相关存储组件。