Blog

Docker에서 Eureka Client가 접근할 수 없는 IP로 등록됐을 때

Eureka에 클라이언트를 등록하고 Spring Cloud Gateway에서 로드 밸런싱하도록 설정했습니다. 서버의 클라이언트 목록에는 이상이 없어 보였지만 Gateway를 통한 요청은 동작하지 않았습니다. IP 주소로 직접 요청하면 정상적으로 전달되는 상태였습니다.

등록 여부보다 등록된 주소가 문제였습니다

당시 서비스는 Docker 컨테이너로 배포했습니다. Eureka에 클라이언트가 나타나는 것만 확인했는데 실제 등록된 IP는 Gateway에서 사용하려던 주소와 달랐습니다.

등록 정보 조회 경로(/Eureka/apps로 적어 둔 경로)에 접속해 클라이언트 IP를 확인해 보니 EC2의 탄력적 IP가 아니라 내부 주소가 들어 있었습니다. 로컬에서도 등록해 보니 외부 IP 대신 공유기 내부 주소가 들어갔습니다.

내부 네트워크에서 서로 통신할 수 있다면 내부 주소가 맞을 수도 있습니다. 외부 IP를 꼭 등록할 필요는 없습니다. 다만 Gateway가 접근할 수 있는 주소여야 하고 등록된 포트와 Docker의 포트 연결까지 실제 통신 경로에 맞아야 합니다.

접근 가능한 IP를 직접 지정했습니다

application.yml에 prefer-ip-address와 외부 IP를 지정해 해결했습니다. 아래는 해당 설정 부분만 옮긴 것입니다. 탭 들여쓰기와 ...가 포함되어 있어서 그대로 실행할 YAML 파일은 아닙니다.

설정을 적용할 때는 YAML의 들여쓰기를 공백으로 작성하고 ... 설명 표시는 제거해야 합니다. prefer-ip-address는 호스트명 대신 IP로 주소를 알리는 옵션입니다. 사용할 IP는 ip-address로 지정할 수 있습니다. Spring Cloud Netflix의 IP 주소 사용 문서를 참고했습니다.

YAML
eureka:  
	client:  
		...
	instance:
		...
		prefer-ip-address: true  
		ip-address: "실제 외부 IP 주소"