CentOS Stream 10: Add Normal Users
Add normal users with X509 client certificate authentication to a Kubernetes cluster on CentOS Stream 10.
May 24, 2026 • 5 min read
centoscentos-stream-10kubernetesk8scluster
Add normal users who can use the Kubernetes cluster.
In this example, a Kubernetes cluster is configured using four nodes as follows.
+----------------------+ +----------------------+
| [ ctrl.srv.world ] | | [ dlp.srv.world ] |
| Manager Node | | Control Plane |
+-----------+----------+ +-----------+----------+
eth0|10.0.0.25 eth0|10.0.0.30
| |
------------+--------------------------+-----------
| |
eth0|10.0.0.51 eth0|10.0.0.52
+-----------+----------+ +-----------+----------+
| [ node01.srv.world ] | | [ node02.srv.world ] |
| Worker Node#1 | | Worker Node#2 |
+----------------------+ +----------------------+
Create X509 Certificate
Generate a client certificate for a new user. Replace /CN=*** with the desired username:
openssl ecparam -name prime256v1 -genkey -out kubernetes.key
openssl req -new -key kubernetes.key -out kubernetes.csr -subj "/CN=serverworld"
Create CertificateSigningRequest
Encode the CSR and create the Kubernetes CSR resource:
CSR=$(cat kubernetes.csr | base64 | tr -d '\n')
cat <<EOF > serverworld-csr.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: serverworld-csr
spec:
request: $CSR
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
EOF
kubectl apply -f serverworld-csr.yaml
Approve and Export Certificate
Approve the CSR and export the certificate:
kubectl certificate approve serverworld-csr
kubectl get csr serverworld-csr -o jsonpath='{.status.certificate}' | base64 --decode > kubernetes.crt
Assign Cluster Role
Create a ClusterRoleBinding for the user. For cluster administrator privileges:
kubectl create clusterrolebinding serverworld --clusterrole=cluster-admin --user=serverworld
Create Kubeconfig
Generate a kubeconfig file for the new user:
SERVER=$(kubectl config view -o jsonpath='{.clusters[].cluster.server}')
CLUSTER=$(kubectl config view -o jsonpath='{.contexts[].context.cluster}')
ROOTCA=$(kubectl get cm kube-root-ca.crt -o jsonpath="{'data']['ca\.crt']}"| base64 | tr -d '\n')
kubectl config set-cluster kubernetes --server=$SERVER --kubeconfig=config
kubectl config set clusters.kubernetes.certificate-authority-data $ROOTCA --kubeconfig=config
kubectl config set-context kubernetes --cluster=$CLUSTER --user=serverworld --kubeconfig=config
kubectl config set-credentials serverworld --client-certificate=kubernetes.crt --client-key=kubernetes.key --kubeconfig=config
kubectl config use-context kubernetes --kubeconfig=config
The following three files should be provided to the user:
configkubernetes.crtkubernetes.key
Use as Normal User
Create a .kube directory under the user's home directory and place the received files:
mkdir -p ~/.kube
cp config ~/.kube/config
cp kubernetes.crt ~/.kube/
cp kubernetes.key ~/.kube/
Verify access:
kubectl get nodes