介绍

Kubernetes 官网从 2016 年 8 月份开始,将 Kubernetes 资源操作相干的外围源码抽取进去,独立进去一个我的项目 client-go,Kubernetes中应用client-go作为Go语言的官网编程式交互客户端库,提供对api server服务的交互拜访。对于k8s的二次开发,熟练掌握client-go是十分必要的。

源码地址:https://hub.fastgit.org/kubernetes/client-go.git

我的项目目录解析

.├── applyconfigurations├── CHANGELOG.md├── code-of-conduct.md├── CONTRIBUTING.md├── discovery  # 通过Kubernetes API进行服务发现├── dynamic  # 对Kubernetes对象执行通用操作的动静client├── examples├── go.mod├── go.sum├── informers  # 一个十分牛逼的交互方式,通过reflector watch资源的事件放入队列(DeltaFIFO)中,通过sharedProcessor的pendingNotifications(buffer.RingGrowing)来散发事件到具体的ResourceEventHandler中的OnAdd/OnUpdate/OnDelete进行解决.这个各informers前面具体介绍├── INSTALL.md├── kubernetes # 提供 ClientSet 客户端├── kubernetes_test├── LICENSE├── listers # 为每一个 K8S 资源提供 Lister 性能,该性能对 Get 和 List 申请提供只读的缓存数据├── metadata├── OWNERS├── pkg├── plugin # 提供 OpenStack,GCP 和 Azure 等云服务商受权插件├── README.md├── rest  # 提供 RESTClient 客户端,对 K8S API Server 执行 RESTful 操作├── restmapper├── scale # 提供 ScaleClient 客户端,用于扩容或缩容 Deployment, Replicaset, Replication Controller 等资源对象├── SECURITY_CONTACTS├── testing├── third_party├── tools # 上面的/clientcmd提供了创立客户端的一些根底的工具├── transport # 提供平安的 TCP 连贯,反对 HTTP Stream,某些操作须要在客户端和容器之间传输二进制流,例如 exec,attach 等操作└── util # 提供罕用办法。例如 WorkQueue 工作队列,Certificate 证书治理等19 directories, 10 files

Client类型

  1. RESTClient:RESTClient 是最根底的,相当于的底层根底构造,能够间接通过 RESTClient 提供的 RESTful 办法如 Get(),Put(),Post(),Delete() 进行交互

    • 同时反对 Json 和 protobuf
    • 反对所有原生资源和 CRDs
    • 然而,一般而言,为了更为优雅的解决,须要进一步封装,通过 clientset 封装 RESTClient,而后再对外提供接口和服务;
  2. Clientset:Clientset 是调用 Kubernetes 资源对象最罕用的 client,能够操作所有的资源对象,它是基于 RESTClient 实现的。

    • 拜访资源时,须要指定它的 Group、Version、Resource;
    • 优雅的姿态是利用一个 controller 对象,再加上 Informer;
  3. DynamicClient:DynamicClient 是一种动静的 client,它能解决 kubernetes 所有的资源。不同于 Clientset,DynamicClient 返回的对象是一个 map[string]interface{}

    • 如果一个 controller 中须要管制所有的 API,能够应用 DynamicClient,目前它在 garbage collector 和 namespace controller 中被应用。
    • 只反对 JSON

Informer剖析

官网原理图,阐明了client-go库中各组件的工作流程,以及将要编写的自定义控制器代码的交互点

原理图剖析:

client-go组件:

  1. Reflector: 定义在 /tools/cache 包内的 Reflector 类型 中的 reflector 监督 Kubernetes API 以获取指定的资源类型 (Kind)。实现此操作的函数是 ListAndWatch。监督能够用于内建资源,也能够用于自定义资源。当 reflector 通过监督 API 的收到对于新资源实例存在的告诉时,它应用相应的 listing API 获取新创建的对象,并将其放入 watchHandler 函数内的 Delta Fifo 队列中。
  2. Informer: 在 /tools/cache 包内的根底 controller 中定义的一个 informer 从 Delta FIFO 队列中弹出对象。实现此操作的函数是 processLoop。这个根底 controller 的工作是保留对象以供当前检索,并调用 controller 将对象传递给它。
  3. Indexer: indexer 为对象提供索引性能。它定义在 /tools/cache 包内的 Indexer 类型。一个典型的索引用例是基于对象标签创立索引。Indexer 能够基于多个索引函数保护索引。Indexer 应用线程平安的数据存储来存储对象及其键值。在 /tools/cache 包内的 Store 类型 定义了一个名为 MetaNamespaceKeyFunc 的默认函数,该函数为该对象生成一个名为 <namespace>/<name> 组合的对象键值。

Custom Controller组件:

  1. Informer reference: 这是一个晓得如何应用自定义资源对象的 Informer 实例的援用。您的自定义控制器代码须要创立适当的 Informer。
  2. Indexer reference: 这是一个晓得如何应用自定义资源对象的 Indexer 实例的援用。您的自定义控制器代码须要创立这个。您将应用此援用检索对象,以便稍后解决。
  3. Resource Event Handlers: 当 Informer 想要散发一个对象给你的控制器时,会调用这些回调函数。编写这些函数的典型模式是获取已调配对象的键值,并将该键值放入一个工作队列中进行进一步解决。
  4. Work queue: 这是在控制器代码中创立的队列,用于将对象的散发与处了解耦。编写 Resource Event Handler 函数来提取所散发对象的键值并将其增加到工作队列中。
  5. Process Item: 这是在代码中创立的解决 work queue 中的 items 的函数。能够有一个或多个其余函数来执行理论的解决。这些函数通常应用 Indexer 援用 或 Listing wrapper 来获取与键值对应的对象。

原理图对应的代码剖析:

client-go/tools/cache.├── controller.go # 蕴含:Config、Run、processLoop、NewInformer、NewIndexerInformer├── controller_test.go├── delta_fifo.go # 蕴含:NewDeltaFIFO、DeltaFIFO、AddIfNotPresent├── delta_fifo_test.go├── doc.go├── expiration_cache_fakes.go├── expiration_cache.go├── expiration_cache_test.go├── fake_custom_store.go├── fifo.go # 蕴含:Queue、FIFO、NewFIFO├── fifo_test.go├── heap.go├── heap_test.go├── index.go # 蕴含:Indexer、MetaNamespaceIndexFunc├── index_test.go├── listers.go├── listwatch.go # 蕴含:ListerWatcher、ListWatch、List、Watch├── main_test.go├── mutation_cache.go├── mutation_detector.go├── mutation_detector_test.go├── OWNERS├── processor_listener_test.go├── reflector.go # 蕴含:Reflector、NewReflector、Run、ListAndWatch├── reflector_metrics.go├── reflector_test.go├── shared_informer.go # 蕴含:NewSharedInformer、WaitForCacheSync、Run、HasSynced├── shared_informer_test.go├── store.go # 蕴含:Store、MetaNamespaceKeyFunc、SplitMetaNamespaceKey├── store_test.go├── testing│   ├── fake_controller_source.go│   └── fake_controller_source_test.go├── thread_safe_store.go # 蕴含:ThreadSafeStore、threadSafeMap├── thread_safe_store_test.go├── undelta_store.go└── undelta_store_test.go1 directory, 36 files

参考链接:

https://zhuanlan.zhihu.com/p/202611841?utm_source=wechat_session