欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
系列文章链接client-go实战之一:准备工作
client-go实战之二:RESTClient
client-go实战之三:Clientset
client-go实战之四:dynamicClient
client-go实战之五:DiscoveryClient
关于Clientset本篇是《client-go实战》系列的第三篇,前文学习了最基础的客户端Restclient,尽管咱们实战的需求很简单(获取指定namespace下所有pod的信息),但还是写了不少代码,如下图,各种设置太麻烦,例如api的path、Group、Version、返回的数据结构、编解码工具等:
如果业务代码中,需要操作kubernetes资源的代码都写成上图的样子,相信您是难以忍受的,应该会做一些封装以简化代码,不过client-go已经给出了简化版客户端,就省去了咱们自己动手的麻烦,也就是本文的主题:Clientset
本篇概览本篇目标是学习如何使用Clientset,因此毫无难度,咱们先来个源码速读,快速搞清楚Clientset到底是啥,然后确认需求,最后快速编码和验证就完事儿了;
源码速度之所以是速读而非精度,是因为Clientset内容简单容易理解,快速掌握其原理即可用于实战;
Clientset源码阅读的切入点就是其名字中的set,这是个集合,里面有很多东西,看一下Clientset数据结构的源码(限于篇幅只展示了一部分):
type Clientset struct { *discovery.DiscoveryClient admissionregistrationV1 *admissionregistrationv1.AdmissionregistrationV1Client admissionregistrationV1beta1 *admissionregistrationv1beta1.AdmissionregistrationV1beta1Client internalV1alpha1 *internalv1alpha1.InternalV1alpha1Client appsV1 *appsv1.AppsV1Client appsV1beta1 *appsv1beta1.AppsV1beta1Client appsV1beta2 *appsv1beta2.AppsV1beta2Client authenticationV1 *authenticationv1.AuthenticationV1Client ...如果您还没有理解上述源码的含义,再请看下图,左边是kubernetes的Group、Version信息,右边依旧是Clientset数据结构的源码,通过箭头可见:kubernetes的Group和Version的每个组合,都对应Clientset数据结构的一个字段:
Clientset果然名副其实,是所有Group和Version组合对象的集合,不过Group和Version组合对象到底是啥呢?以appsV1字段为例,去看看其类型appsv1.AppsV1Client,如下图,AppsV1Client只有一字段,就是咱们熟悉的restClient,所以RESTClient是Clientset的基础,这话没毛病,另外注意红框2中的Deployments方法,返回的是DeploymentInterface接口实现:
顺藤摸瓜去看DeploymentInterface,打开deployment.go文件后真相大白,接口定义的和实现一目了然:
挑一个接口实现的代码看看,就选新建deployment的方法吧,如下,和我们使用RESTClient编码差不多:
func (c *deployments) Create(ctx context.Context, deployment *v1.Deployment, opts metav1.CreateOptions) (result *v1.Deployment, err error) { result = &v1.Deployment{} err = c.client.Post(). Namespace(c.ns). Resource("deployments"). VersionedParams(&opts, scheme.ParameterCodec). Body(deployment). Do(ctx). Into(result) return }至此,您对Clientset应该心里有数了:其实就是把我们使用RESTClient操作资源的代码按照Group和Version分类再封装而已,这不像技术活,更像体力活---所以,这种体力活是谁做的呢?如下图红框所示,源码中已经注明这些代码是工具client-gen自动生成的:
至此,Clientset的源码速度就算完成了,咱们已经知道了Clientset的内幕,接下来开始尝试使用它;
需求确认本次编码实战的需求如下:
写一段代码,检查用户输入的operate参数,该参数默认是create,也可以接受clean;
如果operate参数等于create,就执行以下操作:
新建名为test-clientset的namespace
新建一个deployment,namespace为test-clientset,镜像用tomcat,副本数为2
新建一个service,namespace为test-clientset,类型是NodePort
如果operate参数等于clean,就删除create操作中创建的service、deployment、namespace等资源:
以上需求使用Clientset客户端实现,完成后咱们用浏览器访问来验证tomcat是否正常;
源码下载