前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8s源码分析(22)-client go组件之clientset

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

作者头像
TA码字
发布2022-10-30 13:23:51
5760
发布2022-10-30 13:23:51
举报
文章被收录于专栏:TA码字TA码字

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

资源操作对象工厂的工厂

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

代码语言:javascript
复制
// 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 对象的创建相关源码如下:

代码语言:javascript
复制
// 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 中的相关存储组件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档