Fehlermeldung
Unable to connect to the server: tls: failed to verify certificate: x509: certificate has expired or is not yet valid
Go hängt beide Zeitpunkte an: „…: current time <client time> is after <notAfter>“ (oder „is before <notBefore>“ bei Zertifikaten, die noch nicht gültig sind) – daran siehst du, welche Seite falsch liegt.
kubectl (client-go) — the API server certificate (often after a year without kubeadm upgrades) is outside its validity period
Was der Fehler bedeutet
Der API-Server hat ein Zertifikat vorgelegt, das nach der lokalen Uhrzeit von kubectl außerhalb seines Gültigkeitszeitraums liegt. In kubeadm-Clustern werden die Control-Plane-Zertifikate für ein Jahr ausgestellt und nur bei kubeadm-Upgrades automatisch erneuert; Cluster, die ein Jahr lang niemand angefasst hat, scheitern deshalb genau so. Eine falsch gehende Uhr auf dem Client erzeugt denselben Fehler.
Warum der Fehler auftritt
Control-Plane-Zertifikate von kubeadm sind nach einem Jahr abgelaufen
häufigDie Zertifikate für apiserver, front-proxy und etcd (und die Client-Zertifikate in admin.conf) sind standardmäßig ein Jahr gültig; erneuert werden sie bei kubeadm upgrade oder mit kubeadm certs renew.
Das Client-Zertifikat in deiner kubeconfig ist abgelaufen
gelegentlichNachdem die Serverzertifikate erneuert wurden, scheitert eine alte admin.conf mit abgelaufenem Client-Zertifikat bei der Authentifizierung (mit einer anderen Meldung: „You must be logged in to the server (Unauthorized)“).
Falsch gehende Uhr
gelegentlich„is before“ in der vollständigen Meldung heißt: Die Uhr des Clients steht noch vor dem notBefore des Zertifikats.
So behebst du den Fehler
- 1.
Ablaufdaten der Zertifikate auflisten
kubeadm certs check-expiration zeigt jedes Control-Plane-Zertifikat mit seiner verbleibenden Laufzeit.
bash # On a control-plane node sudo kubeadm certs check-expiration - 2.
Zertifikate erneuern und Control Plane neu starten
kubeadm certs renew all schreibt neue Zertifikate; die Static Pods müssen neu gestartet werden, um sie zu laden, und kubeconfigs mit eingebetteten Client-Zertifikaten müssen aktualisiert werden.
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.
Uhrzeit des Clients prüfen
Synchronisiere die Uhr, wenn die vollständige Meldung „is before“ enthält.
bash date -u; timedatectl status | grep -i synchronized