cert-manager не выпускает сертификат Let's Encrypt

Viewed 29

Certificate долго не переходит в Ready: сертификат не выпускается или не выпускается повторно после достижения лимита запросов. Что проверить?

1 Answers

Пройдите по цепочке объектов, ошибка будет в одном из них:

d8 k -n <ns> get certificate,certificaterequest,order,challenge
d8 k -n <ns> describe challenge <имя>

Частые причины:

  • Не проходит самопроверка HTTP-01. Изнутри кластера домен недоступен по внешнему адресу (например, внутренний и внешний DNS отдают разные адреса). Как обойти: направить домен на внутренний адрес Ingress-контроллера через параметр hosts в ModuleConfig kube-dns (пары domain и ip) либо поправить настройки DNS или сети.
  • Проверка DNS-01. Проверка видит устаревшие записи _acme-challenge у DNS-провайдера, или резолверы отвечают по-разному. Удалите лишние записи; резолверы для проверки можно задать в recursiveSettings.nameservers ModuleConfig cert-manager (вместе с useOnlyRecursive: true).
  • Лимиты Let's Encrypt. Дождитесь окончания ограничения и запустите перевыпуск утилитой cmctl (ставится отдельно, в Deckhouse Platform не входит): cmctl renew -n <ns> <certificate>. Если не помогло, удалите зависшие CertificateRequest и Order, cert-manager создаст новые.
  • Не тот ingressClass у временного Ingress проверки HTTP-01. Для всех сертификатов класс задаётся параметром ingressClassHttp01 в ModuleConfig cert-manager. Для одного сертификата в Deckhouse Platform 1.76+ есть аннотация acme.cert-manager.io/http01-override-ingress-ingressclassname: <class> на Certificate. Рекомендуется использовать ресурс Certificate, а не аннотацию kubernetes.io/tls-acme на Ingress.
  • Балансировщик или CDN перед кластером не пропускает HTTP-запросы к /.well-known/acme-challenge/ на порт 80 Ingress-контроллера или отвечает на них сам.

Подробнее в документации: модуль cert-manager, параметры модуля.