프로토콜 선택

프로토콜 선택 (Protocol Selection)

Istio는 모든 TCP 트래픽을 프록시할 수 있어요. 이 페이지에서는 라우팅과 풍부한 메트릭 같은 추가 기능을 위해 프로토콜을 자동 또는 명시적으로 지정하는 방법을 배워요.

출처: Istio 문서

본문

Istio는 모든 TCP 트래픽을 프록시하는 것을 지원해요. 여기에는 HTTP, HTTPS, gRPC는 물론 원시 TCP 프로토콜도 포함돼요. 라우팅과 풍부한 메트릭 같은 추가 기능을 제공하려면 프로토콜을 결정해야 해요. 이는 자동으로 수행되거나 명시적으로 지정될 수 있어요.

UDP 같은 비-TCP 기반 프로토콜은 프록시되지 않아요. 이런 프로토콜들은 Istio 프록시의 가로챔 없이 정상적으로 계속 작동하지만, ingress나 egress 게이트웨이 같은 프록시 전용 구성 요소에서는 사용할 수 없어요.

자동 프로토콜 선택

Istio는 HTTP와 HTTP/2 트래픽을 자동으로 감지할 수 있어요. 프로토콜을 자동으로 결정할 수 없다면 트래픽은 일반 TCP 트래픽으로 처리돼요.

명시적 프로토콜 선택

프로토콜은 Service 정의에서 수동으로 지정할 수 있어요.

이는 두 가지 방법으로 구성할 수 있어요.

  • 포트 이름으로: name: <protocol>[-<suffix>]
  • Kubernetes 1.18+에서는 appProtocol 필드로: appProtocol: <protocol>

둘 다 정의된 경우 appProtocol이 포트 이름보다 우선해요.

게이트웨이는 TLS를 종료하고 프로토콜을 협상할 수 있기 때문에 게이트웨이에서의 동작은 어떤 경우 다를 수 있다는 점을 기억하세요.

다음 프로토콜이 지원돼요.

Protocol Sidecar Purpose Gateway Purpose
http Plaintext HTTP/1.1 traffic Plaintext HTTP (1.1 or 2) traffic
http2 Plaintext HTTP/2 traffic Plaintext HTTP (1.1 or 2) traffic
https TLS Encrypted data. Because the Sidecar does not decrypt TLS traffic, this is the same as tls TLS Encrypted HTTP (1.1 or 2) traffic
tcp Opaque TCP data stream Opaque TCP data stream
tls TLS Encrypted data TLS Encrypted data
grpc, grpc-web Same as http2 Same as http2
mongo, mysql, redis Experimental application protocol support. To enable them, configure the corresponding environment variables. If not enabled, treated as opaque TCP data stream Experimental application protocol support. To enable them, configure the corresponding environment variables. If not enabled, treated as opaque TCP data stream

아래는 appProtocol으로 https 포트를, 이름으로 http 포트를 정의하는 Service 예시예요.

kind: Service
metadata:
  name: myservice
spec:
  ports:
  - port: 3306
    name: database
    appProtocol: https
  - port: 80
    name: http-web

HTTP 게이트웨이 프로토콜 선택

sidecar와 달리 게이트웨이는 기본적으로 백엔드 서비스로 요청을 전달할 때 사용할 특정 HTTP 프로토콜을 자동으로 감지할 수 없어요. 따라서 명시적 프로토콜 선택으로 HTTP/1.1(http) 또는 HTTP/2(http2 또는 grpc)를 지정하지 않으면, 게이트웨이는 모든 들어오는 HTTP 요청을 HTTP/1.1로 전달해요.

명시적 프로토콜 선택 대신, Service에 useClientProtocol 옵션을 설정해서 게이트웨이가 들어오는 요청과 같은 프로토콜로 요청을 전달하도록 지시할 수 있어요. 단, HTTP/2를 지원하지 않는 서비스에서 이 옵션을 사용하는 것은 위험할 수 있다는 점을 기억하세요. HTTPS 게이트웨이는 항상 HTTP/1.1과 HTTP/2 지원을 광고하기 때문이에요. 그래서 백엔드 서비스가 HTTP/2를 지원하지 않더라도, 현대적인 클라이언트는 그것이 지원한다고 생각해서 종종 그것을 사용하기로 선택해요.

더 알아보기 (Learn more)