阅读目标
- 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的项目结构
| 源码目录 | 说明 |
|---|---|
| discovery | DiscoveryClient发现客户端 |
| dynamic | DynamicClient动态客户端,可以对CRD自定义资源进行操作 |
| informers | kubernetes每种资源的Informer实现 |
| kubernetes | ClientSet客户端 |
| rest | RestClient,其他client的基础 |
| scale | ScaleClient |
| 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的名称。上述的代码片段中设置了
APIPath、GroupVersion、Resource,这些都可以参照kubernetes的官方API文档进行设置。
总结
在一开始接触kubernetes的时候我就经常使用http请求直接访问APIServer来部署应用,当时只是自己使用Java封装的工具。通过初步认识client-go项目才认识到自己封装的那套是多么的不堪,接下来会更深入的学习client-go及其实现原理(这周确实没有花太多的时间在学习上,下周加油!)。
《Kubernetes源码剖析》阅读笔记一——client-go源码结构
《kubernetes源码剖析》阅读笔记二——informer机制