代码库

  • 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源码剖析
文章目录