Mensaje de error
Unable to connect to the server: tls: failed to verify certificate: x509: certificate has expired or is not yet valid
Go añade ambos instantes: «…: current time <client time> is after <notAfter>» (o «is before <notBefore>» en los certificados que aún no son válidos), lo que te indica en qué lado está el error.
kubectl (client-go) — the API server certificate (often after a year without kubeadm upgrades) is outside its validity period
Qué significa
El servidor de API presentó un certificado que, según la hora local de kubectl, está fuera de su período de validez. En los clústeres de kubeadm, los certificados del plano de control se emiten por un año y solo se renuevan automáticamente durante las actualizaciones con kubeadm, así que los clústeres que nadie toca durante un año fallan exactamente así. Un reloj incorrecto en el cliente produce el mismo error.
Por qué ocurre
Los certificados del plano de control de kubeadm caducaron al cabo de un año
frecuenteLos certificados de apiserver, front-proxy y etcd (y los certificados de cliente de admin.conf) son válidos durante un año de forma predeterminada; se renuevan con kubeadm upgrade o con kubeadm certs renew.
Caducó el certificado de cliente de tu kubeconfig
ocasionalUna vez renovados los certificados del servidor, un admin.conf antiguo con un certificado de cliente caducado no supera la autenticación (con otro mensaje: «You must be logged in to the server (Unauthorized)»).
Desfase de reloj
ocasional«is before» en el mensaje completo indica que el reloj del cliente va por detrás del notBefore del certificado.
Cómo solucionarlo
- 1.
Listar las fechas de caducidad de los certificados
kubeadm certs check-expiration muestra cada certificado del plano de control con la vida útil que le queda.
bash # On a control-plane node sudo kubeadm certs check-expiration - 2.
Renovar y reiniciar el plano de control
kubeadm certs renew all escribe certificados nuevos; hay que reiniciar los pods estáticos para que los carguen, y hay que actualizar los kubeconfig que llevan certificados de cliente incrustados.
bash sudo kubeadm certs renew all # restart the control-plane static pods so they load the new certificates, # then refresh your kubeconfig (the embedded client certificate was renewed too): sudo cp /etc/kubernetes/admin.conf "$HOME/.kube/config" - 3.
Comprobar la hora del cliente
Sincroniza el reloj si el mensaje completo dice «is before».
bash date -u; timedatectl status | grep -i synchronized