如何从.kube / config中设置的当前上下文获取名称空间

时间:2019-03-23 13:22:18

标签: go kubernetes

我试图通过编程方式从〜/ .kube / config获取当前上下文的名称空间Go。

到目前为止,我尝试过的是来自以下模块:

    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/kubernetes"



kubeconfig := filepath.Join(
     os.Getenv("HOME"), ".kube", "config",
)
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Namespace: %s\n", config.Namespace())
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
    log.Fatal(err)
}

但是仍然不知道clientset是否可以给我我想要的名称空间。从这个线程: How to get current namespace of an in-cluster go Kubernetes client

它说了一些要做的事情: kubeconfig.Namespace()

3 个答案:

答案 0 :(得分:5)

我找到了使用NewDefaultClientConfigLoadingRules然后加载规则的解决方案。如果您的配置可使用默认客户端配置加载规则加载,则此方法有效。

示例:

package main

import (
        "github.com/davecgh/go-spew/spew"
        "k8s.io/client-go/tools/clientcmd"
)

func main() {
        clientCfg, err := clientcmd.NewDefaultClientConfigLoadingRules().Load()
        spew.Dump(clientCfg, err)
}

为您提供一个https://godoc.org/k8s.io/client-go/tools/clientcmd/api#Config,其中包含当前上下文及其名称空间。

Contexts: (map[string]*api.Context) (len=1) {
  (string) (len=17) "xxx.xxxxx.xxx": (*api.Context)(0xc0001b2b40)({
   LocationOfOrigin: (string) (len=30) "/path/to/.kube/config",
   Cluster: (string) (len=17) "xxx.xxxxx.xxx",
   AuthInfo: (string) (len=29) "xxxx@xxxx.com",
   Namespace: (string) (len=7) "default",
   Extensions: (map[string]runtime.Object) {
   }
  })
 },
 CurrentContext: (string) (len=17) "xxx.xxxxx.xxx",

供您参考,ClientConfigLoadingRules是一种结构,具有不同的属性,可以告诉cliclient从何处加载配置。默认值将使用KUBECONFIG环境变量中“优先级”字段中的路径。

(*clientcmd.ClientConfigLoadingRules)(0xc0000a31d0)({
 ExplicitPath: (string) "",
 Precedence: ([]string) (len=1 cap=1) {
  (string) (len=30) "/path/to/.kube/config"
 },
 MigrationRules: (map[string]string) (len=1) {
  (string) (len=30) "/path/to/.kube/config": (string) (len=35) "/path/to/.kube/.kubeconfig"
 },
 DoNotResolvePaths: (bool) false,
 DefaultClientConfig: (clientcmd.ClientConfig) <nil>
})

答案 1 :(得分:1)

此代码基于答案 https://stackoverflow.com/a/55315895/2784039,返回在 kubeconfig 文件的当前上下文中设置的命名空间。此外,如果 namespace 未在 default 当前上下文中定义,它会将 namespace 设置为 kubeconfig

package main

import (
    "fmt"

    "k8s.io/client-go/tools/clientcmd"
)

func main() {

    clientCfg, _ := clientcmd.NewDefaultClientConfigLoadingRules().Load()
    namespace := clientCfg.Contexts[clientCfg.CurrentContext].Namespace

    if namespace == "" {
        namespace = "default"
    }
    fmt.Printf(namespace)
}

此代码在用户端运行良好,它在集群外运行。检查下面的评论以检索集群内 Pod 的 namespace

答案 2 :(得分:0)

import Required:
       "k8s.io/client-go/tools/clientcmd"

loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
configOverrides := &clientcmd.ConfigOverrides{} kubeConfig :=
clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules,
configOverrides)

namespace, _, err = kubeConfig.Namespace()