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