I have a command-line utility to start/stop VMs that I am extending to managing Kubernetes clusters. It can save the kubeconfig currently, as well as merge a new configuration into a user's existing ~/.kube/config - but the command I am using (from How to merge kubectl config file with ~/.kube/config?) also switches the active context:
KUBECONFIG=<temporary_path_to_newly_created_config>:~/.kube/config kubectl config view --flatten`Is there a way to prevent the active context from switching unless I want it to? Am I using the wrong command with kubectl config view --flatten and is there a merging option that makes no changes to the active context?
Why kubectl behaves as it does.
current-context value. You might have several current-context values in the kubeconfig files specified in the $KUBECONFIG variable or another files specified with the parameter --kubeconfig=.~/.kube/config that kubectl uses when the $KUBECONFIG variable is empty and parameter --kubeconfig= is not provided.kubectl, it reads and merges values from the kubeconfig files to build its configuration for the current run.kubectl to use-context with the command KUBECONFIG=config1:config2 kubectl config use-context my_context, it saves context into the file listed first in the $KUBECONFIG variable (config1).Hence it’s not entirely accurate to say that kubectl "switches active context". It saves context to where you point and reads [possibly another] context from where you point. The current-context for the current kubectl run is set based on its command-line parameters, contents of the kubeconfig files and the order they are listed in the $KUBECONFIG variable.
Now back to the question.
Q:
Is there a way to prevent the active context from switching unless I want it to? and is there a merging option that makes no changes to the active context?
A:
There is no way to prevent the "active context" from switching because the current-context stored in the default and other kubeconfig files is assigned as "active" for the current run each time kubectl is launched. Also, kubectl shouldn't be considered as a plain text parsing & merging tool.
Speaking about default configuration in the particular case you've described, to re-use the previously used or preferred context or the one you believe "is current", you should list the kubeconfig file with that context the first in the $KUBECONFIG variable:
KUBECONFIG=~/.kube/config:new_config_to_merge kubectl config view --flatten > ...NOTE. If none of the kubeconfig files contain not empty current-context value, the error will appear: error: current-context is not set.
kubectl config use-context my-cluster-nameor
The second option will make your life so much easier, of course for both solution you have to set your config files in KUBECONFIG