概要
client-go 是 Kubernetes 编程中最常用的工具。和很多客户端一样,创建client之前要先创建config,Kubernetes在创建config的时候有一种备用机制 InClusterConfig,使得运行在 Kubernetes 集群中的代码可以在集群中获取 Kubernetes client-go 的配置。
client-go
开发者如何创建 client-go?
import (
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/kubernetes"
)
func demo() (*kubernetes.Clientset, error) {
master := "https://192.168.0.1:443"
kubeconfig := "~/.kube/config"
cfg, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
__handle(err)
clientset, err := kubernetes.NewForConfig(cfg)
return clientset, err
}
可以看出,创建 clientset 分2步:
- 通过 clientcmd.BuildConfigFromFlags 创建出 config
- 通过 kubernetes.NewForConfig 创建出 clientset
InClusterConfig 是什么?
InClusterConfig 其实是 clientcmd.BuildConfigFromFlags 源码中的一个机制:
func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*restclient.Config, error) {
if kubeconfigPath == "" && masterUrl == "" {
klog.Warningf("Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.")
kubeconfig, err := restclient.InClusterConfig()
if err == nil {
return kubeconfig, nil
}
klog.Warning("error creating inClusterConfig, falling back to default config: ", err)
}
return NewNonInteractiveDeferredLoadingClientConfig(
&ClientConfigLoadingRules{ExplicitPath: kubeconfigPath},
&ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: masterUrl}}).ClientConfig()
}
假如我们的代码运行在 Kubernetes 集群中,InClusterConfig 可以帮助我们从集群中创建 config 对象。
乍一看,这个功能似乎平平无奇,但是它却非常有用,因为创建出来的 config 我们是可以修改字段的!
// ...
cfg, err := clientcmd.BuildConfigFromFlags("", "")
__handle(err)
cfg.Host = master
cfg.QPS = opt.QPS
// ...
这样使用,我们无需传入kubeconfigPath即可创建出clientset。
这有什么用?
当我们不想把 kubeconfig 容易造成安全问题的文件保存在机器上,InClusterConfig 就帮我们绕过了 kubeconfig 的使用。