(二)Kubernetes 源码剖析-client-go 编程式交互

4. client-go 编程式交互

熟练使用并掌握client-go是每个Kubernetes开发者必备的技术

首次选第五章节开始是基于‘Kubernetes 源码研习社’的活动参与进行,《Kubernetes 源码剖析》:第五章——Client Go章节本章主要阐述 client-go 编程式交互式工具的实现机制,本章节涉及 Kubernetes 开发者常用的多种 Client ,例如: RESTClient、ClientSet、DynamicClient、DiscoveryClient。详细剖析其内部运行机制,例如:Informer机制、DeltaFIFO队列、Indexer索引机制等等。开发者常使用 client-go 基于 Kubernetes 做二次开发。所以 client-go 是开发者熟练并掌握的必备技能。

client-go源码结构

1.如何查看源码的结构

#路径
cd kubernetes/vendor/k8s.io
#cloc代码统计工具统计
[root@building-kubernetes k8s.io]# cloc client-go/
Digest::MD5 not installed; will skip file uniqueness checks.
    1244 text files.
    1243 unique files.                                          
      28 files ignored.

github.com/AlDanial/cloc v 1.86  T=0.98 s (1245.3 files/s, 129358.9 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Go                             963          16456          22422          76075
Bazel                          238            905              0           9250
JSON                             1              0              0            650
Markdown                        11            133              0            349
Starlark                         1              1             19             18
Bourne Shell                     1              2             13              3
Dockerfile                       1              1             13              3
-------------------------------------------------------------------------------
SUM:                          1216          17498          22467          86348
-------------------------------------------------------------------------------

*** cloc统计显示kubernetes 1.14中client-go拥有8.6万行代码,其中Go语言代码占7.6万行***

2.代码目录结构说明

[root@building-kubernetes client-go]# tree -L 1
.
├── BUILD
├── code-of-conduct.md
├── CONTRIBUTING.md
├── deprecated-dynamic
├── discovery   #DiscoveryClient(用于资源发现)
├── dynamic   #DynamicClient(非结构化的数据获取资源)
├── examples   #几个使用的小例子
├── Godeps
├── informers  #informer相关
├── INSTALL.md
├── kubernetes   #ClientSet(最重要的client)
├── kubernetes_test
├── LICENSE
├── listers   #Lister相关(Get, List方法)
├── OWNERS
├── pkg
├── plugin   #插件相关
├── rest   #RESTClient最底层的client,其他client基于它)
├── restmapper
├── scale   #ScaleClient、用于扩容或缩容
├── SECURITY_CONTACTS
├── testing
├── third_party
├── tools   #提供常用工具类
├── transport   #传输层相关
└── util   #常用方法

19 directories, 7 files

在这里插入图片描述

Client客户端对象

在这里插入图片描述
RESTClient是最基础的客户端。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。ClientSet、DynamicClient及DiscoveryClient客户端都是基于RESTClient实现的。

  • ClientSet在RESTClient的基础上封装了对Resource和Version的管理方案。每一个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合,每一个Resource和Version都以函数的方式暴露给开发者。ClientSet只能够处理Kubernetes内置资源,它是通过client-gen代码生成器自动生成的。
  • DynamicClient与ClientSet最大的不同之处是,ClientSet仅能访问Kubernetes自带的资源(即Client集合内的资源),不能直接访问CRD自定义资源。DynamicClient能够处理Kubernetes中的所有资源对象,包括Kubernetes内置资源与CRD自定义资源
  • DiscoveryClient发现客户端,用于发现kube-apiserver所支持的资源组、资源版本、资源信息(即Group、Version、Resources)

以上4种客户端都可以通过kubeconfig配置信息连接到指定到Kubernetes API Server。

1.Kubeconfig配置管理

kubeconfig用于管理访问kube-apiserver的配置信息,支持多集群的配置管理,不同环境下管理不同kube-apiserver集群配置。kubernetes的其他组件都是用kubeconfig配置信息来连接kube-apiserver组件。kubeconfig存储了集群、用户、命名空间和身份验证等信息,默认kubeconfig存放在$HOME/.kube/config路径下。kubeconfig的配置信息如下:

cat $HOME/.kube/config
apiVersion: v1
kind: Config
preferences: {}

clusters: #定义kubernetes集群信息
- cluster:
  name: my-cluster
  
users: #定义kubernetes集群用户身份验证的客户端凭据
- name: shl
contexts: #定义kuberntes集群用户信息和命名空间等
- context:
  name: kubernetes
@源码分析如何运作

2.RESTClient客户端

RESTClient是最基础的客户端,其他的ClientSet、DynamicClient及DiscoveryClient都是基于RESTClient实现的。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。

@源码分析如何运作

3.ClientSet 客户端

ClientSet相比而言使用更加便捷,一般情况,对Kubernetes进行二次开发时通常使用ClientSet。 ClientSet在RESTClient的基础上封装了对Resource和Version的管理方法,每个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合,每个Resource和Version都以函数的方式暴露给开发者。

注意:ClientSet仅能访问Kubernetes自身的内置资源,不能直接访问CRD自定义资源;如果需要使用ClientSet访问CRD,则需要通过client-gen代码生成器重新生成ClientSet;DynamicClient可以访问CRD资源

@源码分析如何运作

4.DynamicClient客户端

DynamicClient客户端是一种动态客户端,可以对任意的Kubernetes资源进行RESTful操作,包括CRD资源。 DynamicClient内部实现了Unstructured,用于处理非结构化数据结构(即无法提前预知的数据结构),这也是DynamicClient能够处理CRD资源的关键。

DynamicClient不是类型安全的,因此在访问CRD自定义资源是要注意,例如,在操作不当时可能会导致程序崩溃。 DynamicClient的处理过程是将Resource(如PodList)转换成Unstructured结构类型,Kubernetes的所有Resource都可以转换为该结构类型。处理完后再将Unstructured转换成PodList。过程类似于Go语言的interface{}断言转换过程。另外,Unstructured结构类型是通过map[string]interface{}转换的。

@源码分析如何运作

5.DiscoveryClient客户端

DiscoveryClient是发现客户端,主要用于发现Kubenetes API Server所支持的资源组、资源版本、资源信息。 kubectl的api-versions和api-resources命令输出也是通过DiscoveryClient实现的。其同样是在RESTClient的基础上进行的封装。DiscoveryClient还可以将资源组、资源版本、资源信息等存储在本地,用于本地缓存,减轻对kubernetes api sever的访问压力,缓存信息默认存储在:/.kube/cache和/.kube/http-cache下。

@源码分析如何运作

6.配套Examples 的使用

[root@building-kubernetes examples]# tree -L 1
.
├── create-update-delete-deployment#获取pod列表和获取指定pod的信息来证明client创建成功
├── fake-client #构造一个假的集群来做单元测试
├── in-cluster-client-configuration #使用文件~/.kube/config获取连接Kubernetes凭证(获取client实例)
├── out-of-cluster-client-configuration #使用client-go编写程序来操作Kubernetes(获取client实例)
├── README.md
└── workqueue #client-go项目实现的一个队列

5 directories, 1 file
已标记关键词 清除标记
相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐中一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付 49.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值