Background
I often need to switch between Kubernetes clusters for different projects.
Managing the kubectl configuration for each of them and their files can be cumbersome.
By default, the kubectl command line client uses the ~/.kube/config file to store
the Kubernetes endpoint and credentials. If you use
minikube
or Docker Desktop’s local Kubernetes,
you should be able to see their configurations in that file.
When you work with a cloud based Kubernetes instance, the cloud console will provide
the configuration as a yml file. You then need to specify the file
as the value of the environment variable KUBECONFIG, which is used by kubectl.
This can quickly become cumbersome and hard to maintain.
Multiple Contexts
To solve this problem, I’ve started storing all cloud cluster configuration yml files
in a new folder ~/.kube/custom-contexts/. Usually, I’d make a folder for each cloud
Kube instance, which contains the yml config and other auxiliary files (e.g. pem certificates).
Here’s the content of my ~/.kube folder:
1
2
3
4
5
6
7
8
~/.kube/
├── cache
│ └── ...
├── config
└── custom-contexts
└── NikTest-Kube-Config
├── ca-hou02-NikTest.pem
└── kube-config-hou02-NikTest.yml
It has a single Kubernetes configuration in the NikTest-Kube-Config folder which
contains the yml config and pem certificate downloaded from the IBM Cloud console.
Now we need to load all this configuration in the KUBECONFIG environment variable
so that kubectl can switch between them. The following script does the trick:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Set the default kube context if present
DEFAULT_KUBE_CONTEXTS="$HOME/.kube/config"
if test -f "${DEFAULT_KUBE_CONTEXTS}"
then
export KUBECONFIG="$DEFAULT_KUBE_CONTEXTS"
fi
# Additional contexts should be in ~/.kube/custom-contexts/
CUSTOM_KUBE_CONTEXTS="$HOME/.kube/custom-contexts"
mkdir -p "${CUSTOM_KUBE_CONTEXTS}"
OIFS="$IFS"
IFS=$'\n'
for contextFile in `find "${CUSTOM_KUBE_CONTEXTS}" -type f -name "*.yml"`
do
export KUBECONFIG="$contextFile:$KUBECONFIG"
done
IFS="$OIFS"
I put the above code snippet in my ~/.bashrc so that it loads on every new terminal session.
This way, if I add or delete configuration files from ~/.kube/custom-contexts, this will be
reflected in every subsequent terminal session.
Switching Between Contexts
Now we can list all preconfigured contexts and see which one is active:
1
2
3
4
5
6
kubectl config get-contexts
# CURRENT NAME CLUSTER AUTHINFO
# NikTest NikTest <****>
# docker-desktop docker-desktop docker-desktop
# * minikube minikube minikube
We can also get the name of the active context/cluster:
1
2
# Prints the current config nema - e.g. minikube
kubectl config current-context
Finally, we can switch between the predefined contexts:
1
2
# Switch to a context/cluster
kubectl config use-context NikTest
