配置 GatewayAPI 策略

概述

本文档说明在 GatewayRoute 资源准备好之后,如何配置策略资源。策略通过 .spec.targetRefs 使用策略附加模式,将额外的流量、安全和后端行为附加到支持的资源上。

在推荐的工作流程中,本文档位于配置 GatewayAPI 路由之后。

Envoy Gateway 当前提供四种策略类型:SecurityPolicyBackendTLSPolicyClientTrafficPolicyBackendTrafficPolicy

前提条件

请确保在继续之前已完成以下操作:

  1. 阅读配置 GatewayAPI Gateway配置 GatewayAPI 路由
  2. 创建策略将附加到的目标资源,例如 GatewayRouteService

策略附加基础

策略通过 .spec.targetRefs 附加到其他资源。

默认情况下,策略只能附加到同一命名空间中的资源。

对于 Gateway 目标,支持策略类型时可以使用 sectionName 来定位特定的监听器。对于 Service 目标,sectionName 指的是 Service 端口名称。

策略附加汇总

策略类型目的Web 控制台支持GatewayHTTPRouteGRPCRouteTCPRouteUDPRouteTLSRouteService
SecurityPolicy身份验证、授权、CORS 及其他安全功能API Key Auth, CORS✅ (监听器名称 / ALL)
BackendTLSPolicyEnvoy 与后端服务之间的 TLS 配置支持✅ (端口名称 / ALL)
ClientTrafficPolicy面向客户端的超时和连接行为控制超时设置✅ (监听器名称 / ALL)
BackendTrafficPolicy后端超时和连接行为控制超时设置✅ (监听器名称 / ALL)

sectionName 用于定位 Gateway 上的特定监听器或 Service 上的特定端口。省略或设置为 ALL 时,策略应用于所有监听器或端口。

在 Web 控制台创建策略

所有策略类型均从同一入口创建:

  1. 进入 Alauda Container Platform -> Networking -> Gateway -> Policies
  2. Policy Type 下拉框中选择所需的值
  3. 点击 Create Policy 按钮

以下章节仅关注各策略类型特有的字段。

SecurityPolicy

通过 Web 控制台配置

通用字段(所有策略共享)

字段说明YAML 路径
Policy Type要创建的策略类型.kind
Attach To此策略适用的 Gateway API 资源。支持 Gateway、HTTPRoute 和 GRPCRoute。附加到 Gateway 时,可选择指定监听器名称或选择所有监听器。.spec.targetRefs

SecurityPolicy 特有字段

字段说明YAML 路径
Authorization Type使用的身份验证/授权方式。支持多选:API Key Authentication、CORS 配置.spec.apiKeyAuth, .spec.cors

API Key Authentication

字段说明YAML 路径
Secrets包含用于身份验证的 API Key 的 Kubernetes secret.spec.apiKeyAuth.credentialRefs
Extract From指定从哪里提取 API Key(HTTP 头或查询参数).spec.apiKeyAuth.extractFrom

CORS 配置

字段说明YAML 路径
Allow Origins允许的 CORS 请求来源列表.spec.cors.allowOrigins
Allow Methods允许的 HTTP 方法列表.spec.cors.allowMethods
Allow Headers允许的 CORS 请求头列表.spec.cors.allowHeaders
Expose Headers响应中暴露给客户端的头列表.spec.cors.exposeHeaders
Max AgeCORS 预检响应的缓存时间.spec.cors.maxAge
Allow Credentials是否允许 CORS 请求携带凭据.spec.cors.allowCredentials

通过 YAML 配置

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: SecurityPolicy
metadata:
  name: demo-security-policy
  namespace: demo
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: demo
  apiKeyAuth:
    credentialRefs:
      - group: ""
        kind: Secret
        name: demo
        namespace: demo
    extractFrom:
      - headers:
          - authorization
  cors:
    allowOrigins:
      - "https://example.com"
    allowMethods:
      - GET
      - POST
    allowHeaders:
      - "Content-Type"
    exposeHeaders:
      - "X-Custom-Header"
    maxAge: "1h"
    allowCredentials: true

参考

SecurityPolicy 用于配置 Gateway 和路由的身份验证、授权及其他安全相关功能。它提供声明式方式,在请求到达后端应用之前验证请求,从而保护服务。

            Gateway            Route
               |                 |
               +-- SecurityPolicy-+
Client ---> Envoy Listener --------------------> Backend Service

功能

  • 身份验证:使用多种方式验证客户端身份(API Key、JWT、OIDC、Basic Auth)
  • 授权:基于验证的凭据控制资源访问
  • CORS 配置:管理跨域资源共享策略

工作原理

  1. 创建包含所需身份验证/授权规则的 SecurityPolicy
  2. 将其附加到特定的 Gateway、HTTPRoute 或 GRPCRoute
  3. Envoy Gateway 根据策略验证传入请求
  4. 合法请求转发至后端服务;非法请求返回相应 HTTP 状态码拒绝访问

注意事项

  1. Web 控制台当前支持配置 API Key AuthenticationCORS。其他身份验证方式及高级安全功能需使用 YAML 配置。
  2. 每个路由只能关联一个 SecurityPolicy。
  3. 如果 SecurityPolicy 引用的 secret 无值,则所有请求都会被拒绝,返回 401 Unauthorized
  4. Web 控制台中,默认 Extract From 字段为 headerHeader Name 字段为 authorization
  5. 可在 Web 控制台的路由拓扑标签页查看附加到路由的策略。

官方文档

BackendTLSPolicy

通过 Web 控制台配置

通用字段

字段说明YAML 路径
Policy Type要创建的策略类型.kind
Attach To此策略适用的 Service。必须指定 Service 名称和端口名称(sectionName)。.spec.targetRefs

BackendTLSPolicy 特有字段

字段说明YAML 路径
Hostname必填。Envoy 连接后端服务时使用的 SNI(服务器名称指示).spec.validation.hostname
Subject Alternative Names可选。用于后端 HTTPS 响应验证。未指定时,默认使用 hostname 值。.spec.validation.subjectAltNames
Validation Type验证后端 TLS 证书的方法。选项:CACertificateRefs(使用自定义 CA 证书)、WellKnownCACertificates(使用系统 CA 证书).spec.validation

CACertificateRefs 配置

字段说明YAML 路径
CA Certificate Secret包含 CA 证书的 Kubernetes secret。该 secret 必须包含 ca.crt 键,内容为 PEM 编码的 TLS 证书。.spec.validation.cACertificateRefs
NOTE

创建或选择 CA 证书 secret 时:

  • secret 类型必须适合 CA 证书
  • 键必须为 ca.crt
  • 可导入证书文件,文件必须以 -----BEGIN CERTIFICATE----- 开头,以 -----END CERTIFICATE----- 结尾
  • 导入格式无效的证书时,会显示错误信息 “must contain PEM-encoded TLS certificates”
  • 选择无 ca.crt 键的现有 secret 时,会显示错误信息 “must have ca.crt key”

通过 YAML 配置

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: BackendTLSPolicy
metadata:
  name: demo-backend-tls-policy
  namespace: demo
spec:
  targetRefs:
    - group: ""
      kind: Service
      name: demo-backend
      namespace: demo
      sectionName: https-port
  validation:
    hostname: backend.example.com
    subjectAltNames:
      - backend.example.com
    cACertificateRefs:
      - group: ""
        kind: Secret
        name: backend-ca
        namespace: demo

参考

BackendTLSPolicy 控制 Envoy Gateway 与后端服务之间的 TLS 配置。允许您配置:

                                Service
                                  |
                                  +-- BackendTLSPolicy
Client ---> Envoy Listener --------------------> Backend Service Port
                                  应用在此 ^
  • SNI(服务器名称指示):建立 TLS 连接时使用的主机名
  • 证书验证:如何验证后端服务器证书
  • CA 证书:用于验证后端证书的自定义 CA 证书

功能

  • 配置与后端服务连接的 TLS 设置
  • 支持自定义 CA 证书或系统知名 CA 证书
  • 配置 SNI 以完成正确的 TLS 握手

注意事项

  1. targetRefs 中的 sectionName 对应 Service 的端口名称。
  2. 使用 WellKnownCACertificates 时,使用系统默认 CA 证书进行验证。
  3. hostname 为必填项,作为 Envoy 连接后端时的 SNI 值。

官方文档

ClientTrafficPolicy

通过 Web 控制台配置

通用字段

字段说明YAML 路径
Policy Type要创建的策略类型.kind
Attach To此策略适用的 Gateway。可选择指定监听器名称或选择所有监听器。.spec.targetRefs

超时配置(选项)

字段说明YAML 路径
TCP Idle TimeoutTCP 连接的空闲超时时间。空闲定义为上下游连接均无数据发送或接收的时间段。默认值:1 小时。.spec.settings.timeout.tcp.idleTimeout
HTTP Request Received TimeoutEnvoy 等待完整请求接收的时间。计时从请求开始,到请求最后一个字节发送到上游或响应开始时停止。默认值:1 小时。.spec.settings.timeout.http.requestReceivedTimeout
HTTP Idle TimeoutHTTP 连接的空闲超时时间。空闲定义为连接中无活动请求的时间段。默认值:无限制。.spec.settings.timeout.http.idleTimeout
HTTP Stream Idle Timeout流空闲超时时间,定义流在无上下游活动时可存在的最长时间。默认值:5 分钟。.spec.settings.timeout.http.streamIdleTimeout

通过 YAML 配置

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: ClientTrafficPolicy
metadata:
  name: demo-client-traffic-policy
  namespace: demo
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      sectionName: https
  settings:
    timeout:
      tcp:
        idleTimeout: "30m"
      http:
        requestReceivedTimeout: "60s"
        idleTimeout: "5m"
        streamIdleTimeout: "30s"

参考

ClientTrafficPolicy 控制客户端到 Envoy Gateway 的连接行为。提供细粒度控制:

            Gateway
               |
               +-- ClientTrafficPolicy
Client ---> Envoy Listener --------------------> Backend Service
          应用在客户端侧 ^
  • TCP 设置:连接级别的超时和保持活动设置
  • HTTP 设置:请求/响应超时及 HTTP 协议行为

功能

  • 配置 TCP 连接空闲超时
  • 控制 HTTP 请求接收超时
  • 设置 HTTP 连接空闲超时
  • 配置 HTTP 流空闲超时

注意事项

  1. 超时值以持续时间字符串表示(如 "30s"、"5m"、"1h")。

官方文档

BackendTrafficPolicy

通过 Web 控制台配置

通用字段

字段说明YAML 路径
Policy Type要创建的策略类型.kind
Attach To此策略适用的 Gateway API 资源。支持 Gateway、HTTPRoute、GRPCRoute、TCPRoute、UDPRoute 和 TLSRoute。附加到 Gateway 时,可选择指定监听器名称或选择 ALL。YAML 中通过 .spec.targetRefssectionName 配置。.spec.targetRefs

超时配置(选项)

字段说明YAML 路径
TCP Connection Timeout网络连接建立超时,包括 TCP 和 TLS 握手。默认值:10 秒。.spec.settings.timeout.tcp.connectionTimeout
HTTP Connection Idle TimeoutHTTP 连接空闲超时。空闲定义为连接中无活动请求的时间段。默认值:1 小时。.spec.settings.timeout.http.connectionIdleTimeout
HTTP Max Connection DurationHTTP 连接的最大持续时间。默认值:无限制。.spec.settings.timeout.http.maxConnectionDuration
HTTP Request Timeout从上游接收完整响应的超时时间。默认值:15 秒。支持设置为无限制。.spec.settings.timeout.http.requestTimeout

通过 YAML 配置

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy
metadata:
  name: demo-backend-traffic-policy
  namespace: demo
spec:
  targetRefs:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute
      name: demo
  settings:
    timeout:
      tcp:
        connectionTimeout: "5s"
      http:
        connectionIdleTimeout: "30m"
        maxConnectionDuration: "1h"
        requestTimeout: "30s"

参考

BackendTrafficPolicy 控制 Envoy Gateway 到后端服务的连接行为。提供细粒度控制:

            Gateway / Route
                  |
                  +-- BackendTrafficPolicy
Client ---> Envoy Listener --------------------> Backend Service
                                  应用在此 ^
  • TCP 设置:连接建立超时
  • HTTP 设置:连接持续时间、空闲超时和请求超时

功能

  • 配置 TCP 连接建立超时
  • 控制 HTTP 连接空闲超时
  • 设置最大 HTTP 连接持续时间
  • 配置 HTTP 请求超时

注意事项

  1. 超时值以持续时间字符串表示(如 "30s"、"5m"、"1h")。
  2. requestTimeout 字段支持设置为 "unlimited" 以禁用超时。

官方文档

相关任务

策略附加完成后,请继续参考Envoy Gateway 任务获取更多操作示例和高级配置任务。