如何使用普通上下文来配置 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)
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试此代码(从 helm 获取),则 api 服务器设置不正确,客户端想要连接到默认主机localhost:8080。
目前该示例建议执行以下操作:
kconf, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, err
}
Run Code Online (Sandbox Code Playgroud)
但是,这不允许您指定要使用的上下文。如果您查看源代码,您会发现 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
}
Run Code Online (Sandbox Code Playgroud)
发现问题了。新版本中的实现github.com/imdario/mergo发生了变化,并破坏了生成客户端配置的实际行为。因此,只需使用6633656539c1639d9d78127b7d47c622b5d7b6dc官方 kubernetes cient-go 存储库中的修订版本即可。
https://github.com/kubernetes/client-go/issues/415