K8s源码分析(22)-client go组件之clientset

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

资源操作对象工厂的工厂

clientset 就是资源操作对象工厂的工厂,其图解和相关源码如下:

911b1df5077ded7b9f604110457dbfca.png

// 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 中的相关存储组件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值