Рейтинг:3

Kubernetes Nginx Ingress and cert-manager Waiting for HTTP-01 challenge propagation: wrong status code '401', expected '200'

флаг cd

I'm having issues with my rapberry pi kubernetes implementation

Problem:

I have cert-manager letsencrypt ACME challenge waiting due to a 401 error code on bare metal kubernetes install.

Setup

Platform: Raspberry Pi 4

OS: Ubuntu Server 20.04.3 LTS 64 bit

Ingress: Nginx

Loadbalancer: Metallb

Networking: Calico

I installed metallb and nginx via helm using:

helm install metallb metallb/metallb --namespace kube-system\
    --set configInline.address-pools[0].name=default\
    --set configInline.address-pools[0].protocol=layer2\
    --set configInline.address-pools[0].addresses[0]=<ip-range>

and

helm install ingress-nginx ingress-nginx/ingress-nginx --namespace kube-system

My letsencrypt looks like this:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: cert-manager
spec:
  acme:
    email: <email redacted>
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx

My nginx ingress set up looks like this:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: "nextcloud" # Same namespace as the deployment
  name: "nextcloud-ingress" # Name of the ingress (see kubectl get ingress -A)
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    cert-manager.io/cluster-issuer: "letsencrypt-prod" # Encrypt using the ClusterIssuer deployed while setting up Cert-Manager
    nginx.ingress.kubernetes.io/proxy-body-size:  "125m" # Increase the size of the maximum allowed size of the client request body
spec:
  tls:
  - hosts:
    - "nextcloud.<domain redacted>" # Host to access nextcloud
    secretName: "nextcloud-prod-tls" # Name of the certificate (see kubectl get certificate -A)
  rules:
  - host: "nextcloud.<domain redacted>" # Host to access nextcloud
    http:
      paths:
        - path: /  # We will access NextCloud via the URL https://nextcloud.<domain.com>/
          pathType: Prefix
          backend:
            service: 
              name: "nextcloud-server" # Mapping to the service (see kubectl get services -n nextcloud)
              port: 
                number: 80 # Mapping to the port (see kubectl get services -n nextcloud)
---

Debugging

When I look at the ingress controller logs (different namespace) I see:

Service "nextcloud/cm-acme-http-solver-9tccf" does not have any active Endpoint.

But the endpoint appears to exist when I do kubectl get endpoints -A

My certificate exists as:

kubectl get certificate -n nextcloud
NAME                 READY   SECRET               AGE
nextcloud-prod-tls   False   nextcloud-prod-tls   3h58m

Following the recommended debug steps from cert manager I tracked the issue to the challenges whereby I get:

Status:
  Presented:   true
  Processing:  true
  Reason:      Waiting for HTTP-01 challenge propagation: wrong status code '401', expected '200'
  State:       pending
Events:        <none>

I'm kinda stuck I've been googling my heart out but there doesn't seem to be a lot on this. I'm guessing I've stuffed up on the set up but I've mainly been following the documentation on the relevant pages. Any pointers would be greatly appreciated :). If you need any additional info let me know this is currently quite long so I tried to include what I thought were problem points.

Dennis Nolte avatar
флаг us
если я правильно прочитал вашу настройку, вы получите 401 в папке/файле, который запрашивает менеджер сертификатов (certbot?). Похоже, это связано с тем, что вызов из letsencrypt перенаправляется на что-то, что вы можете защитить паролем. Ваши журналы nginx должны показать вам запрос к некоторому имени папки .well-known или похожему. После этого идет общее имя. Он должен быть доступен постороннему (в этом примере certbot) Для меня лучше всего было исключить этот конкретный каталог для прямого обслуживания nginx. Что-то вроде блока location.well-known в конфиге nginx.
Mikołaj Głodziak avatar
флаг id
Идея @DennisNolte хороша. Не могли бы вы попробовать и узнать нас, если это работает?
Llewyn S avatar
флаг cd
@DennisNolte Спасибо за ваш ответ, я не смог найти никаких попыток доступа к каталогу /.well-known/ в журнале контроллера Nginx, но я смог найти ссылку на него и мой домен в nginx.conf Вы предлагаете мне изменить местоположение /.well-known/ на другой каталог в nginx.conf?
Mikołaj Głodziak avatar
флаг id
Вы видели [эту тему] (https://github.com/jetstack/cert-manager/issues/2517)? Это похоже на вашу проблему?
Llewyn S avatar
флаг cd
@ MikoÅajGÅodziak Я просмотрел его, но не нашел ничего подходящего. Похоже, что большинство людей не получают 401...Я понятия не имею, как отлаживать, так как в журнале входящего трафика нет проблем с разрешениями. Просто вызов сертификата получает ошибку 401. Мне интересно, могу ли я как-то добавить cert-manager в группу RBAC или что-то в этом роде...
Dennis Nolte avatar
флаг us
вам нужно будет попытаться выяснить, с помощью чего запрос сертификата на самом деле обращается к вашему серверу, это должно быть в журналах ingres. Файл обычно называется что-то вроде access.log, возможно, с именем домена впереди. В этом файле вы найдете HTTP-вызов, который получает nginx. Если вы не найдете там никаких записей, сделайте что-нибудь вручную, чтобы подтвердить правильный файл журнала. То же самое верно и для вашего бэкенда, но его, возможно, придется сначала настроить. Как только вы узнаете правильный вызов, вы можете убедиться, что вы разрешаете доступ к этому каталогу, и определить, кто должен обслуживать этот каталог.
Wytrzymały Wiktor avatar
флаг it
Привет @LlewynS. Любые обновления?
Llewyn S avatar
флаг cd
Еще нет, я не смог отследить какие-либо полезные журналы.
Llewyn S avatar
флаг cd
ОК, я создал минимальный пример без диспетчера сертификатов. Я обнаружил, что если я пытался подключиться к своему полному доменному имени через домашнюю сеть, это фактически приводило меня к входу в систему маршрутизатора... Теперь я могу подключиться через полное доменное имя через VPN или мобильный телефон. На самом деле это не решает проблемы с cert-manager 401, за исключением случаев, когда маршрутизация через домашнюю сеть также отправляет его на вход в маршрутизатор, а не на вход ....
Рейтинг:1
флаг jp

В моем случае clusterissuer указывал на неправильный входной класс

kubectl редактировать кластерный эмитент XXXX

решатели:
- http01:
    вход:
      класс: nginternal

Убедитесь, что класс указывает на то же, что и вход.

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.