介绍

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

Kubernetes客户端client-go简介相关推荐

  1. [转载]Zookeeper开源客户端框架Curator简介

    转载声明:http://macrochen.iteye.com/blog/1366136 Zookeeper开源客户端框架Curator简介 博客分类: Distributed Open Source ...

  2. Kubernetes Python Client

    一.概述 Kubernetes官方维护的Python客户端client-python, 地址:https://github.com/kubernetes-client/python 安装模块 pip3 ...

  3. 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器客户端完整代码示例 | 运行服务器端与客户端效果及过程分析 )

    文章目录 一.服务器端完整代码 Server.groovy 二.客户端完整代码 Client.groovy 三.运行服务器端与客户端效果及过程分析 一.服务器端完整代码 Server.groovy 参 ...

  4. 【RK3399Pro学习笔记】九、ROS客户端Client的编程实现

    目录 如何实现一个客户端 C++ 创建功能包 编写程序 配置CMakeLists.txt 编译并运行 python 创建并编写脚本 运行 平台:华硕 Thinker Edge R 瑞芯微 RK3399 ...

  5. kubernetes 客户端client-go 使用及常用api

    kubernetes 客户端client-go 使用及常用api ---------------- 版权声明:本文为CSDN博主「逆月林」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原 ...

  6. C# 客户端Client与服务端Server通信

    C# 客户端Client与服务端Server通信 服务端配置 服务端要先启动,等待客户端请求连接 客户端配置 客户端测试**(切记一定要先开启服务端,不然不能保证连接)**

  7. go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

    go语言学习第八天==>mysql数据库增删改查.用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求 引包 import的 ...

  8. kubernetes 客户端KubeClient使用及常用api

    KubeClient是kubernetes 的C#语言客户端简单易用,KubeClient是.NET Core(目标netstandard1.4)的可扩展Kubernetes API客户端, gith ...

  9. 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器端开发 )

    文章目录 一.服务器端 ServerSocket 开发 1.创建服务器端套接字 ServerSocket 2.等待客户端请求 3.管理客户端连接 4.接收客户端数据线程 5.向客户端发送数据线程 二. ...

最新文章

  1. 监听Settings的值的变化
  2. 关于Django部分
  3. php生产任务,php生产实用技能之计划任务(视频讲解)
  4. Sentinel(四)之工作主流程
  5. 0906周测题目一 循环题的答案
  6. python时间模块 dir(time)_python sys,os,time模块的使用(包括时间格式的各种转换)...
  7. [转]程序员应打破牢笼,展望更高层次的世界
  8. 在Javascript中得到站点的根路径
  9. K8S专题-dashboardUI组件2
  10. 在 Mac OS X 安装gcc编辑环境,make不能用时参考
  11. 使用java实现数据库编程 第一章:数据库的设计
  12. Linux - grep命令详解
  13. TCP 协议(包含三次握手,四次挥手)
  14. java cat_java应用监控之CAT简介
  15. android支付宝运动修改器,支付宝运动修改器
  16. log4j 2.x版本 日志按天分割,按文件大小分割
  17. 伯努利试验及概率方程 二项式分布 期望值与方差
  18. 在EXCEL表格中快速自动求和
  19. 数据统计基础之F分布及其应用
  20. mpvue微信小程序动画_mpvue 与微信小程序的火花

热门文章

  1. 一套mysql_mysql 命令一套
  2. 成功解决import win32api, sys, osImportError: DLL load failed: 找不到指定的模块。
  3. 成功解决pandas读取文件中不读取第一索引列
  4. Py之pixellib:pixellib库的简介、安装、经典案例之详细攻略
  5. Interview:算法岗位面试—10.10下午—上海某银行算法岗位(偏数据分析,四大行之一)的技术面—关于项目的考察
  6. TF之NN:利用神经网络系统自动学习散点(二次函数+noise+优化修正)输出结果可视化(matplotlib动态演示)
  7. HiveSQL常用数据处理语句
  8. 页面适配的小栗子 - github
  9. [Python]小甲鱼Python视频第002课(第一个游戏)课后题及参考解答
  10. BZOJ 1008--[HNOI2008]越狱(容斥快速幂)