协议选择
Istio 支持代理任何 TCP 流量。这包括 HTTP、HTTPS、gRPC 以及原始 TCP 协议。为了提供其他功能,例如路由和丰富的指标,必须确定协议。这可以通过自动方式完成,也可以明确指定。
非 TCP 协议(例如 UDP)不会被代理。这些协议将继续正常运行,不会被 Istio 代理拦截,但不能用于仅代理的组件,例如入口或出口网关。
自动协议选择
Istio 可以自动检测 HTTP 和 HTTP/2 流量。如果无法自动确定协议,则流量将被视为普通 TCP 流量。
显式协议选择
可以在服务定义中手动指定协议。
这可以通过两种方式配置
- 通过端口名称:
name: <protocol>[-<suffix>]
。 - 在 Kubernetes 1.18+ 中,通过
appProtocol
字段:appProtocol: <protocol>
。
如果同时定义了这两个字段,则 appProtocol
优先于端口名称。
请注意,网关处的行为在某些情况下有所不同,因为网关可以终止 TLS,并且可以协商协议。
支持以下协议
协议 | Sidecar 目的 | 网关目的 |
---|---|---|
http | 纯文本 HTTP/1.1 流量 | 纯文本 HTTP(1.1 或 2)流量 |
http2 | 纯文本 HTTP/2 流量 | 纯文本 HTTP(1.1 或 2)流量 |
https | TLS 加密数据。由于 Sidecar 不会解密 TLS 流量,因此与 tls 相同 | TLS 加密 HTTP(1.1 或 2)流量 |
tcp | 不透明 TCP 数据流 | 不透明 TCP 数据流 |
tls | TLS 加密数据 | TLS 加密数据 |
grpc , grpc-web | 与 http2 相同 | 与 http2 相同 |
mongo , mysql , redis | 实验性应用程序协议支持。若要启用它们,请配置相应的 环境变量。如果未启用,则视为不透明的 TCP 数据流。 | 实验性应用程序协议支持。若要启用它们,请配置相应的 环境变量。如果未启用,则视为不透明的 TCP 数据流。 |
以下是一个服务示例,该服务通过 `appProtocol` 定义一个 `https` 端口,并通过名称定义一个 `http` 端口。
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/1.1 转发所有传入的 HTTP 请求。
除了使用显式协议选择外,还可以通过为服务设置 useClientProtocol
选项,指示网关使用与传入请求相同的协议转发请求。但是请注意,将此选项与不支持 HTTP/2 的服务一起使用可能存在风险,因为 HTTPS 网关始终 宣布 支持 HTTP/1.1 和 HTTP/2。因此,即使后端服务不支持 HTTP/2,现代客户端也会认为它支持 HTTP/2,并且通常会选择使用它。