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 チャレンジが待機状態になっています。

設定

プラットフォーム: Raspberry Pi 4

OS: Ubuntu Server 20.04.3 LTS 64 ビット

イングレス: Nginx

ロードバランサー: Metallb

ネットワーキング: Calico

次のコマンドを使用して、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 ingress の設定は次のようになります。

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

デバッグ

Ingress コントローラーのログ (別の名前空間) を見ると、次のことがわかります。

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

しかし、kubectl get endpoints -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

私の場合、clusterissuerは間違ったイングレスクラスを指していました

kubectl クラスター発行者 XXXX を編集します

solvers:
- http01:
    ingress:
      class: nginternal

クラスが Ingress と同じものを指していることを確認します。

答え2

この問題の解決策は、私が持っていたルーターが NAT ループバックを実行できないということでした。

この機能を備えたルーターを入手することで、私の問題は解決しました。同様の問題を抱えている人の助けになれば幸いです。

関連情報