流量修正与增强

查看本文大纲

在 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 过滤器,例如 RequestRedirectRequestHeaderModifier

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 传输协议,能够减少连接延迟,提高网络的安全性和效率。

配置步骤:

  1. 生成 TLS 证书:首先,使用 OpenSSL 生成网关用于终止客户端 TLS 连接的证书和密钥。
  2. 更新 Gateway 配置:将 Gateway 配置为在端口 443 上监听 HTTPS 请求,并引用上面创建的 example-cert Secret。
  3. 启用 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