协议选择

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)流量
httpsTLS 加密数据。由于 Sidecar 不会解密 TLS 流量,因此与 tls 相同TLS 加密 HTTP(1.1 或 2)流量
tcp不透明 TCP 数据流不透明 TCP 数据流
tlsTLS 加密数据TLS 加密数据
grpc, grpc-webhttp2 相同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,并且通常会选择使用它。

这些信息对您有帮助吗?
您有什么改进建议吗?

感谢您的反馈!