KubeConfig is an authentication config file. It configures what clusters the user has access to and in what capacity. It also stores the key and certificate for TLS handshake when making calls to the kube-apiserver
. The URL for the kube-apiserver
is also configured in the KubeConfig.
kubectl
looks for the kube config as a file named config
at location ~/.kube
. If there are multiple config files at that location or the config file is not named config
, we need to pass the config file in the kubectl
command as kubectl get pods --kubeconfig config.yaml
.
The changes made to the KubeConfig file don’t need to be applied. They are used when the kubectl
command is run.
KubeConfig file has 3 sections:
KubeConfig defines what user accounts have access to what clusters. It is not a configuration to create user accounts or clusters. It just defines which user account will be used by the kubectl
command to access which cluster. This way we don’t have to specify these parameters in the kubectl
commands.
The below KubeConfig file uses the user account admin
to access the cluster playground
.
<aside>
💡 Every cluster has the CA certificate specified. This lets the kubectl
utility verify the certificate of the kube-apiserver
during the TLS handshake.
</aside>
apiversion: v1
kind: Config
clusters:
- name: playground
cluster:
certificate-authority: ca.crt
server: <https://playground:6443>
contexts:
- name: admin@playground
context:
cluster: playground
user: admin
users:
- name: admin
user:
client-certificate: admin.crt
client-key: admin.key
If the KubeConfig contains multiple contexts, we need to add a current-context
field to specify which context to use as default. Also, namespace can be specified in the context. This means switching to a context will switch the user to the specified namespace.
apiversion: v1
kind: Config
current-context: developer@playground
clusters:
- name: playground
cluster:
certificate-authority: ca.crt
server: <https://playground:6443>
contexts:
- name: admin@playground
context:
cluster: playground
user: admin
namespace: accounting
- name: developer@playground
context:
cluster: playground
user: developer
namespace: finance
users:
- name: admin
user:
client-certificate: admin.crt
client-key: admin.key
- name: developer
user:
client-certificate: developer.crt
client-key: developer.key
Certificates can also be specified as base64 encoded text instead of the .crt
file.
apiversion: v1
kind: Config
clusters:
- name: playground
cluster:
certificate-authority-data: <base64-encoded-certificate>
server: <https://playground:6443>
contexts:
- name: admin@playground
context:
cluster: playground
user: admin
users:
- name: admin
user:
client-certificate-data: <base64-encoded-certificate>
client-key: admin.key
k config view
k config use-context <context-name>
kubectl
command - kubectl get pods --kubeconfig config.yaml
<aside>
💡 Explore other k config
commands
</aside>