Kubernetes client-go的 InClusterConfig 了解吗

1,359 阅读1分钟

概要

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步:

  1. 通过 clientcmd.BuildConfigFromFlags 创建出 config
  2. 通过 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 的使用。