The kubernetes config is a file that kubernetes uses to store different configuration variables.
Information on things like clusters, contexts and users are all stored here. Having all of these stored in the config allows us to easily switch between any of them when working with multiple projects.
If you have already started using kubernetes, you can sneak a peek at what it looks like using the following command on your terminal:
kubectl config view
This should print out all of your kubernetes configs as a single file to the terminal.
Cluster
One of the collections in the config file will be for the clusters. This contains block sequences for each of your clusters. Each block sequence will contain mapping for the name of the cluster, it will also contain mapping for the server and the certificate authority data of the cluster.
User
Each block sequence in the user collection contains information on the name of the user block, and then the user information. The user information contains the auth provider. Which then contains the name of the service provider, and other details like token information and cmd paths and args.
Context
For the context collection, each block sequence contains the name of the context, the user it uses and the cluster it uses. The context collection basically pairs the users with the correct clusters.
The config file
When working with multiple clusturs, being able to quickly change between them is a time saver. This can be achieved by creating a context for each cluster in your kubernetes config.
Creating the config file
Start with creating a file named 'example-config'
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: client-A
- cluster:
name: client-B
users:
- name: developer
- name: maintainer
contexts:
- context:
name: dev-production
- context:
name: dev-staging
- context:
name: dev-testing
- context:
name: dev-development
- context:
name: maint-production
The configuration file now describes two clusters named client-A and client-B respectively. It also describes two users, developer and maintainer. Finally it describes five contexts, dev-production, dev-staging, dev-testing, dev-development, and maint-production.
For each of your cluster details, you will also need to set the server details and if your server is using SSL, the certificate. Don't worry if your server is not using SSL though, you can always set insecure-skip-tls-verify: true
for your cluster.
You can do this using kubectl:
kubectl config --kubeconfig=example-config set-cluster client-A --server=https://1.2.3.4 --certificate-authority=/home/user/some-ca-file.crt
In the above command, we tell kubectl to edit the definition of the client-A cluser in the example-config file. We want to set the server to https://1.2.3.4 and we want to use the crt file at /home/user/some-ca-file.crt.
If you open up your example-config file again, you will find that your definition for cluster client-A now looks like this
...
- cluster:
certificate-authority: /home/user/some-ca-file.crt
server: https://1.2.3.4
name: client-A
...
To set cluster client-B, we use the same command while changing some of the variables
kubectl config --kubeconfig=example-config set-cluster client-B --server=https://5.6.7.8 --insecure-skip-tls-verify
The client-B cluster definition will now look like this,
...
-cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: client-B
...
Now that we have successfully set the definition for our clusters, we will have to add user details to the configuration file.
The following two lines will add the details we require to our developer user and our maintainer user:
kubectl config --kubeconfig=example-config set-credentials developer --client-certificate=some-client.crt --client-key=some-client.key
kubectl config --kubeconfig=example-config set-credentials maintainer --username=user --password=some-password
The updated user collection in your example-config should now look like this:
...
- name: developer
user:
client-certificate: some-client.crt
client-key: some-client.key
- name: maintainer
user:
password: some-password
username: user
...
Now that we have properly defined our clusters and users, we can define the contexts. We initially created five contexts so we will have to run five commands to add all their details
kubectl config --kubeconfig=example-config set-context dev-development --cluster=client-A --namespace=development --user=developer
kubectl config --kubeconfig=example-config set-context dev-testing --cluster=client-A --namespace=testing --user=developer
kubectl config --kubeconfig=example-config set-context dev-staging --cluster=client-A --namespace=staging --user=developer
kubectl config --kubeconfig=example-config set-context dev-production --cluster=client-A --namespace=production --user=developer
kubectl config --kubeconfig=example-config set-context maint-production --cluster=client-B --namespace=production --user=maintainer
One last look into our example-config file andd we should see this:
...
- context:
cluster: client-A
namespace: development
user: developer
name: dev-development
- context:
cluster: client-A
namespace: testing
user: developer
name:: dev-testing
- context:
cluster: client-A
namespace: staging
user: developer
name:: dev-staging
- context:
cluster: client-A
namespace: production
user: developer
name:: dev-production
- context:
cluster: client-B
namespace: production
user: maintainer
name: maint-production
...
Using the config file to pick a context
Now that we have everything set up, we can set a current context to be able to switch between clusters, users and namespaces as we have previously defined. Use the following command to set the current context:
kubectl config --kubeconfig=example-config use-context dev-development
This command will set all the user details, cluster details and the namespace defined in our example-config file.
Viewing a config file in the terminal
It is also possible to view the config file in the terminal using the view command:
kubectl config --kubeconfig=example-config view
or if you only want to see the details of the current context you can use the --minify
flag with the view command:
kubectl config --kubeconfig=example-config view --minify