在 Kubernetes 的 client-go 中使用 kubectl context

12

如何使用普通上下文来配置 Kubernetes client-go?

    package kube

    import (
        "fmt"

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

    // GetKubeClient creates a Kubernetes config and client for a given kubeconfig context.
    func GetKubeClient(context string) (*rest.Config, kubernetes.Interface, error) {
        config, err := configForContext(context)
        if err != nil {
            return nil, nil, err
        }
        client, err := kubernetes.NewForConfig(config)
        if err != nil {
            return nil, nil, fmt.Errorf("could not get Kubernetes client: %s", err)
        }
        return config, client, nil
    }

    // configForContext creates a Kubernetes REST client configuration for a given kubeconfig context.
    func configForContext(context string) (*rest.Config, error) {
        config, err := getConfig(context).ClientConfig()
        if err != nil {
            return nil, fmt.Errorf("could not get Kubernetes config for context %q: %s", context, err)
        }
        return config, nil
    }

    // getConfig returns a Kubernetes client config for a given context.
    func getConfig(context string) clientcmd.ClientConfig {
        rules := clientcmd.NewDefaultClientConfigLoadingRules()
        rules.DefaultClientConfig = &clientcmd.DefaultClientConfig

        overrides := &clientcmd.ConfigOverrides{ClusterDefaults: clientcmd.ClusterDefaults}

        if context != "" {
            overrides.CurrentContext = context
        }
        return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides)
    }

如果我尝试这个代码(从helm得到),api服务器就不会正确设置,客户端想连接到默认主机 localhost:8080


我尝试从main()方法中调用它: firstConfig,_,_ := GetKubeClient("first")我有一个名为first的上下文的kubeconfig文件。但是我收到了以下错误: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x12a7a9a] - pep8
2个回答

5

目前的示例建议这样做:

kconf, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
    return nil, err
}

然而,这样做不能让你指定想要使用的上下文。如果你查看源代码,你会发现BuildConfigFromFlags只是NewNonInteractiveDeferredLoadingClientConfig的一个薄包装。

如果你使用NewNonInteractiveDeferredLoadingClientConfig,你可以像这样指定上下文:

configLoadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfig}
configOverrides := &clientcmd.ConfigOverrides{CurrentContext: "dev-cluster"}

kconf, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(configLoadingRules, configOverrides).ClientConfig()
if err != nil {
    return nil, err
}

3
发现了问题。 github.com/imdario/mergo 的实现在较新版本中发生了更改,破坏了生成客户端配置的实际行为。因此,只需像官方 kubernetes client-go 存储库中一样仅使用修订版 6633656539c1639d9d78127b7d47c622b5d7b6dc 即可。 https://github.com/kubernetes/client-go/issues/415

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接