kube-apiserver сообщает в логах, что сертификат истек, хотя это не так.

Вопрос или проблема

kube-apiserver pod выводит следующий лог:

authentication.go:104] Unable to authenticate the request due to an error: x509: certificate has expired or is not yet valid

Я уже обновил все сертификаты
обновить сертификаты

admin.conf скопирован в ~/.kube/config
Я удалил kubelet.conf и файлы из /var/lib/kubelet/pki, а затем создал новые.
После этого kubelet был перезапущен. Я также перезапустил pod apiserver, но он все равно выводит лог, что сертификат просрочен.
Интересно, что у меня нет проблем с кластером. Kubectl работает как всегда.
Я использую версию v1.17.6. Мой кластер имеет 2 мастера и 8 рабочих узлов.
Есть идеи?

У меня была такая же проблема.
Я перезапустил все 4 статических pod кластера, временно удалив их манифесты из /etc/kubernetes/manifests/ и вернув их через 20 секунд, как сказано в документации.

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#manual-certificate-renewal

Сначала я удалил и вернул kube-apiserver.yaml, затем kube-controller-manager.yaml, после этого kube-scheduler.yaml и наконец etcd.yaml.

Не знаю, сработает ли это, если вы удалите и вернете их все сразу.

Я знаю, что это старый вопрос, но когда вы сталкиваетесь с истечением срока действия сертификатов, всегда следует попытаться:

kubeadm certs check-expiration

обновить просроченные (например, admin.conf):

kubeadm certs admin.conf

И развернуть их снова, если необходимо (например, admin.conf):

cat /etc/kubernetes/admin.conf > ~/.kube/config

Ответ или решение

Чтобы решить проблему с сообщением kube-apiserver о просроченном сертификате, даже если он на самом деле обновлён, необходимо детально разобраться в процессе управления сертификатами в Kubernetes. Это требует понимания теоретических основ, анализа текущего состояния и применения корректных практик для устранения проблемы.

Теоретическая основа

Kubernetes полагается на сертификаты X.509 для аутентификации различных компонентов кластера. kube-apiserver, в частности, использует несколько сертификатов для обеспечения безопасной связи с другими компонентами кластера. Основные сертификаты включают:

  • Сертификаты для API-сервера, используемые для обеспечения связи между компонентами кластера.
  • Клиентские сертификаты для kubelet и других компонентов.

Служба kube-apiserver проверяет срок действия сертификатов при аутентификации запросов. Ошибка "x509: certificate has expired or is not yet valid" указывает на проблему с датой истечения срока действительности сертификата. Она может возникнуть даже если сам сертификат обновлен, но не был корректно внедрён на всех узлах или компонентах.

Пример проблемы

Проблема может быть вызвана несколькими причинами:

  1. Необновлённые конфигурационные файлы: Даже если сертификаты обновлены, если соответствующие конфигурационные файлы, как admin.conf, kubelet.conf или другие, не были должным образом обновлены и перезапущены, ошибка может продолжаться.

  2. Кэширование или задержка в распространении изменений: Некоторые узлы или компоненты кластера могут использовать старые кэшированные версии сертификатов, что приводит к продолжению возникновения ошибки.

  3. Конфликты с временем на серверах: Если часы на сервере настроены неправильно, это может вызвать несогласованность во времени, что и приводит к ошибкам с сертификатами.

  4. Ошибки при перезапуске компонентов: Также существует возможность, что некоторые компоненты не были корректно перезапущены после обновления сертификатов.

Применение и решение

  1. Проверка срока действия сертификатов: Используйте команду kubeadm certs check-expiration, чтобы убедиться, что ни один из сертификатов действительно не истёк. Эта команда предоставит список всех сертификатов и их актуальные даты истечения.

    kubeadm certs check-expiration
  2. Обновление сертификатов: Если необходимо обновление, выполните:

    kubeadm certs renew all
  3. Развёртывание обновлённых конфигурационных файлов: Обязательно убедитесь, что admin.conf, kubelet.conf и другие конфигурационные файлы обновлены на всех узлах. Например:

    cp /etc/kubernetes/admin.conf ~/.kube/config
  4. Перезапуск компонентов: После обновления сертификатов и конфигурационных файлов, перезапустите все сессионные компоненты Kubernetes. Часто это можно сделать, временно удаляя манифесты подов в /etc/kubernetes/manifests/ для статических подов на всех узлах мастер.

    mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
    sleep 20
    mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/

    Следуйте этой же схеме и для других статических подов: kube-controller-manager.yaml, kube-scheduler.yaml, и etcd.yaml.

  5. Синхронизация времени на серверах: Убедитесь, что время синхронизировано на всех узлах кластера. Используйте службы NTP или аналогичные решения для поддержания единого актуального времени.

  6. Проверка журналов и устранение проблем: После выполнения вышеуказанных шагов, проверьте журналы kubelet и kube-apiserver для выявления остатков ошибок.

Заключение

Хотя ошибка "x509: certificate has expired or is not yet valid" может вызвать беспокойство, она решаемая при систематическом подходе. Следуя указанным шагам, можно обеспечить надёжное обновление и распространение сертификатов по всему кластеру Kubernetes. Это не только решит текущую проблему, но и поможет создать процесс поддержания актуальности сертификатов в будущем.

Оцените материал
Добавить комментарий

Капча загружается...