Istio 는 REST 와 gRPC 를 둘 다 프록시할 수 있나

작성

  • Istio
  • gRPC
  • 쿠버네티스
  • 서비스 메시

Istio 는 REST(HTTP)와 gRPC 를 둘 다 프록시할 수 있습니다. 공식 문서는 Istio 가 HTTP, HTTPS, gRPC, 순수 TCP 를 포함한 모든 TCP 트래픽을 프록시한다고 설명합니다. 다만 라우팅이나 풍부한 지표 같은 기능을 쓰려면 프로토콜을 알아야 하고, 이것을 자동으로 알아내게 둘지 직접 적어 줄지가 이 글의 주제입니다. 아래 내용은 Istio 공식 문서 Protocol Selection(2026-10-20 확인, 문서 표기 버전 1.31.2)을 정리한 것입니다.

Istio 가 프로토콜을 정하는 순서Service 포트 정의 → appProtocol 이 있나?; appProtocol 이 있나? → appProtocol 을 따른다 (예); appProtocol 이 있나? → 포트 이름이 protocol-suffix 형식인가? (아니오); 포트 이름이 protocol-suffix 형식인가? → 이름의 protocol 을 따른다 (예); 포트 이름이 protocol-suffix 형식인가? → 사이드카가 HTTP·HTTP/2 자동 감지, 실패하면 TCP (아니오)예아니오예아니오Service 포트 정의appProtocol 이 있나?appProtocol 을따른다포트 이름이protocol-suffix형식인가?이름의 protocol 을따른다사이드카가HTTP·HTTP/2 자동감지, 실패하면 TCP
Istio 가 프로토콜을 정하는 순서 — 명시 지정이 있으면 자동 감지보다 우선한다

프로토콜은 어떻게 알려 주나요?

방법은 두 가지입니다. 하나는 Service 의 포트 이름을 <protocol>[-<suffix>] 형식으로 짓는 것이고, 다른 하나는 Kubernetes 1.18 이상에서 appProtocol 필드를 쓰는 것입니다. 둘 다 적혀 있으면 appProtocol 이 포트 이름보다 우선합니다.

apiVersion: v1
kind: Service
metadata:
  name: orders
spec:
  ports:
    - name: http-web        # 이름으로 지정: REST
      port: 80
    - name: grpc-api        # 이름으로 지정: gRPC
      port: 9090
    - name: backend         # appProtocol 로 지정
      port: 8081
      appProtocol: grpc

공식 문서의 지원 표에서 grpc 와 grpc-web 은 사이드카와 게이트웨이 모두 http2 와 같게 다룹니다. 그래서 gRPC 포트에 grpc 를 적든 http2 를 적든 같은 HTTP/2 로 처리됩니다.

자동 감지에 맡겨도 되나요?

사이드카는 HTTP 와 HTTP/2 를 자동으로 감지합니다. 감지하지 못하면 그 트래픽은 순수 TCP 로 취급합니다. 그러면 TCP 로 보이는 연결에서는 HTTP 단위의 라우팅과 지표를 쓰지 못합니다. 또 MySQL 처럼 서버가 먼저 말을 거는(Server First) 프로토콜은 자동 감지와 맞지 않으니 이름으로 직접 지정해야 합니다. 그래서 운영하는 서비스는 포트 이름을 처음부터 규칙대로 짓는 편이 안전합니다.

게이트웨이는 왜 따로 봐야 하나요?

사이드카와 달리 게이트웨이는 기본값으로 백엔드에 보낼 HTTP 종류를 자동으로 알아내지 못합니다. 명시 지정이 없으면 들어온 HTTP 요청을 모두 HTTP/1.1 로 넘깁니다. 따라서 백엔드가 gRPC 라면 grpc 나 http2 로 지정해야 HTTP/2 로 전달됩니다.

게이트웨이 뒤의 gRPC 서비스지정하지 않으면: 게이트웨이가 HTTP/1.1 로 전달, gRPC 백엔드와 맞지 않을 수 있음 → grpc 또는 http2 로 지정: HTTP/2 로 전달, gRPC 요청이 그대로 도착지정하지 않으면게이트웨이가HTTP/1.1 로 전달gRPC 백엔드와 맞지않을 수 있음grpc 또는 http2 로지정HTTP/2 로 전달gRPC 요청이 그대로도착
게이트웨이 뒤의 gRPC 서비스

명시 지정 대신 Service 에 useClientProtocol 옵션을 줄 수도 있습니다. 들어온 요청과 같은 프로토콜로 전달하게 하는 옵션입니다. 다만 공식 문서는 HTTP/2 를 지원하지 않는 서비스에 쓰면 위험할 수 있다고 경고합니다. HTTPS 게이트웨이는 늘 HTTP/1.1 과 HTTP/2 지원을 알리기 때문에, 백엔드가 HTTP/2 를 못 해도 최신 클라이언트가 HTTP/2 를 고를 수 있기 때문입니다.

쿠버네티스 기본 Service 와 무엇이 다른가요?

쿠버네티스 기본 Service 는 L4(연결) 단위로 부하를 나눕니다. gRPC 는 연결 하나를 오래 열어 두고 그 위에 요청을 여러 개 보내므로, 연결이 한 파드에 붙으면 요청도 그쪽으로 몰립니다. 반면 Istio 의 프록시(Envoy)는 gRPC 가 HTTP/2 임을 알고 요청 단위로 분산할 수 있습니다. 이 점이 gRPC 서비스에 메시를 붙이는 대표적인 이유입니다. 이 부분은 위 문서 페이지가 아니라 L4 와 L7 분산의 일반적인 차이를 설명한 것이니, 실제 분산 결과는 환경에서 직접 확인하세요.

자주 묻는 질문

UDP 도 프록시되나요?

아닙니다. 문서에 따르면 UDP 같은 비 TCP 프로토콜은 프록시되지 않고 평소처럼 동작하며, Istio 프록시의 가로채기를 받지 않습니다. 따라서 인그레스나 이그레스 게이트웨이 같은 프록시 전용 구성 요소에서도 쓸 수 없습니다.

포트 이름과 appProtocol 을 둘 다 적으면 어느 쪽이 이기나요?

appProtocol 입니다. 포트 이름은 둘 다 정의된 경우에 뒤로 밀립니다.

gRPC 포트 이름은 grpc 와 http2 중 무엇이 낫나요?

동작은 같습니다. 공식 표에서 grpc 는 http2 와 같게 취급되므로, 읽는 사람이 gRPC 임을 바로 알 수 있는 grpc 를 쓰면 됩니다.

사이트를 만들어볼까요?

무료 상담 받기