Сообщение об ошибке
Unable to connect to the server: tls: failed to verify certificate: x509: certificate has expired or is not yet valid
Go добавляет оба момента времени: «…: current time <client time> is after <notAfter>» (или «is before <notBefore>» для сертификатов, которые ещё не действительны), и по ним видно, какая сторона ошибается.
kubectl (client-go) — the API server certificate (often after a year without kubeadm upgrades) is outside its validity period
Что это означает
API-сервер предъявил сертификат, который по локальному времени kubectl находится вне срока действия. В кластерах kubeadm сертификаты управляющего слоя (control plane) выпускаются на один год и продлеваются автоматически только при обновлении через kubeadm upgrade, поэтому кластеры, которые год никто не трогал, выдают именно эту ошибку. Неправильно идущие часы на клиенте приводят к той же ошибке.
Почему это происходит
Через год истёк срок действия сертификатов управляющего слоя kubeadm
частоСертификаты apiserver, front-proxy и etcd (а также клиентские сертификаты в admin.conf) по умолчанию действительны один год; они продлеваются при kubeadm upgrade или командой kubeadm certs renew.
Истёк срок действия клиентского сертификата в kubeconfig
иногдаПосле продления серверных сертификатов старый admin.conf с просроченным клиентским сертификатом не проходит аутентификацию (сообщение при этом другое: «You must be logged in to the server (Unauthorized)»).
Расхождение часов
иногдаСлова «is before» в полном тексте ошибки указывают, что часы клиента показывают время раньше notBefore сертификата.
Как исправить
- 1.
Выведите сроки действия сертификатов
kubeadm certs check-expiration показывает все сертификаты управляющего слоя и оставшийся срок действия каждого.
bash # On a control-plane node sudo kubeadm certs check-expiration - 2.
Продлите сертификаты и перезапустите управляющий слой
kubeadm certs renew all записывает новые сертификаты; чтобы они загрузились, статические поды нужно перезапустить, а файлы kubeconfig со встроенными клиентскими сертификатами — обновить.
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.
Проверьте время на клиенте
Синхронизируйте часы, если в полном тексте ошибки есть «is before».
bash date -u; timedatectl status | grep -i synchronized