在 Envoy Gateway 中,流量修正与增强功能为用户提供了多种方式来灵活地管理和优化请求的处理。这些功能包括 HTTP 重定向、URL 重写、请求头和响应头管理,以及对最新 HTTP/3 协议的支持。通过这些功能,用户可以轻松配置和控制流量的流向和处理方式,从而提高应用程序的安全性、性能和灵活性。本文将详细介绍如何在 Envoy Gateway 中实现这些流量修正与增强的配置。
HTTP 重定向
在 Envoy Gateway 中,HTTPRoute
资源可以配置重定向规则,将客户端请求重定向到另一个资源。重定向通常用于将 HTTP 请求转换为 HTTPS 请求,或者将路径重定向到新的位置。
配置示例:HTTP 到 HTTPS 重定向
-
HTTP 到 HTTPS 重定向:使用
RequestRedirect
过滤器,将 HTTP 请求永久(301 状态码)重定向到 HTTPS。apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-to-https-filter-redirect spec: parentRefs: - name: eg hostnames: - redirect.example rules: - filters: - type: RequestRedirect requestRedirect: scheme: https statusCode: 301 hostname: www.example.com
-
路径重定向:使用
RequestRedirect
过滤器,将匹配的路径前缀重定向到新的路径。例如,将/get
请求重定向到/status/200
。apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: http-filter-path-redirect spec: parentRefs: - name: eg hostnames: - path.redirect.example rules: - matches: - path: type: PathPrefix value: /get filters: - type: RequestRedirect requestRedirect: path: type: ReplaceFullPath replaceFullPath: /status/200 statusCode: 302
HTTP URL 重写
URL 重写允许你在请求到达后端服务前修改 URL 路径,以实现 URL 重构或隐藏内部路径结构。在 HTTPRoute
对象中配置 RequestURLRewrite
可以实现这一功能。
配置示例:
定义一个 HTTPRoute
资源,将所有发送到 path.rewrite.example
的 /get
请求路由到名为 backend
的服务的 3000 端口,并将请求路径中的前缀 /get
替换为 /replace
。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-url-rewrite
spec:
parentRefs:
- name: eg
hostnames:
- path.rewrite.example
rules:
- matches:
- path:
value: "/get"
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /replace
backendRefs:
- name: backend
port: 3000
HTTP 请求头与响应头管理
请求头和响应头的管理允许你对传入请求或返回响应的头信息进行操作。这种配置通常用于自定义路由逻辑或增强安全性。
HTTPRoute 资源可以在将请求发送到上游服务之前修改请求头。目前,Envoy Gateway 支持 core HTTPRoute 过滤器,例如 RequestRedirect
和 RequestHeaderModifier
。
RequestHeaderModifier
过滤器 在将请求转发到上游之前修改请求头,而 ResponseHeaderModifier
过滤器 在将响应返回给客户端之前修改响应头。
配置示例:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: header-modification-route
spec:
parentRefs:
- name: example-gateway
rules:
- matches:
- path:
type: Prefix
value: "/"
backendRefs:
- name: backend
port: 80
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
set:
x-custom-header: "custom-value"
add:
x-another-header: "additional-value"
remove:
- x-remove-header
- type: ResponseHeaderModifier
responseHeaderModifier:
set:
x-custom-header: "response-value"
add:
x-another-header: "response-additional-value"
remove:
- x-remove-header
HTTP3 支持
Envoy Gateway 支持通过启用 HTTP3 来优化 Web 性能。HTTP3 是 HTTP 协议的最新版本,基于 QUIC 传输协议,能够减少连接延迟,提高网络的安全性和效率。
配置步骤:
- 生成 TLS 证书:首先,使用 OpenSSL 生成网关用于终止客户端 TLS 连接的证书和密钥。
- 更新 Gateway 配置:将 Gateway 配置为在端口 443 上监听 HTTPS 请求,并引用上面创建的
example-cert
Secret。 - 启用 HTTP3:通过创建并应用
ClientTrafficPolicy
资源来启用 HTTP3。
配置示例:
定义一个 ClientTrafficPolicy
资源,为名为 eg
的 Gateway 启用 HTTP/3 支持。
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: ClientTrafficPolicy
metadata:
name: enable-http3
spec:
http3: {}
targetRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: eg