配置 GatewayAPI Route

概述

本文档说明了在 Gateway 就绪后如何配置 Route 资源。Route 绑定到一个或多个网关监听器,并定义匹配的流量如何转发到后端服务。

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

除了创建和更新操作外,本文档还介绍了 ACP Web 控制台提供的额外路由查看功能。

前提条件

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

  1. 阅读配置 GatewayAPI Gateway,了解监听器、绑定规则和 EnvoyProxy
  2. 创建一个 Gateway,供您的 Route 绑定使用
NOTE

本文档先分别介绍每种路由类型,然后提供 YAML 示例,最后在共享参考部分说明通用路由概念。

配置

Route 绑定到 Gateway 上的一个或多个监听器。您可以选择的监听器取决于路由类型、监听器协议以及监听器允许的路由命名空间设置。

通过 Web 控制台配置

  1. 进入 Alauda Container Platform -> Networking -> Gateway -> Routes
  2. 点击 Create Route 按钮
  3. 选择路由类型(HTTPRoute、TCPRoute、UDPRoute、GRPCRoute 或 TLSRoute)

创建 HTTPRoute

字段说明YAML 路径
Publish to Listener发布到监听器.spec.parentRefs
Hostnames主机名.spec.hostnames
Matches匹配规则.spec.rules[].matches
Filters过滤器.spec.rules[].filters
Backend Instance后端.spec.rules[].backendRefs
Options选项.spec.rules[].filters, .spec.rules[].timeouts, .spec.rules[].retry, .spec.rules[].sessionPersistence
选项配置

Options 字段允许您配置高级流量管理设置:

选项说明YAML 路径
Session Affinity会话保持.spec.rules[].sessionPersistence
Timeout超时设置.spec.rules[].timeouts
Retry重试策略.spec.rules[].retry

创建 TCP/UDP Route

字段说明YAML 路径
Publish to Listener发布到监听器.spec.parentRefs
Backend Instance后端.spec.rules[].backendRefs

创建 GRPCRoute

字段说明YAML 路径
Publish to Listener发布到监听器.spec.parentRefs
Hostnames主机名.spec.hostnames
Matchesgrpc 匹配.spec.rules[].matches
Filtersgrpc 过滤器.spec.rules[].filters
Backend Instance后端.spec.rules[].backendRefs

创建 TLSRoute

字段说明YAML 路径
Publish to Listener发布到监听器.spec.parentRefs
Hostnames主机名(可选).spec.hostnames
Backend Instance后端.spec.rules[].backendRefs

通过 YAML 配置

以下最小示例创建了一个 HTTPRoute,绑定到 demo Gatewayhttps 监听器,并将匹配流量转发到后端 Service

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: demo-443
  namespace: demo
spec:
  hostnames:
    - example.com
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      sectionName: https
  rules:
    - matches:
        - path:
            type: Exact
            value: /a
      backendRefs:
        - group: ''
          kind: Service
          name: echo-resty
          namespace: demo-space
          port: 80
          weight: 100

如果您需要更多路由类型和高级 HTTPRoute 选项,请使用以下完整示例:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: demo-443
  namespace: demo
spec:
  hostnames:
    - example.com
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      sectionName: https
  rules:
    - backendRefs:
        - group: ''
          kind: Service
          name: echo-resty
          namespace: demo-space
          port: 80
          weight: 100
      filters: [] 
      matches:
        - path:
            type: Exact
            value: /a
      timeouts:
        request: '30s'
        backendRequest: '10s'
      retry:
        codes:
          - 503
        attempts: 3
        backoff: '100ms'
      sessionPersistence:
        type: Cookie
        sessionName: a
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
  name: tcp
  namespace: demo-space
spec:
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      sectionName: tcp
  rules:
    - backendRefs:
        - group: ''
          kind: Service
          name: echo-resty
          port: 80
          weight: 100
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: UDPRoute
metadata:
  name: udp
  namespace: demo
spec:
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      namespace: demo
      sectionName: udp
  rules:
    - backendRefs:
        - group: ''
          kind: Service
          name: echo-resty
          namespace: demo
          port: 53
          weight: 100
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
  name: grpc
  namespace: demo
spec:
  hostnames:
    - grpc.example.com
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      sectionName: https
  rules:
    - matches:
        - method:
            type: service
            value: myservice
      filters:
        - type: RequestHeaderModifier
          requestHeaderModifier:
            set:
              - name: x-custom-header
                value: custom-value
      backendRefs:
        - group: ''
          kind: Service
          name: grpc-service
          port: 50051
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TLSRoute
metadata:
  name: tls
  namespace: demo
spec:
  hostnames:
    - tls.example.com
  parentRefs:
    - group: gateway.networking.k8s.io
      kind: Gateway
      name: demo
      sectionName: tls
  rules:
    - backendRefs:
        - group: ''
          kind: Service
          name: tls-backend
          port: 443

路由字段参考

每个路由都是由 GatewayAPI 规范定义的 CR。有关每种路由类型的字段和配置选项的详细信息,请参阅官方文档:

发布到监听器

在 Web 控制台中

在 Web 控制台中,您可以选择多个监听器发布路由。可用的监听器候选项基于以下条件过滤:

  • 用户权限:您必须有访问该网关命名空间的权限(项目必须包含该命名空间)。
  • 路由命名空间白名单网关监听器允许的路由命名空间必须包含路由所在的命名空间。
  • 路由类型匹配:路由的类型(HTTPRoute、GRPCRoute 等)必须匹配监听器允许的路由类型。

对于更复杂的跨命名空间场景,请参阅绑定到另一个命名空间创建的网关

在 YAML 中
  • sectionName 是监听器名称。
  • 路由只能绑定到支持其特定类型的监听器
  • 默认情况下,路由只能绑定到与 Gateway 同一命名空间的监听器。

跨命名空间绑定请参阅绑定到另一个命名空间创建的网关

后端

定义匹配请求应转发到的目标服务。

每个服务可以有一个 weight 字段,用于指定流量分配比例。

主机名

hostnames 字段由 HTTPRouteGRPCRouteTLSRoute 支持。TCPRouteUDPRoute 不使用此字段。

hostnames 是字符串数组,遵循主机名交集规则

规则

每个路由可以包含多个规则。每条规则由以下部分组成:

匹配

定义请求被此规则路由的条件。

一条规则可以有多个匹配:

  • 每个匹配包含多个条件(如路径、头部、查询参数、方法)
  • 条件内部使用与(AND)逻辑(全部满足)
  • 匹配之间使用或(OR)逻辑(任一匹配满足即可)

示例:如果匹配1要求 path=/apiheader=v1,匹配2要求 query=test,则请求满足 (path=/api 且 header=v1)(query=test) 之一即被路由。

匹配结构在路由类型间通用,但支持的匹配条件依路由类型不同而异。例如,HTTPRouteGRPCRoute 支持不同的匹配条件集。

过滤器

指定对请求或响应应用的转换或修改。

过滤器概念在路由类型间通用,但支持的过滤器类型依路由类型不同而异。

HTTPRoute 参考

以下匹配条件、过滤器类型和高级选项用于 HTTPRoute

匹配条件类型
对象方法值类型说明值要求
Path
Exact路径(字符串)精确匹配 URL 路径,区分大小写。即对 /abc 的精确匹配只匹配 /abc,不匹配 /abc/、/Abc 或 /abcd。必须以 / 开头,不允许连续 //
PathPrefix路径(字符串)基于 URL 路径前缀匹配,按 / 分割。匹配区分大小写,按路径元素逐个匹配。例如,路径 /abc、/abc/ 和 /abc/def 都匹配前缀 /abc,但 /abcd 不匹配。必须以 / 开头,不允许连续 //
RegularExpression路径(字符串)正则表达式引擎:RE2。例如 /api/v1/.*
Header
Exact名称(头部键)+值精确匹配头部值。
RegularExpression名称(头部键)+值正则表达式引擎:RE2。
QueryParam
Exact名称(参数键)+值精确匹配查询参数值。参数值长度:1-1024 字符
RegularExpression名称(参数键)+值正则表达式引擎:RE2。
Method-方法名称HTTP 方法匹配。GETHEADPOSTPUTDELETECONNECTOPTIONSTRACEPATCH
匹配条件参考
条件类型官方文档
PathHTTPPathMatch
HeadersHTTPHeaderMatch
QueryParamsHTTPQueryParamMatch
MethodHTTPMethod
过滤器类型
类型方法值类型说明值要求
RequestHeaderModifierSet名称(字符串)+值(字符串)用给定名称和值覆盖请求头最多 16 项,值长度:1-4096 字符
Add名称(字符串)+值(字符串)向请求头添加值,追加到现有值最多 16 项,值长度:1-4096 字符
Remove[]string从请求中移除指定头部(不区分大小写)最多 16 项
ResponseHeaderModifierSet名称(字符串)+值(字符串)用给定名称和值覆盖响应头最多 16 项,值长度:1-4096 字符
Add名称(字符串)+值(字符串)向响应头添加值,追加到现有值最多 16 项,值长度:1-4096 字符
Remove[]string从响应中移除指定头部(不区分大小写)最多 16 项
RequestRedirectScheme字符串Location 头的协议(http/https)可选,枚举:http | https
HostnamePreciseHostnameLocation 头的主机名可选
ReplaceFullPath字符串替换整个请求路径可选,最大 1024 字符
ReplacePrefixMatch字符串替换匹配的路径前缀可选,最大 1024 字符,仅适用于 PathPrefix 匹配
PortPortNumberLocation 头的端口可选,范围:1-65535
StatusCode整数HTTP 重定向状态码可选,默认 302,枚举:301 | 302
URLRewriteHostnamePreciseHostname请求中重写的主机名可选
ReplaceFullPath字符串替换整个请求路径可选,最大 1024 字符
ReplacePrefixMatch字符串替换匹配的路径前缀可选,最大 1024 字符,仅适用于 PathPrefix 匹配
CORSAllowOrigins[]string允许的 CORS 请求来源列表可选
AllowMethods[]HTTPMethod允许的 HTTP 方法列表可选,例如 GET、POST、PUT
AllowHeaders[]string允许的 CORS 请求头列表可选
ExposeHeaders[]string响应中暴露给客户端的头部列表可选
MaxAgeDurationCORS 预检响应的缓存时间可选
AllowCredentialsbool是否允许 CORS 请求携带凭据可选

注意

  • RequestRedirectURLRewrite 不能在同一规则中同时使用
  • ReplacePrefixMatch 仅兼容 PathPrefix 类型的 HTTPRouteMatch
  • 头部名称根据 RFC 7230 不区分大小写
  • 同一头部的多个值必须使用 RFC 7230 逗号分隔格式
过滤器参考
过滤器类型官方文档
RequestHeaderModifierHTTPHeaderFilter
ResponseHeaderModifierHTTPHeaderFilter
RequestRedirectHTTPRequestRedirectFilter
URLRewriteHTTPURLRewriteFilter
CORSHTTPCORSFilter
RequestMirrorHTTPRequestMirrorFilter
HTTPExternalAuthFilterHTTPExternalAuthFilter
选项

Options 部分为 HTTPRoute 提供了高级流量管理功能,包括超时、重试和会话保持设置。

超时
字段说明YAML 路径
请求超时网关在接收客户端完整请求后,完成 HTTP 响应的最大时长。选项:默认(使用默认超时,通常为 15 秒)、无限制(设置为 "0s" 表示无超时)、自定义。.spec.rules[].timeouts.request
后端请求超时单次网关到后端调用的最大时长,从网关开始发送请求到接收完整后端响应。选项:默认(使用实现特定默认值)、无限制(设置为 "0s")、自定义。.spec.rules[].timeouts.backendRequest
NOTE
  • 请求超时从接收完整客户端请求后开始计时,涵盖整个事务,可能包含多次后端调用(如重试时)。
  • 指定时,后端请求超时必须小于等于请求超时。
  • 选择“默认”时,字段设为 nil(使用实现默认)。
  • 选择“无限制”时,字段设为 "0s"(最大可能值)。
字段规范
.spec.rules[].timeoutsHTTPRouteTimeouts
重试
字段说明YAML 路径
状态码触发重试的 HTTP 状态码(如 503、502)。值范围:400-599。.spec.rules[].retry.codes
尝试次数重试次数。.spec.rules[].retry.attempts
回退时间重试前等待时间(如 "100ms"、"1s")。.spec.rules[].retry.backoff
NOTE
  • 默认情况下,重试禁用。如果未配置或留空重试字段,网关不会重试失败请求。
  • 必须显式配置重试次数和重试条件,才能启用重试功能。
  • 在 Web 控制台配置重试时,若删除所有重试配置项,字段设为 nil。
字段规范
.spec.rules[].retryHTTPRouteRetry
会话保持

配置会话亲和性,确保来自同一客户端的请求路由到相同后端。

字段说明YAML 路径
类型会话保持类型。选项:Cookie、Header。.spec.rules[].sessionPersistence.type
会话名称用于会话跟踪的 Cookie 或 Header 名称。.spec.rules[].sessionPersistence.sessionName
字段规范
.spec.rules[].sessionPersistenceSessionPersistence

GRPCRoute 匹配和过滤器参考

以下匹配条件和过滤器类型用于 GRPCRoute

GRPCRoute 匹配

GRPCRoute 支持以下匹配类型:

对象方法值类型说明
Method-类型(service/method)+值匹配 gRPC 方法。类型可为 service(匹配服务名)或 method(匹配方法名)。
HeadersExact名称(头部键)+值精确匹配头部值。
RegularExpression名称(头部键)+值正则表达式引擎:RE2。
GRPCRoute 过滤器

GRPCRoute 仅支持 RequestHeaderModifier 过滤器:

类型方法值类型说明值要求
RequestHeaderModifierSet名称(字符串)+值(字符串)用给定名称和值覆盖请求头最多 16 项,值长度:1-4096 字符
Add名称(字符串)+值(字符串)向请求头添加值,追加到现有值最多 16 项,值长度:1-4096 字符
Remove[]string从请求中移除指定头部(不区分大小写)最多 16 项
NOTE

GRPCRoute 不支持超时、重试或会话保持等选项。

TLSRoute 参考

以下行为特定于 TLSRoute

NOTE
  • TLSRoute 的主机名是可选的。如果监听器有主机名但 TLSRoute 没有,则 TLSRoute 自动继承监听器的主机名。
  • TLSRoute 只能绑定到协议为 TLS 且模式为 Passthrough 的监听器。

查看

拓扑

以下功能是 ACP Web 控制台提供的额外查看能力。

拓扑标签页提供路由及其关联资源的可视化表示。它显示所有绑定到路由的策略,以及它们依赖的资源,如 SecurityPolicy 引用的 secret。

此功能目前仅支持 HTTPRoute

下一步

路由绑定到监听器后,如需高级流量或安全策略,请继续配置配置 GatewayAPI Policy。更多操作示例请参阅Envoy Gateway 任务

相关任务