I want to use Kubernetes Go client to execute various actions in a cluster. I am loading my local kubeconfig
which contains multiple clusters and contexts. The default context is prod
and one of the config values I want to override is the CurrentContext
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
&clientcmd.ClientConfigLoadingRules{ExplicitPath: "/Users/me/.kube/config"},
&clientcmd.ConfigOverrides{
CurrentContext: "stage",
})
rawConfig, _ := clientConfig.RawConfig()
log.Printf(rawConfig.CurrentContext) // outputs "prod" instead of "stage"
When I inspect RawConfig()
the current context is still "prod" instead of "stage". Why does the config override not work?
Also how does the override for AuthInfo etc. work? The override accepts only a single AuthInfo
whereas the configuration contains a map of AuthInfo
etc.
GitHub related issue https://github.com/kubernetes/client-go/issues/735
Why does the config override not work?
according to
// ClientConfig is used to make it easy to get an api server client
type ClientConfig interface {
// RawConfig returns the merged result of all overrides
RawConfig() (clientcmdapi.Config, error)
RawConfig
should return config with overrides, but it really doesn't
func (config *DirectClientConfig) RawConfig() (clientcmdapi.Config, error) {
return config.config, nil
}
just return config without overrides. You could see a possible solution here in my patch
https://github.com/vvelikodny/kubernetes-client-go/pull/1/files
Also how does the override for AuthInfo etc. work? The override accepts only a single AuthInfo whereas the configuration contains a map of AuthInfo etc.
override only AuthInfo with the key of username which presented in context.AuthInfo (string).
// getAuthInfoName returns a string containing the current authinfo name for the current context,
// and a boolean indicating whether the default authInfo name is overwritten by a user-set flag, or
// left as its default value
func (config *DirectClientConfig) getAuthInfoName() (string, bool) {
if len(config.overrides.Context.AuthInfo) != 0 {
return config.overrides.Context.AuthInfo, true
}
context, _ := config.getContext()
return context.AuthInfo, false
}