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


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

    资源操作对象工厂的工厂

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

    6f44a8f96819b740cce3cb0c4f4efccb.png

    1. // staging/src/k8s.io/client-go/kubernetes/clientset.go
    2. type Interface interface {
    3. Discovery() discovery.DiscoveryInterface
    4. AdmissionregistrationV1() admissionregistrationv1.AdmissionregistrationV1Interface
    5. AdmissionregistrationV1beta1() admissionregistrationv1beta1.AdmissionregistrationV1beta1Interface
    6. InternalV1alpha1() internalv1alpha1.InternalV1alpha1Interface
    7. AppsV1() appsv1.AppsV1Interface
    8. AppsV1beta1() appsv1beta1.AppsV1beta1Interface
    9. AppsV1beta2() appsv1beta2.AppsV1beta2Interface
    10. ......
    11. }
    12. type Clientset struct {
    13. *discovery.DiscoveryClient
    14. admissionregistrationV1 *admissionregistrationv1.AdmissionregistrationV1Client
    15. admissionregistrationV1beta1 *admissionregistrationv1beta1.AdmissionregistrationV1beta1Client
    16. internalV1alpha1 *internalv1alpha1.InternalV1alpha1Client
    17. appsV1 *appsv1.AppsV1Client
    18. appsV1beta1 *appsv1beta1.AppsV1beta1Client
    19. appsV1beta2 *appsv1beta2.AppsV1beta2Client
    20. ......
    21. }
    22. func (c *Clientset) AppsV1() appsv1.AppsV1Interface {
    23. return c.appsV1
    24. }
    25. func (c *Clientset) AppsV1beta1() appsv1beta1.AppsV1beta1Interface {
    26. return c.appsV1beta1
    27. }
    28. func (c *Clientset) AppsV1beta2() appsv1beta2.AppsV1beta2Interface {
    29. return c.appsV1beta2
    30. }
    • Interface 接口封装了所有资源操作对象的工厂,所以可以把该接口看作是资源操作对象工厂的工厂定义。

    • Clientset 结构体实现了上面定义的接口,所以通过该结构体可以得到某一组某一版本下所有资源操作对象的工厂,也就间接获得了所有的资源操作对象。

    Clientset对象的实例化

    clientset 对象的创建相关源码如下:

    1. // staging/src/k8s.io/client-go/kubernetes/clientset.go
    2. func NewForConfig(c *rest.Config) (*Clientset, error) {
    3. configShallowCopy := *c
    4. if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
    5. if configShallowCopy.Burst <= 0 {
    6. 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")
    7. }
    8. configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
    9. }
    10. var cs Clientset
    11. var err error
    12. cs.admissionregistrationV1, err = admissionregistrationv1.NewForConfig(&configShallowCopy)
    13. if err != nil {
    14. return nil, err
    15. }
    16. cs.admissionregistrationV1beta1, err = admissionregistrationv1beta1.NewForConfig(&configShallowCopy)
    17. if err != nil {
    18. return nil, err
    19. }
    20. cs.internalV1alpha1, err = internalv1alpha1.NewForConfig(&configShallowCopy)
    21. if err != nil {
    22. return nil, err
    23. }
    24. cs.appsV1, err = appsv1.NewForConfig(&configShallowCopy)
    25. if err != nil {
    26. return nil, err
    27. }
    28. cs.appsV1beta1, err = appsv1beta1.NewForConfig(&configShallowCopy)
    29. if err != nil {
    30. return nil, err
    31. }
    32. cs.appsV1beta2, err = appsv1beta2.NewForConfig(&configShallowCopy)
    33. if err != nil {
    34. return nil, err
    35. }
    36. ......
    37. return &cs, nil
    38. }
    • Clientset 创建的核心就是利用 config 对象构造前一篇文章中介绍资源操作对象工厂。

    • 把所有组下所有版本的资源操作对象工厂封装在实例化的 Clientset 对象中。

    目前我们先写到这里,在下一篇文章中我们继续介绍 client go 中的相关存储组件。

  • 相关阅读:
    12.(地图数据篇)cesium城市建筑物贴图
    Java基础-day03
    reids基础数据结构
    从容器化到资源池化,数栈云原生技术实践探索之路
    1230. K倍区间(前缀和)
    Netty:入门(2)
    项目整体管理
    【无标题】
    ZYNQ7020--动态加载CPU1程序<1>
    10 个高频 Python 面试题
  • 原文地址:https://blog.csdn.net/weixin_46073333/article/details/125568037