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 루프백을 수행할 수 없다는 것이었습니다.
이 기능을 갖춘 라우터를 구입하면 문제가 해결되었습니다. 이와 같은 문제가 있는 사람에게 도움이 되기를 바랍니다.