《Kubernetes源码剖析》阅读笔记一——client-go源码结构

2,378 阅读2分钟

阅读目标

  • client-go源码结构
  • client-go的几种客户端对象

环境准备

初始化go mod项目

➜  GolandProjects cd client-go-learn
➜  client-go-learn go mod init github.com/cdtft/client-go-learn

下载client-go

go get k8s.io/client-go@v0.17.0
go get k8s.io/api@v0.17.0
go getk8s.io/apimachinery@v0.17.0

go.mod文件如下:

module github.com/cdtft/client-go-learn

go 1.14

require (
	k8s.io/api v0.17.0
	k8s.io/apimachinery v0.17.0
	k8s.io/client-go v0.17.0
)

client-go源码结构

在IDE的go mod依赖中可一看到client-go的项目结构

源码目录说明
discoveryDiscoveryClient发现客户端
dynamicDynamicClient动态客户端,可以对CRD自定义资源进行操作
informerskubernetes每种资源的Informer实现
kubernetesClientSet客户端
restRestClient,其他client的基础
scaleScaleClient
tools提供常用工具。例如ShareInformer、Reflector、DealtFIFO、Indexers

client-go的使用

事先我已经使用ansible搭建好了kubernetes集群,将kubeconfig文件拷贝到了本地。

package main

import (
	"fmt"
	corev1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("",
		"/Users/wangcheng/GolandProjects/kubeconfig/config")
	if err != nil {
		panic(err)
	}

	config.APIPath = "apis"
	// v1
	config.GroupVersion = &corev1.SchemeGroupVersion
	config.NegotiatedSerializer = scheme.Codecs

	restClient, err := rest.RESTClientFor(config)
	if err != nil {
		panic(err)
	}

	deployments := &corev1.DeploymentList{}

	err = restClient.Get().Namespace("default").Resource("deployments").
		VersionedParams(&metav1.ListOptions{Limit:500}, scheme.ParameterCodec).
		Do().
		Into(deployments)
	if err != nil {
		panic(err)
	}

	for _, dp := range deployments.Items {
		fmt.Println(dp.Name)
	}
}

运行如上代码结果如下: 打印出了集群中deployments的名称。上述的代码片段中设置了APIPathGroupVersionResource,这些都可以参照kubernetes的官方API文档进行设置。

总结

在一开始接触kubernetes的时候我就经常使用http请求直接访问APIServer来部署应用,当时只是自己使用Java封装的工具。通过初步认识client-go项目才认识到自己封装的那套是多么的不堪,接下来会更深入的学习client-go及其实现原理(这周确实没有花太多的时间在学习上,下周加油!)。

《Kubernetes源码剖析》阅读笔记一——client-go源码结构

《kubernetes源码剖析》阅读笔记二——informer机制

《kubernetes源码剖析》阅读笔记三——WorkQueue

《kubernetes源码剖析》阅读笔记四——一阶段总结