Skip to main content

Kubeconfig: The Gateway to Cluster Access

A kubeconfig file is a structured YAML manifest that directs kubectl on how to reach a cluster, how to authenticate, and which environment to target. It is the primary client-side configuration for the Kubernetes API.


1. THE TRIPLE-PILLAR ARCHITECTURE

A Kubeconfig is built on three distinct top-level lists that interact to form a connection.

1.1 Clusters (Where?)

Defines the destination.

  • server: The FQDN or IP of the API Server (usually port 6443).
  • certificate-authority-data: The Public CA certificate of the cluster. The client uses this to verify the Server's identity (Standard TLS).

1.2 Users (Who?)

Defines the credentials.

  • Client Certs: client-certificate-data and client-key-data.
  • Tokens: Bearer tokens or OIDC strings.
  • Exec Plugins: A dynamic script (e.g., aws eks get-token) that fetches a temporary token.

1.3 Contexts (How?)

The "Joiner." A context is a named pointer that maps User A to Cluster B with a default Namespace C.


2. THE KUBECONFIG SCHEMA (BIBLE GRADE)

This annotated example demonstrates the integration of multiple clusters and the modern exec authentication pattern.

apiVersion: v1
kind: Config
preferences: {}

clusters:
- name: prod-cluster
cluster:
# Client uses this CA to verify the API Server is authentic
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSWZ...
server: https://10.0.0.10:6443

users:
- name: admin-user
user:
# mTLS credentials (Base64 encoded)
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSWZ...
client-key-data: LS0tLS1CRUdJTiBQUklWQVRFIEt...
- name: cloud-user
user:
# Modern Exec Plugin (e.g., AWS/GCP/Azure)
exec:
apiVersion: client.authentication.k8s.io/v1beta1
command: aws
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- my-eks-cluster

contexts:
- name: prod-context
context:
cluster: prod-cluster
user: admin-user
namespace: production # Default namespace for all commands
- name: eks-context
context:
cluster: eks-cluster
user: cloud-user

current-context: prod-context

3. INTERNAL MECHANICS: THE mTLS HANDSHAKE

When you run kubectl get pods, the following Mutual TLS handshake occurs using the data inside your kubeconfig:

  1. Server Verification: kubectl receives the API Server's certificate. It checks this against the certificate-authority-data. If it doesn't match, you get: x509: certificate signed by unknown authority.
  2. Client Verification: The API Server requests a certificate from kubectl. kubectl sends the client-certificate-data.
  3. The Key Proof: kubectl uses the client-key-data (Private Key) to sign a challenge from the server, proving it owns the certificate.
  4. Authorized Tunnel: Both sides have now verified each other (Mutual trust).

4. MERGE LOGIC & PRECEDENCE

kubectl can aggregate multiple kubeconfig files into a single in-memory view.

4.1 The Merging Chain

If multiple sources define the same context name, the order of precedence is:

  1. Command Line Flag: --kubeconfig (Highest)
  2. Environment Variable: $KUBECONFIG (A colon-separated list on Linux/Mac, semicolon on Windows).
  3. Default Location: ~/.kube/config (Lowest)

4.2 Handling Multiple Files

# Merge three separate files for a single session
export KUBECONFIG=$HOME/.kube/config:$HOME/.kube/dev.yaml:$HOME/.kube/prod.yaml

# View the merged result as a single clean file
kubectl config view --flatten > merged-config.yaml

5. NINJA COMMANDS & SAMPLE OUTPUTS

Stop manually editing YAML files. Use the CLI to ensure proper formatting and encoding.

5.1 Context Auditing

# List all contexts and find the one with the '*'
kubectl config get-contexts

Sample Output:

CURRENT   NAME             CLUSTER        AUTHINFO    NAMESPACE
* prod-context prod-cluster admin-user production
staging-context test-cluster dev-user default

5.2 Context Manipulation

# Switch to another environment
kubectl config use-context staging-context

# Change the default namespace for the current context ONLY
kubectl config set-context --current --namespace=monitoring

# Extract a "minified" version of the current config (removes other clusters/users)
# Perfect for sharing a config with a specific teammate
kubectl config view --minify --flatten

6. PRODUCTION SECURITY WARNINGS

  1. Plain-Text Keys: A kubeconfig file contains private keys encoded in Base64 (not encrypted). If someone steals your ~/.kube/config, they have full access to your cluster.
  2. File Permissions: Always restrict access to your config file: chmod 600 ~/.kube/config
  3. CI/CD Hygiene: In CI/CD pipelines (GitHub Actions, Jenkins), never hardcode kubeconfig strings. Use Secrets/Environment variables and use kubectl config set-cluster dynamically.
  4. Short-Lived Tokens: Prefer using exec plugins (OIDC/Cloud IAM) over static certificates. Static certificates cannot be easily revoked without regenerating the Cluster CA.

7. VISUAL: CONTEXT FLOW

   +-------------------------------------------------------+
| KUBECONFIG (Current: B) |
| |
| CONTEXT A: [ User: Admin ] + [ Cluster: Dev ] |
| |
| CONTEXT B: [ User: Ops ] + [ Cluster: Prod ] <-----+--- active
| |
| CONTEXT C: [ User: Dev ] + [ Cluster: Staging ] |
+---------------------------+---------------------------+
|
| (kubectl get pods)
v
+--------------------------+
| API SERVER (Production) |
| Validates 'Ops' Cert |
+--------------------------+