- Error messages containing "x509: certificate has expired" or "certificate signed by unknown authority"
- API server connection failures
kubectlcommands failing with TLS or certificate errors- Kubelet showing NotReady with certificate errors in logs
- Components unable to communicate with each other
- etcd reporting peer certificate errors
- Webhook calls failing due to certificate validation errors
- New nodes unable to join the cluster
- Control plane component restarts due to certificate errors
- Expired Certificates: Kubernetes certificates have validity periods and expire
- Mismatched CA: Components using certificates signed by different CAs
- Incorrect Names: Subject Alternative Names (SANs) not matching hostnames or IPs
- Missing Certificates: Required certificates missing or not in expected locations
- Permission Issues: Certificate files have incorrect permissions
- Clock Skew: System time significantly different between nodes
- Certificate Rotation Failure: Automated rotation failed to replace certificates
- Custom CA Issues: Custom CA configuration problems
- Webhook Certificate Issues: Admission webhooks with invalid certificates
- Kubeconfig Issues: Invalid certificate data in kubeconfig files
# For kubeadm clusters, check expiration of all certificates
sudo kubeadm certs check-expiration
# Manually check a specific certificate
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates# Check certificate Subject and Subject Alternative Names
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 Subject
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"# Verify certificate is signed by the expected CA
sudo openssl verify -CAfile /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/apiserver.crt# Check kube-apiserver logs
sudo crictl logs $(sudo crictl ps -a --name kube-apiserver -q)
# Check kubelet logs
sudo journalctl -u kubelet | grep -i certificate
# Check etcd logs
sudo crictl logs $(sudo crictl ps -a --name etcd -q)# Check system time and NTP status
date
timedatectl status# Check permissions on certificate files
ls -la /etc/kubernetes/pki/For kubeadm clusters:
# Renew all certificates
sudo kubeadm certs renew all
# Renew a specific certificate
sudo kubeadm certs renew apiserver
sudo kubeadm certs renew apiserver-kubelet-client
sudo kubeadm certs renew front-proxy-client
sudo kubeadm certs renew etcd-server
# etc.For non-kubeadm clusters, use your certificate management system or manually regenerate certificates.
# For static pods (in kubeadm), move manifest away and back
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
sudo mv /etc/kubernetes/manifests/kube-controller-manager.yaml /tmp/
sudo mv /etc/kubernetes/manifests/kube-scheduler.yaml /tmp/
sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/
sleep 5
sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
sudo mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
sudo mv /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/
sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/
# Restart kubelet after certificate renewal
sudo systemctl restart kubeletIf kubelet client certificate has issues:
# Backup old certificate and generate new one
sudo mv /var/lib/kubelet/pki/kubelet-client-current.pem /var/lib/kubelet/pki/kubelet-client-current.pem.old
sudo kubeadm init phase kubeconfig kubelet
# Restart kubelet
sudo systemctl restart kubelet# Install NTP
sudo apt-get update && sudo apt-get install -y ntp # Debian/Ubuntu
sudo yum install -y ntp # RHEL/CentOS
# Configure NTP
sudo systemctl enable ntp
sudo systemctl start ntp
# Or use chronyd
sudo systemctl enable chronyd
sudo systemctl start chronyd
# Manually set time if needed
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"# Set correct permissions for certificate files
sudo chmod 600 /etc/kubernetes/pki/*.key
sudo chmod 644 /etc/kubernetes/pki/*.crt
sudo chown root:root /etc/kubernetes/pki/*For webhook certificate issues:
# Update the caBundle field in the webhook configuration
CA_BUNDLE=$(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}')
kubectl patch mutatingwebhookconfiguration <webhook-name> \
--type='json' -p="[{'op': 'replace', 'path': '/webhooks/0/clientConfig/caBundle', 'value':'${CA_BUNDLE}'}]"If kubeconfig files have certificate issues:
# Backup old config
sudo cp /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.backup
# Regenerate kubeconfig files with kubeadm
sudo kubeadm init phase kubeconfig allIn the worst case, you may need to completely regenerate all certificates:
# Backup existing PKI
sudo cp -r /etc/kubernetes/pki /etc/kubernetes/pki.backup
# Remove problematic certificates
sudo rm /etc/kubernetes/pki/apiserver*
sudo rm /etc/kubernetes/pki/etcd/*
# Regenerate certificates
sudo kubeadm init phase certs all- Certificate Monitoring: Set up monitoring for certificate expiration dates
- Automated Renewal: Implement automated certificate renewal
- Certificate Management: Use a certificate management solution like cert-manager
- Regular Testing: Periodically test certificate renewal processes
- Documentation: Document certificate locations, renewal procedures, and expiration dates
- Time Synchronization: Ensure all nodes have synchronized time
- Backup Certificates: Maintain secure backups of certificates and private keys
- Longer Validity Periods: Consider using longer validity periods for certificates
- Root CA Protection: Securely store root CA private keys
- Certificate Rotation Strategy: Plan for regular certificate rotation