웹 서비스가 503 을 내고 ingress-nginx 컨트롤러 로그에 아래가 찍힌다.
dataprocessing-dataprocessing-service does not have any active endpoint
nginx 나 ingress 설정 문제가 아니라, ingress 가 가리키는 Service 뒤에 Ready 상태 Pod 가 하나도 없거나 그 이름의 Service 가 아예 없다는 뜻이다. 두 경우 모두 같은 메시지와 503 으로 떨어진다.
# 1) ingress 가 가리키는 Service 이름 · 포트
k get ingress -n <ns> -o custom-columns='NAME:.metadata.name,HOST:.spec.rules[*].host,PATH:.spec.rules[*].http.paths[*].path,SVC:.spec.rules[*].http.paths[*].backend.service.name,PORT:.spec.rules[*].http.paths[*].backend.service.port.number'
# 2) 그 이름의 Service 가 존재하고 엔드포인트가 붙어 있는지
k get svc -n <ns> | grep dataprocessing
k get endpoints -n <ns> <svc-name>
# 3) Pod 상태
k get pods -n <ns> -o wide | grep dataprocessing
# 4) 셀렉터와 라벨 대조 (Running/Ready 인데 endpoints 가 <none> 일 때)
k get svc -n <ns> <svc-name> -o jsonpath='{.spec.selector}'
k get pods -n <ns> --show-labels | grep dataprocessing
# 5) ingress 가 인식하는 백엔드
k describe ingress -n <ns> <ingress-name> # Backends 항목에 엔드포인트 IP 가 찍혀야 정상
k get endpoints 가 <none> 이면 매칭되는 Ready Pod 가 없는 것이다. Pod 가 CrashLoopBackOff 면 앱 문제, Running 인데 READY 0/1 이면 readiness probe 실패(k describe pod 의 Events 확인), Pod 가 0개면 replica 0 또는 스케줄링 실패다.
실제 Service 는 dataprocessing-service(엔드포인트 정상, 8080) 와 dataprocessing-processing-service(엔드포인트 <none>) 둘이었고, ingress 도 dataprocessing-ingress 와 dataprocessing-processing-ingress 두 세트가 평행하게 있었다. nginx 가 찾던 dataprocessing-dataprocessing-service 는 어느 쪽도 아닌 없는 이름이었다. Helm 템플릿에서 {{ .Release.Name }}-{{ .Values.serviceName }} 처럼 prefix 가 두 번 붙거나 매니페스트 오타에서 흔히 생긴다.
조치는 ingress 의 backend 를 살아 있는 Service 로 바꾸는 것이다. 이때 포트는 Pod 의 8080 이 아니라 Service 의 port 값을 넣는다.
backend:
service:
name: dataprocessing-service
port:
number: <Service 의 spec.ports[].port>
k edit 로 고친 것은 다음 배포에서 Helm/매니페스트가 다시 덮어쓸 수 있으므로 원본 차트의 service name 도 함께 고친다. 두 ingress 가 같은 host 를 선언하면 먼저 만들어진 쪽이 이기고 나머지는 무시되면서 경고를 남기니(k logs <controller> | grep -i conflict) 불필요한 세트는 지운다.
port.number 가 Service 의 port 와 다르면 이름이 맞아도 503 이다. k get svc <name> -o yaml | grep -A8 ports 로 대조한다.READY 1/1 이 아닐 수 있다.ingressClassName 이 비어 있거나 다른 컨트롤러를 가리키면 nginx 가 반영하지 않는다. k get ingress <name> -o jsonpath='{.spec.ingressClassName}' 로 확인한다.k logs -f <nginx-controller-pod> | grep -i <svc> 를 띄워 두고 URL 을 한 번 호출하면 현재 503 의 정확한 사유가 찍힌다.