본문 바로가기
Devops/Istio

[Istio] Gateway 접속 시 Spring Boot Swagger Config의 404 Error or 307 Redirect 문제

by dev_ss 2025. 4. 16.

 

 


서론

 

사내 쿠버네티스 클러스터에 Kong Gateway에서 Istio로 전환하고 나서, 별 특이사항이 없이 지내다가 Swagger (OpenAPI) 접속 시 문제가 생긴다는 것을 발견했다.

 

 

[Spring-Boot] Swagger(OpenAPI) - Failed to load remote configuration (Reverse-Proxy)

사내 프로젝트를 진행하면서, 쿠버네티스 환경에서 각각의 Micro-Service에 요청을 하기 위하여 Kong Ingress Controller를 이용하였는데, 그 과정에서 Swagger 접속 시 발생한 에러에 관한 내용이다. 위의

ssnotebook.tistory.com

 

 

이전 글에 작성한 것처럼 404 에러와 함께 Failed to load remote configuration라고 나오거나, 아래 사진처럼 default로 설정된 petstore로 Redirect 되는 현상이었다.

 

[Swagger 접속 화면]

 

 

[Swagger 접속 시 네트워크 상태 - 307 Redirect]

 

 

당연히 이전 글에 설정했던 부분부터 적용을 해보았으나, 적용되지 않았고 Request가 애플리케이션 서비스로 도착하는 과정까지를 단계별로 검토하며 테스트해 보았다.

 

 

중간에 Spring Boot의 application.properties(yml)의 api-docs의 경로 수정도 해보았으나, 마이크로 서비스 전체를 수정해야하는 일이 되어서 다른 방법을 고안하게 되었다.

 


본론

 

이번 원인은 당연히 Kong Gateway에서 Istio로 전환하면서 발생한 문제라고 의심을 하였고, 관련 자료를 찾아보니 X-Forwarded-Prefix와 관련된 Headers 값의 문제였다.

 

 

관련 설정으로는 두 가지 방법이 있었다.

 

 

1. Envoyfilter를 활용한 헤더 값 활용

 

https://istio.io/latest/docs/reference/config/networking/envoy-filter/

 

Envoy Filter

Customizing Envoy configuration generated by Istio.

istio.io

 

 

https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#x-forwarded-for

 

HTTP header manipulation — envoy 1.35.0-dev-c00dce documentation

© Copyright 2016-2025, Envoy Project Authors. Built with Sphinx using a theme provided by Read the Docs.

www.envoyproxy.io

 

HTTPRoute에서 Prefix Rewrite를 이용하게 된다면 "X-Envoy-Original-Path"라는 헤더 값에 Forward 경로가 있고, 이를 활용하는 방법이다.

 

Envoyfilter와 lua script를 이것 저것 손봐줘야 되는 것 같아서 2번 방법으로 진행했다.

 

 

 

 

2. HTTPRoute에 Drop된 Prefix 헤더 추가

 

Spring Boot의 Swagger에서는 x-forwarded-prefix라는 header값으로 prefix path 값을 전달해 줄 수 있다.

 

이를 HTTPRoute를 활용하여 구현하는 방법이다.

 

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: myservice
  namespace: default
spec:
  parentRefs:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: gateway
    namespace: istio-ingress
  rules:
  - backendRefs:
    - group: ""
      kind: Service
      name: service-of-myservice
      port: 8000
      weight: 1
    filters:
    - type: URLRewrite
      urlRewrite:
        path:
          replacePrefixMatch: /
          type: ReplacePrefixMatch
          
 ## 헤더 추가 부분 ##
    - requestHeaderModifier:
        set:
        - name: X-FORWARDED-PREFIX
          value: /app/myservice
      type: RequestHeaderModifier
####################
    matches:
    - path:
        type: PathPrefix
        value: /app/myservice

 

 

Envoy에서 제거한 Prefix의 Header 값을 HTTPRoute에서 다시 붙여준다는 내용이다.

 


결과

 

 

 

수정 후 Swagger도 잘 접속이 되고, Swagger에서 API 요청도 Prefix가 잘 붙은 상태로 요청이 되었다.

 

 

 


 

 

 

반응형

'Devops > Istio' 카테고리의 다른 글

[Istio] mTLS 패킷 검증  (0) 2025.03.25