istio.io/content/zh/docs/ops/configuration/traffic-management/protocol-selection/index.md

6.6 KiB
Raw Blame History

title description weight keywords aliases owner test
协议选择 关于如何声明协议。 10
protocol
protocol sniffing
protocol selection
protocol detection
/zh/help/ops/traffic-management/protocol-selection
/zh/help/ops/protocol-selection
/zh/help/tasks/traffic-management/protocol-selection
/zh/docs/ops/traffic-management/protocol-selection
/zh/docs/ops/deployment/requirements
istio/wg-networking-maintainers no

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

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

自动协议选择

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

{{< tip >}} Server First 协议,如 MySQL不兼容自动协议选择。 查看更多 Server First 协议 {{< /tip >}}

显式协议选择

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

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

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

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

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

支持以下协议:

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

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

{{< text yaml >}} kind: Service metadata: name: myservice spec: ports:

  • port: 3306 name: database appProtocol: mysql
  • port: 80 name: http-web {{< /text >}}

HTTP 网关协议选择

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

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