协议选择

Istio 默认支持代理所有 TCP 流量。包括 HTTP、HTTPS、gRPC 以及原始 TCP 协议。但为了提供额外的能力, 比如路由和丰富的指标,必须确定协议。协议可以被自动检测或者手动声明。

使用非基于 TCP 的协议时,如 UDP,不会被 Istio 代理拦截,可以继续正常工作。 但是不能在仅代理的组件中使用,如 Ingress 或 Egress Gateway。

自动协议选择

Istio 可以自动检测出 HTTP 和 HTTP/2 流量。如果未自动检测出协议,流量将会视为普通 TCP 流量。

Server First 协议,如 MySQL,不兼容自动协议选择。 查看更多 Server First 协议

显式协议选择

协议可以在 Service 定义中手动指定。

可以通过以下两种方式配置:

  • 通过端口名称配置:name: <protocol>[-<suffix>]
  • 在版本 1.18+ 的Kubernetes,通过 appProtocol 字段配置:appProtocol: <protocol>

如果两者都被定义了,则 appProtocol 优先级高于端口名称。

请注意,由于网关可能终止 TLS 而协议可能被协商,因此网关的行为在某些情况下可能会有所不同。

支持以下协议:

协议Sidecar 用途Gateway 用途
httpHTTP/1.1 明文流量HTTP(1.1 或 2)明文流量
http2HTTP/2 明文流量HTTP(1.1 或 2)明文流量
httpsTLS 加密的数据。由于 Sidecar 不解密 TLS 流量,因此这与 tls 相同。TLS 加密的 HTTP(1.1 或 2)流量
tcp不透明的 TCP 数据流不透明的 TCP 数据流
tlsTLS 加密数据TLS 加密数据
grpcgrpc-webhttp2 相同http2 相同
mongomysqlredis实验性应用协议支持。要启用它们,请配置相应的 Pilot 环境变量。如果未启用,则将其视为不透明的 TCP 数据流。实验性应用协议支持。要启用它们,请配置相应的 Pilot 环境变量。如果未启用,则将其视为不透明的 TCP 数据流。

以下示例定义了一个通过 appProtocol 定义 https 端口和通过 name 定义 http 端口的 Service:

  1. kind: Service
  2. metadata:
  3. name: myservice
  4. spec:
  5. ports:
  6. - port: 3306
  7. name: database
  8. appProtocol: mysql
  9. - port: 80
  10. name: http-web

HTTP 网关协议选择

与 Sidecar 不同,网关默认无法自动检测转发请求到后端服务时所使用的具体 HTTP 协议。 因此,除非使用显式协议选择指定 HTTP/1.1(http)或 HTTP/2(http2grpc), 否则网关将使用 HTTP/1.1 转发所有传入的 HTTP 请求。

除了使用显式协议选择外,您还可以通过为服务设置 useClientProtocol 选项来指示网关使用与传入请求相同的协议转发请求。但需要注意,对于不支持 HTTP/2 的服务使用此选项可能存在风险, 因为 HTTPS 网关总是宣传支持 HTTP/1.1 和 HTTP/2。 因此,即使后端服务不支持 HTTP/2,比较新的客户端通常也会认为它支持 HTTP/2,并且选择使用它。