Перейти к содержимому
ecdsa.com
kubectl (client-go)Docker и Kubernetes

Сообщение об ошибке

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, поэтому кластеры, которые год никто не трогал, выдают именно эту ошибку. Неправильно идущие часы на клиенте приводят к той же ошибке.

Почему это происходит

Как исправить

  1. 1.

    Выведите сроки действия сертификатов

    kubeadm certs check-expiration показывает все сертификаты управляющего слоя и оставшийся срок действия каждого.

    bash
    # On a control-plane node
    sudo kubeadm certs check-expiration
  2. 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. 3.

    Проверьте время на клиенте

    Синхронизируйте часы, если в полном тексте ошибки есть «is before».

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

Связанные ошибки

Открыть всю базу ошибок подписей