집안의 홈서버에서 k3s 3node 를 이용한 HA 구성 연습을 하면서..
일주일동안 진전이 없던 부분이 있었다.
바로 traefik 기본 설정된 ACME 에서는 HA 구성이 안된다는 것을 알고 별도의 CertManager 를 이용하는 것이었는데..
아무리 해도 동작이 안되었다.
검색해본 모든 포스트를 해보고 각종 AI 의 솔루션들을 모두 적용해본것 같다.
Lets Encrypt 에서 내 도메인으로 인증시 .well-known/~~~ 주소로 들어와서 확인을 하게 되는데
이 부분이 지속적으로 404 에러와 함께 동작하지 않았다.
그 부분을 기록으로 남겨보려고 한다.
상황
내 서버는 일단 pfSense 가 공인아이피를 받아서 내부ip로 NAT 를 하는 구조이다.
또한 그 밑에는 k3s 3개 노드가 존재한다.
아이피는 10.34.1.151~153까지이고 10.34.1.150 으로 VIP를 설정해 두었다.
설치는
* k3s with traefik
* metallb
* 샘플 웹서비스
* cert-manager
여기까지 되어 있다.
이슈상황

여기까지가 기본 실전 편에 작성된 내용이다.

인증서도 이런식으로 나온다.
그럼 상세 로그는 어떻게 되어 있을까?

이렇게 pending 이 되어 있다.
gglabadmin@k3s-node1:/k8s$ sudo kubectl describe challenge filmlife-net-tls-1-975396145-3416726947
Name: filmlife-net-tls-1-975396145-3416726947
Namespace: default
Labels: <none>
Annotations: <none>
API Version: acme.cert-manager.io/v1
Kind: Challenge
Metadata:
Creation Timestamp: 2025-11-29T05:08:21Z
Finalizers:
acme.cert-manager.io/finalizer
Generation: 1
Owner References:
API Version: acme.cert-manager.io/v1
Block Owner Deletion: true
Controller: true
Kind: Order
Name: filmlife-net-tls-1-975396145
UID: f12104d5-7dc8-4698-9dba-1239ad77afaa
Resource Version: 2561
UID: a332f39e-4f8b-4520-9b84-ebe67612f56e
Spec:
Authorization URL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/246692703/20467262633
Dns Name: filmlife.net
Issuer Ref:
Group: cert-manager.io
Kind: ClusterIssuer
Name: letsencrypt-staging
Key: 49xTkDoY-6f9xWD7a0cRlD42YxoP6YbKZan9qXdzk3E.Hlx_gzxyxrU8i0M-dfpCkbRXI1EL21pGiBbC4v_vsKU
Solver:
http01:
Ingress:
Class: traefik
Token: 49xTkDoY-6f9xWD7a0cRlD42YxoP6YbKZan9qXdzk3E
Type: HTTP-01
URL: https://acme-staging-v02.api.letsencrypt.org/acme/chall/246692703/20467262633/TcD2yw
Wildcard: false
Status:
Presented: true
Processing: true
Reason: Waiting for HTTP-01 challenge propagation: wrong status code '404', expected '200'
State: pending
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Started 5m7s cert-manager-challenges Challenge scheduled for processing
Normal Presented 5m7s cert-manager-challenges Presented challenge using HTTP-01 challenge mechanism
여기 보면 status reason 부분을 보면
Waiting for HTTP-01 challenge propagation: wrong status code '404', expected '200'
이렇게 나온다. lests encrypt 에서 인증서 발급을 하기 위해 도메인 인증을 하고 내 서버에 접근했을때 특정 url 에 토큰을 넘겼을때 200 으로 리턴을 하게 되고 그것을 검증하는 과정이 있는데 그때 200 이 아니라 404가 온다는 것이다.
내가 아는 모든 gpt 에 물어보니...
http 80 으로 요청이 올때 certmanager pod 가 응답을 해야하는데 내 샘플 웹서비스로 응답이 들어온다는 것이다.
그래서 잘못된 라우팅을 자꾸 한다고 한다.
참 이상했다.
% curl -I http://filmlife.net/.well-known/acme-challenge/49xTkDoY-6f9xWD7a0cRlD42YxoP6YbKZan9qXdzk3E
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 87
Content-Type: text/plain; charset=utf-8
Date: Sat, 29 Nov 2025 05:16:08 GMT
이상한건.. 내 노트북에서 호출하면 이렇게 잘 나오는데???
왜그럴까????
lets encrypt 인증서를 발급할때는
1. letsencrypt 측에서 출발해서 내 서버에 검증
2. 내부에서 다시한번 인증 검증
이렇게 두 단계를 모두 수행하게 된다고 하는데.
외부에서 curl 이 잘되는 것은 1번의 이유때문이고 이 부분은 문제가 없었던 것인데.
내부에서 검증을 시도하려고 할때는
중간에 있는 pfsense 방화벽에서.. filmlife.net 의 도메인을 보고.. 어 내꺼네?? 하고 무시해버린다고 한다.
그래서 아래 설정을 켜면 정상적으로 라우팅을 해준다고 한다.
pfSense 설정 변경

맨위에 pure Nat 로 하고 아래 automatic outbound Nat for Reflection 을 체크
하니까 해결되었다.
gglabadmin@k3s-node1:/k8s/apps/filmlife$ sudo kubectl get challenges
NAME STATE DOMAIN AGE
filmlife-net-tls-1-975396145-1653609454 pending filmlife.net 3m23s
gglabadmin@k3s-node1:/k8s/apps/filmlife$ sudo kubectl get challenges
NAME STATE DOMAIN AGE
filmlife-net-tls-1-975396145-1653609454 valid filmlife.net 3m25s
gglabadmin@k3s-node1:/k8s/apps/filmlife$ sudo kubectl get challenges
No resources found in default namespace.
pending -> valid -> 사라짐
'인프라 > Kubernetes' 카테고리의 다른 글
| k3s Cert-Manager 에서 외부 서비스로 Proxy (0) | 2025.11.30 |
|---|---|
| k3s 에서 dnszi 유동아이피 연동 스케쥴 추가하기 (0) | 2025.11.30 |
| (실전) k8s 설치부터 https 서비스 포팅까지 (0) | 2025.11.23 |
| (연습) k3s HA 구성 트래픽 흐름 구조 (0) | 2025.11.21 |
| (연습) k3s VIP 설정 (MetalLB) (0) | 2025.11.20 |
