5.2.2.3. Kubeconfigs
Kubeconfig is a configuration file that provides access to a Kubernetes cluster. It contains information about API servers, user credentials (such as tokens or certificates), and contexts that define which cluster and user are being used. Kubeconfig provides authentication and authorization when interacting with the cluster through kubectl or other clients, allowing secure management of cluster resources and settings.
We create
kubeconfigfiles for components and users. This ensures secure and controlled connection to the API server.
- Init
- Join
Creating kubeconfig configurations and certificates
● Required
Creating kubeconfig configurations and certificates
● Required
- Super Admin
- Admin
- Controller
- Scheduler
- Kubelet
Super Admin
Super Admin
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
mkdir -p /etc/kubernetes/kubeconfig
Configuration
cat <<EOF > /etc/kubernetes/openssl/super-admin.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = kubernetes-super-admin
O = system:masters
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /etc/kubernetes/kubeconfig/super-admin.key 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/super-admin.key \
-out /etc/kubernetes/openssl/csr/super-admin.csr \
-config /etc/kubernetes/openssl/super-admin.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/super-admin.csr \
-out /etc/kubernetes/kubeconfig/super-admin.crt \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/super-admin.conf
Kubeconfig setup for super-admin
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/super-admin.conf
kubectl config set-credentials system:node:${HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/super-admin.crt \
--client-key=/etc/kubernetes/kubeconfig/super-admin.key \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/super-admin.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${HOST_NAME} \
--kubeconfig=/etc/kubernetes/super-admin.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/super-admin.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/super-admin.crt
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
super-admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Certificate generation
kubeadm init phase kubeconfig super-admin \
--config=/var/run/kubeadm/kubeadm.yaml
After executing the commands, we get the following output.
#### Certificate generation
[kubeconfig] Writing "super-admin.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
super-admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Admin
Admin
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
mkdir -p /etc/kubernetes/kubeconfig
Configuration
cat <<EOF > /etc/kubernetes/openssl/admin.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = kubernetes-admin
O = kubeadm:cluster-admins
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private keys
openssl genrsa \
-out /etc/kubernetes/kubeconfig/admin.key 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/admin.key \
-out /etc/kubernetes/openssl/csr/admin.csr \
-config /etc/kubernetes/openssl/admin.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/admin.csr \
-out /etc/kubernetes/kubeconfig/admin.crt \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/admin.conf
Kubeconfig setup for admin
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/admin.conf
kubectl config set-credentials system:node:${HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/admin.crt \
--client-key=/etc/kubernetes/kubeconfig/admin.key \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/admin.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${HOST_NAME} \
--kubeconfig=/etc/kubernetes/admin.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/admin.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/admin.crt
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Certificate generation
kubeadm init phase kubeconfig admin \
--config=/etc/kubernetes/kubeadm.yaml
After executing the commands, we get the following output.
#### Certificate generation
[kubeconfig] Writing "admin.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Kube Controller Manager
Kube Controller Manager
Purpose: kube-controller-manager client certificate for authentication to the API Server. Embedded in the
controller-manager.confkubeconfig and used for every controller-manager request to kube-apiserver. Signed by kubernetes-ca.
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
Configuration
cat <<EOF > /etc/kubernetes/openssl/controller-manager-client.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = system:kube-controller-manager
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /etc/kubernetes/kubeconfig/controller-manager-client-key.pem 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/controller-manager-client-key.pem \
-out /etc/kubernetes/openssl/csr/controller-manager-client.csr \
-config /etc/kubernetes/openssl/controller-manager-client.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-outform PEM \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/controller-manager-client.csr \
-out /etc/kubernetes/kubeconfig/controller-manager-client.pem \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/controller-manager-client.conf
export CLUSTER_NAME="my-first-cluster"
export BASE_DOMAIN="example.com"
export CLUSTER_DOMAIN="cluster.local"
export FULL_HOST_NAME="${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}"
Kubeconfig setup for controller-manager-client
kubectl config set-cluster kubernetes \
--certificate-authority="/etc/kubernetes/pki/ca.crt" \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-credentials system:node:${FULL_HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/controller-manager-client.pem \
--client-key=/etc/kubernetes/kubeconfig/controller-manager-client-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${FULL_HOST_NAME} \
--kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/controller-manager.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/controller-manager-client.pem
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
controller-manager.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Certificate generation
kubeadm init phase kubeconfig controller-manager \
--config=/var/run/kubeadm/kubeadm.yaml
After executing the commands, we get the following output.
#### Certificate generation
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
controller-manager.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Kube Scheduler
Kube Scheduler
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
Configuration
cat <<EOF > /etc/kubernetes/openssl/scheduler-client.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = system:kube-scheduler
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /etc/kubernetes/kubeconfig/scheduler-client-key.pem 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/scheduler-client-key.pem \
-out /etc/kubernetes/openssl/csr/scheduler-client.csr \
-config /etc/kubernetes/openssl/scheduler-client.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-outform PEM \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/scheduler-client.csr \
-out /etc/kubernetes/kubeconfig/scheduler-client.pem \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/scheduler-client.conf
export CLUSTER_NAME="my-first-cluster"
export BASE_DOMAIN="example.com"
export CLUSTER_DOMAIN="cluster.local"
export FULL_HOST_NAME="${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}"
Kubeconfig creation instructions
kubectl config set-cluster kubernetes \
--certificate-authority="/etc/kubernetes/pki/ca.crt" \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-credentials system:node:${FULL_HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/scheduler-client.pem \
--client-key=/etc/kubernetes/kubeconfig/scheduler-client-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${FULL_HOST_NAME} \
--kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/scheduler.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/scheduler-client.pem
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
scheduler.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Certificate generation
kubeadm init phase kubeconfig scheduler \
--config=/var/run/kubeadm/kubeadm.yaml
After executing the commands, we get the following output.
#### Kube Scheduler certificate generation
[kubeconfig] Writing "scheduler.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
scheduler.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Kubelet client
Kubelet client
Note! Can be signed via kubectl certificate approve
- HardWay
- Kubeadm
Environment variables
export CLUSTER_NAME=my-first-cluster
export BASE_DOMAIN=example.com
export CLUSTER_DOMAIN=cluster.local
export FULL_HOST_NAME=${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
mkdir -p /var/lib/kubelet/pki
Configuration
cat <<EOF > /etc/kubernetes/openssl/kubelet-client.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = system:node:${FULL_HOST_NAME}
O = system:nodes
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /var/lib/kubelet/pki/kubelet-client-key.pem 2048
CSR generation
openssl req \
-new \
-key /var/lib/kubelet/pki/kubelet-client-key.pem \
-out /etc/kubernetes/openssl/csr/kubelet-client.csr \
-config /etc/kubernetes/openssl/kubelet-client.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-outform PEM \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/kubelet-client.csr \
-out /var/lib/kubelet/pki/kubelet-client.pem \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/kubelet-client.conf
cat /var/lib/kubelet/pki/kubelet-client.pem /var/lib/kubelet/pki/kubelet-client-key.pem >> /var/lib/kubelet/pki/kubelet-client-$(date '+%Y-%m-%d-%H-%M-%S').pem
ln -s /var/lib/kubelet/pki/kubelet-client-$(date '+%Y-%m-%d-%H-%M-%S').pem /var/lib/kubelet/pki/kubelet-client-current.pem
export CLUSTER_NAME="my-first-cluster"
export BASE_DOMAIN="example.com"
export CLUSTER_DOMAIN="cluster.local"
export FULL_HOST_NAME="${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}"
Kubeconfig creation instructions
kubectl config set-cluster kubernetes \
--certificate-authority="/etc/kubernetes/pki/ca.crt" \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/kubelet.conf
kubectl config set-credentials system:node:${FULL_HOST_NAME} \
--client-certificate=/var/lib/kubelet/pki/kubelet-client.pem \
--client-key=/var/lib/kubelet/pki/kubelet-client-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/kubelet.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${FULL_HOST_NAME} \
--kubeconfig=/etc/kubernetes/kubelet.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/kubelet.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /var/lib/kubelet/pki/kubelet-client-current.pem
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
kubelet-client-current Oct 22, 2025 22:06 UTC 364d kubernetes no
Certificate generation
kubeadm init phase kubeconfig kubelet \
--config=/var/run/kubeadm/kubeadm.yaml
After executing the commands, we get the following output.
#### Certificate generation
[kubeconfig] Writing "kubelet.conf" kubeconfig file
Certificate rotation
kubeadm init phase kubelet-finalize experimental-cert-rotation \
--config=/var/run/kubeadm/kubeadm.yaml
After executing the commands, we get the following output.
#### Certificate rotation
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
kubelet-client-current Oct 22, 2025 22:06 UTC 364d kubernetes no
Creating kubeconfig configurations and certificates
● Required
Creating kubeconfig configurations and certificates
● Required
- Super Admin
- Admin
- Controller
- Scheduler
- Kubelet
Super Admin
Super Admin
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
mkdir -p /etc/kubernetes/kubeconfig
Configuration
cat <<EOF > /etc/kubernetes/openssl/super-admin.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = kubernetes-super-admin
O = system:masters
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /etc/kubernetes/kubeconfig/super-admin.key 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/super-admin.key \
-out /etc/kubernetes/openssl/csr/super-admin.csr \
-config /etc/kubernetes/openssl/super-admin.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/super-admin.csr \
-out /etc/kubernetes/kubeconfig/super-admin.crt \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/super-admin.conf
Kubeconfig setup for super-admin
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/super-admin.conf
kubectl config set-credentials system:node:${HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/super-admin.crt \
--client-key=/etc/kubernetes/kubeconfig/super-admin.key \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/super-admin.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${HOST_NAME} \
--kubeconfig=/etc/kubernetes/super-admin.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/super-admin.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/super-admin.crt
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
super-admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Please note: during the Join phase, you cannot choose which kubeconfigs to generate — kubeadm creates them all at once, in full.
Manifest generation
kubeadm join phase control-plane-prepare kubeconfig \
--config=/var/run/kubeadm/kubeadm.yaml
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubeconfig] Generating kubeconfig files
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
super-admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Admin
Admin
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
mkdir -p /etc/kubernetes/kubeconfig
Configuration
cat <<EOF > /etc/kubernetes/openssl/admin.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = kubernetes-admin
O = kubeadm:cluster-admins
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private keys
openssl genrsa \
-out /etc/kubernetes/kubeconfig/admin.key 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/admin.key \
-out /etc/kubernetes/openssl/csr/admin.csr \
-config /etc/kubernetes/openssl/admin.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/admin.csr \
-out /etc/kubernetes/kubeconfig/admin.crt \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/admin.conf
Kubeconfig setup for admin
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/admin.conf
kubectl config set-credentials system:node:${HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/admin.crt \
--client-key=/etc/kubernetes/kubeconfig/admin.key \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/admin.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${HOST_NAME} \
--kubeconfig=/etc/kubernetes/admin.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/admin.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/admin.crt
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Please note: during the Join phase, you cannot choose which kubeconfigs to generate — kubeadm creates them all at once, in full.
Manifest generation
kubeadm join phase control-plane-prepare kubeconfig \
--config=/var/run/kubeadm/kubeadm.yaml
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubeconfig] Generating kubeconfig files
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Kube Controller Manager
Kube Controller Manager
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
Configuration
cat <<EOF > /etc/kubernetes/openssl/controller-manager-client.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = system:kube-controller-manager
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /etc/kubernetes/kubeconfig/controller-manager-client-key.pem 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/controller-manager-client-key.pem \
-out /etc/kubernetes/openssl/csr/controller-manager-client.csr \
-config /etc/kubernetes/openssl/controller-manager-client.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-outform PEM \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/controller-manager-client.csr \
-out /etc/kubernetes/kubeconfig/controller-manager-client.pem \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/controller-manager-client.conf
export CLUSTER_NAME="my-first-cluster"
export BASE_DOMAIN="example.com"
export CLUSTER_DOMAIN="cluster.local"
export FULL_HOST_NAME="${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}"
Kubeconfig setup for controller-manager-client
kubectl config set-cluster kubernetes \
--certificate-authority="/etc/kubernetes/pki/ca.crt" \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-credentials system:node:${FULL_HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/controller-manager-client.pem \
--client-key=/etc/kubernetes/kubeconfig/controller-manager-client-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${FULL_HOST_NAME} \
--kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/controller-manager.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/controller-manager-client.pem
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
controller-manager.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Please note: during the Join phase, you cannot choose which kubeconfigs to generate — kubeadm creates them all at once, in full.
Manifest generation
kubeadm join phase control-plane-prepare kubeconfig \
--config=/var/run/kubeadm/kubeadm.yaml
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubeconfig] Generating kubeconfig files
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
controller-manager.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Kube Scheduler
Kube Scheduler
- HardWay
- Kubeadm
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
Configuration
cat <<EOF > /etc/kubernetes/openssl/scheduler-client.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = system:kube-scheduler
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /etc/kubernetes/kubeconfig/scheduler-client-key.pem 2048
CSR generation
openssl req \
-new \
-key /etc/kubernetes/kubeconfig/scheduler-client-key.pem \
-out /etc/kubernetes/openssl/csr/scheduler-client.csr \
-config /etc/kubernetes/openssl/scheduler-client.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-outform PEM \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/scheduler-client.csr \
-out /etc/kubernetes/kubeconfig/scheduler-client.pem \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/scheduler-client.conf
export CLUSTER_NAME="my-first-cluster"
export BASE_DOMAIN="example.com"
export CLUSTER_DOMAIN="cluster.local"
export FULL_HOST_NAME="${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}"
Kubeconfig creation instructions
kubectl config set-cluster kubernetes \
--certificate-authority="/etc/kubernetes/pki/ca.crt" \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-credentials system:node:${FULL_HOST_NAME} \
--client-certificate=/etc/kubernetes/kubeconfig/scheduler-client.pem \
--client-key=/etc/kubernetes/kubeconfig/scheduler-client-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${FULL_HOST_NAME} \
--kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/scheduler.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/kubeconfig/scheduler-client.pem
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
scheduler.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Please note: during the Join phase, you cannot choose which kubeconfigs to generate — kubeadm creates them all at once, in full.
Manifest generation
kubeadm join phase control-plane-prepare kubeconfig \
--config=/var/run/kubeadm/kubeadm.yaml
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubeconfig] Generating kubeconfig files
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
scheduler.conf Oct 22, 2025 22:06 UTC 364d kubernetes no
Kubelet client
Kubelet client
Note! Can be signed via kubectl certificate approve
- HardWay
- Kubeadm
Environment variables
export CLUSTER_NAME=my-first-cluster
export BASE_DOMAIN=example.com
export CLUSTER_DOMAIN=cluster.local
export FULL_HOST_NAME=${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}
Working directory
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/openssl/csr
mkdir -p /var/lib/kubelet/pki
Configuration
cat <<EOF > /etc/kubernetes/openssl/kubelet-client.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = system:node:${FULL_HOST_NAME}
O = system:nodes
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth
EOF
Private key generation
openssl genrsa \
-out /var/lib/kubelet/pki/kubelet-client-key.pem 2048
CSR generation
openssl req \
-new \
-key /var/lib/kubelet/pki/kubelet-client-key.pem \
-out /etc/kubernetes/openssl/csr/kubelet-client.csr \
-config /etc/kubernetes/openssl/kubelet-client.conf
CSR signing
openssl x509 \
-req \
-days 365 \
-sha256 \
-outform PEM \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-in /etc/kubernetes/openssl/csr/kubelet-client.csr \
-out /var/lib/kubelet/pki/kubelet-client.pem \
-extensions v3_ext \
-extfile /etc/kubernetes/openssl/kubelet-client.conf
cat /var/lib/kubelet/pki/kubelet-client.pem /var/lib/kubelet/pki/kubelet-client-key.pem >> /var/lib/kubelet/pki/kubelet-client-$(date '+%Y-%m-%d-%H-%M-%S').pem
ln -s /var/lib/kubelet/pki/kubelet-client-$(date '+%Y-%m-%d-%H-%M-%S').pem /var/lib/kubelet/pki/kubelet-client-current.pem
export CLUSTER_NAME="my-first-cluster"
export BASE_DOMAIN="example.com"
export CLUSTER_DOMAIN="cluster.local"
export FULL_HOST_NAME="${HOST_NAME}.${CLUSTER_NAME}.${BASE_DOMAIN}"
Kubeconfig creation instructions
kubectl config set-cluster kubernetes \
--certificate-authority="/etc/kubernetes/pki/ca.crt" \
--embed-certs=true \
--server=https://127.0.0.1:6443 \
--kubeconfig=/etc/kubernetes/kubelet.conf
kubectl config set-credentials system:node:${FULL_HOST_NAME} \
--client-certificate=/var/lib/kubelet/pki/kubelet-client.pem \
--client-key=/var/lib/kubelet/pki/kubelet-client-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/kubelet.conf
kubectl config set-context default \
--cluster=kubernetes \
--user=system:node:${FULL_HOST_NAME} \
--kubeconfig=/etc/kubernetes/kubelet.conf
kubectl config use-context default \
--kubeconfig=/etc/kubernetes/kubelet.conf
Certificate readiness check
/etc/kubernetes/openssl/cert-report.sh /var/lib/kubelet/pki/kubelet-client-current.pem
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
kubelet-client-current Oct 22, 2025 22:06 UTC 364d kubernetes no
Please note: during the Join phase, you cannot choose which kubeconfigs to generate — kubeadm creates them all at once, in full.
Manifest generation
kubeadm join phase control-plane-prepare kubeconfig \
--config=/var/run/kubeadm/kubeadm.yaml
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubeconfig] Generating kubeconfig files
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
Certificate readiness check
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
kubelet-client-current Oct 22, 2025 22:06 UTC 364d kubernetes no