Kubernetes 클러스터에 소유되지 않은 외부 도메인에 대해 경로 기반 라우팅을 구현하고자 합니다. 라우팅 구성에는 성공했지만, 부작용이 발생했습니다: 클러스터 내부의 워크로드들이 외부 도메인으로 443 포트를 통해 일반 HTTP로 통신하면서 SSL 오류가 발생합니다.
원하는 동작
클러스터 인그레스 게이트웨이에서 www.example.com/graphql로의 요청이 외부 도메인으로 라우팅됩니다.
서비스 메시 내의 워크로드들은 HTTPS를 사용하여 https://graphql-api.mesh-external.example.com 에 성공적으로 질의할 수 있어야 하며, SSL 문제가 없어야 합니다.
현재 접근 방식
우리의 구성은 Istio의 ServiceEntry, DestinationRule, 그리고 Gateway API의 HTTPRoute를 사용하고 있습니다.
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: www-example-com
spec:
hosts:
- graphql-api.mesh-external.example.com
location: MESH_EXTERNAL
ports:
- name: https
number: 443
protocol: HTTPS
resolution: DNS
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: www-example-com
spec:
host: graphql-api.mesh-external.example.com
trafficPolicy:
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE
sni: graphql-api.mesh-external.example.com
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: www-example-com
spec:
hostnames:
- www.example.com
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: ingress
namespace: gateway
rules:
- backendRefs:
- group: networking.istio.io
kind: Hostname
name: graphql-api.mesh-external.example.com
port: 443
weight: 1
matches:
- path:
type: PathPrefix
value: /graphql
문제
인그레스를 통한 외부 요청은 정상적으로 작동하지만, 서비스 메시 내부의 통신은 기본적으로 443 포트에서 일반 HTTP로 시도되어 SSL/TLS 오류가 발생합니다.
질문
내부 메시 워크로드가 외부 도메인과의 통신 시 HTTPS를 올바르게 사용하도록 하면서도, 인그레스 트래픽에 대해 적절한 경로 기반 라우팅을 유지하려면 Istio와 Gateway API를 어떻게 구성해야 하나요?