Saltar al contenido
ecdsa.com
kubectl (client-go)Docker y Kubernetes

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

Cómo solucionarlo

  1. 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. 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. 3.

    Comprobar la hora del cliente

    Sincroniza el reloj si el mensaje completo dice «is before».

    bash
    date -u; timedatectl status | grep -i synchronized

Errores relacionados

Explorar toda la base de datos de errores de firma