Kubernetes Nginx Ingress 및 cert-manager HTTP-01 챌린지 전파 대기 중: 잘못된 상태 코드 '401', 예상 '200'

Kubernetes Nginx Ingress 및 cert-manager HTTP-01 챌린지 전파 대기 중: 잘못된 상태 코드 '401', 예상 '200'

Rapberry pi kubernetes 구현에 문제가 있습니다.

문제:

베어메탈 kubernetes 설치 시 401 오류 코드로 인해 cert-manager letsencrypt ACME 챌린지가 대기 중입니다.

설정

플랫폼: 라즈베리 파이 4

OS: 우분투 서버 20.04.3 LTS 64비트

수신: Nginx

로드밸런서: Metallb

네트워킹: 칼리코

다음을 사용하여 helm을 통해 metallb와 nginx를 설치했습니다.

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>

그리고

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

내 letsencrypt는 다음과 같습니다:

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

내 nginx 수신 설정은 다음과 같습니다.

---
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)
---

디버깅

수신 컨트롤러 로그(다른 네임스페이스)를 보면 다음이 표시됩니다.

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

하지만 kubectl get points -A를 수행하면 엔드포인트가 존재하는 것 같습니다.

내 인증서는 다음과 같이 존재합니다.

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

인증서 관리자가 권장하는 디버그 단계에 따라 문제에서 발생하는 문제를 추적했습니다.

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

좀 막혀서 마음을 다해 검색해 봤지만 이에 대한 내용은 많지 않은 것 같습니다. 나는 설정에 대해 충분한 것을 다뤘다고 생각하지만 주로 관련 페이지의 문서를 따르고 있습니다. 어떤 조언이라도 대단히 감사하겠습니다 :). 추가 정보가 필요하면 현재 내용이 꽤 길기 때문에 문제라고 생각되는 내용을 포함하려고 노력했습니다.

답변1

내 경우에는 클러스터 발행자가 잘못된 수신 클래스를 가리키고 있었습니다.

kubectl edit 클러스터 발행자 XXXX

solvers:
- http01:
    ingress:
      class: nginternal

클래스가 수신과 동일한 것을 가리키는지 확인하세요.

답변2

이 질문에 대한 해결책은 제가 가지고 있는 라우터가 NAT 루프백을 수행할 수 없다는 것이었습니다.

이 기능을 갖춘 라우터를 구입하면 문제가 해결되었습니다. 이와 같은 문제가 있는 사람에게 도움이 되기를 바랍니다.

관련 정보