【问题标题】:Use kubectl context in kubernetes client-go在 kubernetes client-go 中使用 kubectl 上下文
【发布时间】:2018-10-30 07:49:44
【问题描述】:

如何使用普通上下文来配置 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 文件。但我得到这个错误:恐慌:运行时错误:无效的内存地址或零指针取消引用[信号SIGSEGV:分段违规代码=0x1 addr=0x0 pc=0x12a7a9a]

标签: go kubernetes


【解决方案1】:

发现问题。 github.com/imdario/mergo 的实现在较新的版本中发生了更改,并破坏了生成客户端配置的实际行为。所以只使用修订版6633656539c1639d9d78127b7d47c622b5d7b6dc 就像在官方 kubernetes cient-go 存储库中一样。

https://github.com/kubernetes/client-go/issues/415

【讨论】:

    【解决方案2】:

    目前该示例建议执行以下操作:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-27
      • 2020-03-06
      • 2019-12-09
      • 2021-03-29
      • 2019-02-12
      • 2018-11-03
      • 2021-08-05
      相关资源
      最近更新 更多