Source Code From https://github.com/kubernetes/client-go/releases/tag/kubernetes-1.21.0
参考Kubernetes源码分析(基于Kubernetes 1.14版本)(郑东旭/著)
结合client-go编程式交互.doc阅读
- client-go源码分析
源码目录 | 说明 | 备注 |
---|---|---|
applyconfigurations | ||
discovery | 提供DiscoveryClient发现客户端 | |
dynamic | 提供DynamicClient动态客户端 | |
examples | 涵盖了client-go各种用例和功能的例子 | 包括源码解析过程中添加的示例 |
informers | 每种Kubernetes资源的Informer实现 | |
kubernetes | 提供ClientSet客户端 | |
kubernetes_test | ||
listers | 为每一个Kubernetes资源提供Lister功能,该功能对Get和 List请求提供只读的缓存数据 | |
metadata | ||
pkg | ||
plugin | 提供OpenStack、 GCP和Azure等云服务商授权插件 | |
rest | 提供RESTClient客户端,对Kubernetes API Server执行RESTful操作 | |
restmapper | 基于restmapper的客户端 | |
scale | 提供ScaleClient客户端,用于扩容或缩容Deployment、ReplicaSet、Replication Controller等资源对象 | |
testing | ||
third_party | ||
tools | 提供常用工具,例如SharedInformer、Reflector、DealtFIFO及Indexers。提供 Client查询和缓存机制,以减少向kube-apiserver发起的请求数等 | |
transport | 提供安全的TCP连接,支持 Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如exec、attach等操作。该功能由内部的spdy包提供支持 | |
util | 提供常用方法,例如 WorkQueue工作队列、Certificate证书管理等 | |
vendor | 存放项目依赖的库代码 | 源码中无此目录,为了方便后期编译运行添加,通过go mod也可以 |
client-go读取kubeconfig配置信息并生成config对象,用于与kube-apiserver通信tools/clientcmd/client_config.go:616
1.加载kubeconfig配置信息
tools/clientcmd/loader.go:174
tools/clientcmd/loader.go:406
2.合并多个kubeconfig配置信息
tools/clientcmd/loader.go:246
见examples/REST_client.go
RESTClient发送请求的过程对Go语言标准库nethttp 进行了封装,由Do-request函数实现rest/request.go:978
见examples/client_set.go
podCient.List函数通过RESTClient获得Pod列表kubernetes/typed/core/v1/pod.go:89
见examples/dynamic_client.go
见examples/discovery_client.go
discovery/discovery_client.go:156
discovery/cached/disk/cached_discovery.go:64
1.资源Informer
每一个Kubernetes资源上都实现了Informer机制。每一个Informer上都会实现Informer和Lister方法,例如PodInformer,代码示例informers/core/v1/pod.go:37
2.Shared Informer共享机制
informers/factory.go:66,168,132
1.获取资源列表数据tools/cache/reflector.go:254
2.监控资源对象tools/cache/reflector.go:429,444
tools/cache/delta_fifo.go:95
1.生产者方法tools/cache/delta_fifo.go:415
2.消费者方法
tools/cache/delta_fifo.go:528
tools/cache/shared_informer.go:528
3.Resync机制
tools/cache/delta_fifo.go:669
tools/cache/delta_fifo.go:686
1.ThreadSafeMap并发安全存储tools/cache/thread_safe_store.go:65
2.Indexer索引器
examples/indexer.go
tools/cache/index.go
3.Indexer索引器核心实现tools/cache/thread_safe_store.go:186
util/workqueue/queue.go:26,77
util/workqueue/delaying_queue.go:30,75
util/workqueue/default_rate_limiters.go:27
util/workqueue/default_rate_limiters.go:52
util/workqueue/default_rate_limiters.go:76,103
util/workqueue/default_rate_limiters.go:145,168
util/workqueue/default_rate_limiters.go:45
vendor/k8s.io/api/core/v1/types.go:5463
tools/record/event.go:88
以Event方法为例,记录当前发生的事件,Event→recorder.generateEvent→recorder.ActionOrDrop
vendor/k8s.io/apimachinery/pkg/watch/mux.go:220
tools/record/event.go:159
vendor/k8s.io/apimachinery/pkg/watch/mux.go:260
tools/record/event.go:113,297
代码生成器 | 说明 |
---|---|
client-gen | 一种为资源生成 ClientSet客户端的工具 |
lister-gen | 一种为资源生成Lister的工具(即get和 list方法) |
informer-gen | 一种为资源生成 Informer的工具 |
生成规则(以Pod资源对象为例) $GOPATH/src/k8s.io/kubernetes/vendor/k8s.io/api/core/v1/types.go:3688
$GOPATH/src/k8s.io/kubernetes/vendor/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go:80
$GOPATH/src/k8s.io/kubernetes/vendor/k8s.io/code-generator/cmd/lister-gen/generators/lister.go:64
$GOPATH/src/k8s.io/kubernetes/vendor/k8s.io/code-generator/cmd/informer-gen/generators/packages.go:94