2026. 2. 7. 19:28ㆍk8s
— pending 상태에서 DNS 문제를 찾아내기까지
1. 시작: 인증서 설정은 했는데 동작하지 않았다
Ingress에 TLS 설정을 추가하고
cert-manager를 통해 Let’s Encrypt 인증서를 자동 발급하도록 구성했다.
설정은 단순했다.
- cert-manager 설치됨
- ClusterIssuer(
letsencrypt-prod) 존재 - Ingress에 issuer annotation 설정
- HTTP-01 챌린지 사용
하지만 결과는 예상과 달랐다.
HTTPS는 붙지 않았고, 인증서 상태를 확인해보니 다음과 같았다.
kubectl get certificate -n grafana
READY: False
즉, 인증서가 발급되지 않은 상태(pending) 였다.
2. “지금 상태가 뭔지”부터 확인하기 시작
막연히 설정을 고치기 전에,
cert-manager가 어디까지 진행했는지부터 확인했다.
kubectl get certificate,certificaterequest,order,challenge -n grafana
결과는 이랬다.
- Certificate:
READY=False - Order:
pending - Challenge:
pending
이 상태에서 중요한 점은 하나다.
cert-manager는 동작을 시작했지만
어딘가에서 멈춰 있다
그래서 describe로 이유를 확인했다.
3. 증상 확인: HTTP self-check 실패
kubectl describe challenge <challenge-name> -n grafana
여기서 핵심 메시지가 나왔다.
failed to perform self check GET request
context deadline exceeded
이 문장의 의미는 명확하다.
cert-manager가
http://도메인/.well-known/acme-challenge/...
로 직접 HTTP 요청을 시도했지만,
응답을 받지 못했다.
즉, 문제는 인증서 이전 단계,
HTTP 요청이 제대로 도달하지 않는 것이었다.
4. Ingress부터 의심하고 확인
다음 질문은 자연스럽게 이것이었다.
“Ingress 설정이 잘못된 걸까?”
그래서 Ingress 상태를 확인했다.
kubectl get ingress -n grafana
- Ingress 존재
- ADDRESS 할당됨
- 80 / 443 포트 노출
또한 ingress controller 로그를 확인했다.
kubectl logs deploy/ingress-nginx-controller -n ingress-nginx
여기서 이런 로그가 반복적으로 보였다.
Service "nginx/hello" does not have any active Endpoint
이 로그가 의미하는 바는 이렇다.
- ingress controller는 정상적으로 요청을 받고 있음
- 특정 서비스(hello)의 backend를 못 찾고 있다는 메시지
즉,
ingress controller 자체는 정상 동작 중이다
다만 중요한 점이 하나 더 있었다.
- 문제의 도메인(grafana)에 대한 요청 로그는 보이지 않았다
5. 여기서 판단한 핵심 포인트
이 시점에서 이렇게 판단했다.
- ingress controller는 살아 있음
- 다른 도메인/서비스 요청은 정상적으로 처리 중
- 그런데 grafana 도메인 요청만 ingress 로그에 없음
즉,
“Ingress까지 요청이 오지 않고 있다”
Ingress 이후의 설정 문제가 아니라,
Ingress 이전 단계(DNS/네트워크) 를 봐야 하는 상황이었다.
6. 도메인 IP 확인 → 실마리 발견
그래서 도메인의 IP 정보를 확인했다.
dig grafana.example.com
그 결과:
- 도메인이 가리키는 IP ≠ ingress controller IP
여기서 모든 게 연결됐다.
- cert-manager는 클러스터 내부에서
도메인을 기준으로 HTTP self-check 수행 - 내부 DNS에 등록된 IP가 ingress controller IP가 아님
- 그 IP로 요청을 보내니 응답이 없음
- self-check timeout → Challenge pending → 인증서 미발급
7. 조치와 결과
내부 DNS에 등록된 도메인 IP를
실제 ingress controller IP로 수정했다.
그 후 다시 상태를 확인했다.
kubectl get certificate,order,challenge -n grafana
결과는 즉시 바뀌었다.
- Challenge →
valid - Order →
valid - Certificate →
READY=True - TLS Secret 자동 생성
HTTPS 접속도 정상 동작했다.
8. 정리
이번 문제의 핵심은 단순했다.
- 인증서 설정 ❌ 문제 아님
- Ingress 설정 ❌ 문제 아님
- cert-manager 동작 ❌ 문제 아님
- 내부 DNS에 잘못 등록된 도메인 IP가 원인
특히 헷갈렸던 이유는:
- 외부 접속은 정상
- 서비스도 정상
- ingress controller도 정상
그런데 cert-manager만 실패했기 때문이다.
9. 교훈
- 인증서가
pending일 때는
설정부터 고치기보다 현재 상태를 단계별로 확인해야 한다 pending은 실패가 아니라 단서- HTTP-01은
클러스터 내부에서의 DNS 해석 결과가 결정적
10. 한 줄 요약
인증서가 발급되지 않았던 이유는 설정 문제가 아니라,
내부 DNS에 등록된 도메인 IP가
ingress controller IP와 달랐기 때문이었다.
'k8s' 카테고리의 다른 글
| Fluentd로 Slack 알림 연결하기 (Kubernetes + Minecraft 로그) (0) | 2026.02.11 |
|---|---|
| Kubernetes 클러스터 변경 시 kubeconfig 재설정 방법 (Windows 11) (0) | 2026.02.08 |
| k8s namespace안의 모든 내용 조회 (0) | 2025.09.26 |
| K8S MetalLB에서 할당된 IP를 확인하는 방법 (0) | 2025.09.13 |
| Postgresql helm chart로 설치하기 (0) | 2025.09.13 |