서론
사내 쿠버네티스 클러스터에 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 되는 현상이었다.
당연히 이전 글에 설정했던 부분부터 적용을 해보았으나, 적용되지 않았고 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 |
---|