kubernetes-client总结
代码库
-
k8s.io/client-go:本文以0.25.3为例
-
k8s.io/apimachinery:公共数据结构
client-go
RESTclient
- 包位置:k8s.io/client-go/rest
- 构造函数:rest.RESTClientForConfigAndClient、rest.RESTClientFor
- 可访问对象:all
- 特点:是其他几种client的基础
Clientset
-
包位置:k8s.io/client-go/kubernetes
-
构造函数:kubernetes.NewForConfig
-
可访问对象:所有原生资源
-
局限性:不可访问ApiServices(聚合服务器),CRD
-
特点:常用
DynamicClient
- 包位置:k8s.io/client-go/dynamic
- 构造函数:dynamic.NewForConfig
- 可访问对象:all
- 特点:用了unstructed中介数据结构,实现特意类型的识别转换。但是使用不当有可能引起panic。
DiscoveryClient
- 包位置:k8s.io/client-go/discovery
- 构造函数:discovery.NewDiscoveryClientForConfig
- 可访问对象:GVK
controller-runtime里的client
- 包位置:
sigs.k8s.io/controller-runtime/pkg/client
- 构造函数:client.New
- 可访问对象:all
- 特点:基于client-go,进行封装,提供一些额外的功能,以方便controller的开发
client-gen
除了上面提到的client-go自带的各类client,k8s还有一个仓库专门为CRD生成强类型的client:kubernetes/code-generator: Generators for kube-like API types (github.com)
但是这套client-go用起来稍显复杂,对vendor、meta、目录结构等都有一些要求
kubeconfig
以上四类client的构造函数,都需要一个k8s.io/client-go/rest.Config连接集群的配置文件作为参数。
那么集群外和集群内都是如何传入这个Config以获得client的实例的呢
client-go提供了一些工具函数,用来构造rest.Config
- incluster:
k8s.io/client-go/rest.InClusterConfig
使用集群sa构造config - 纯kubeconfig:
k8s.io/client-go/tools/clientcmd.RESTConfigFromKubeConfig
使用kubeconfig字节数组构造config - 上述二选一:
k8s.io/client-go/tools/clientcmd.BuildConfigFromFlags
如果入参都为空字符串,就尝试incluster集群内配置。否则使用入参构造配置。
controller-runtime同样提供了工具函数用来构造rest.Config,支持了kubeconfig和incluster config
sigs.k8s.io/controller-runtime/pkg/client/config/config.GetConfigOrDie
自定义的逻辑
- 通吃式:包装一个函数,通过error判断,依次尝试incluster/kubeconfig,直到成功构建出config。不需要修改入参,自动检测incluster/out of cluster。
- 可自定义kubeconfig路径的通吃式:在通吃式的基础上,通过flags包接收一个参数作为自定义kubeconfig路径,默认值为$HOME目录下的kubeconfig。
参考
- Kubernetes源码剖析
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。