配置 GatewayAPI Route

概述

本文介绍如何在 Gateway 就绪后配置 Route 资源。Route 会附加到一个或多个网关侦听器,并定义如何将匹配的流量转发到后端服务。

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

除了创建和更新操作外,本文还介绍 ACP Web Console 提供的其他 Route 查看功能。

前提条件

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

  1. 阅读配置 GatewayAPI Gateway以了解侦听器、附加规则和 EnvoyProxy
  2. 创建一个 Gateway,以供 Route 附加到该对象
NOTE

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

配置

Route 会附加到 Gateway 上的一个或多个侦听器。可选择的侦听器取决于 Route 类型、侦听器协议以及侦听器允许的 Route 命名空间设置。

Route 也可以附加到外部 ListenerSet 侦听器。请参阅配置 Gateway API ListenerSet。

通过 Web Console 配置

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

创建 HTTPRoute

字段描述YAML 路径
发布到侦听器发布到侦听器.spec.parentRefs
HostnamesHostnames.spec.hostnames
MatchesMatches.spec.rules[].matches
FiltersFilters.spec.rules[].filters
后端实例后端.spec.rules[].backendRefs
OptionsOptions.spec.rules[].filters, .spec.rules[].timeouts, .spec.rules[].retry, .spec.rules[].sessionPersistence
Options 配置

Options 字段用于配置高级流量管理设置:

选项描述YAML 路径
会话亲和性会话持久性.spec.rules[].sessionPersistence
超时超时设置.spec.rules[].timeouts
重试重试策略.spec.rules[].retry

创建 TCP/UDP Route

字段描述YAML 路径
发布到侦听器发布到侦听器.spec.parentRefs
后端实例后端.spec.rules[].backendRefs

创建 GRPCRoute

字段描述YAML 路径
发布到侦听器发布到侦听器.spec.parentRefs
HostnamesHostnames.spec.hostnames
MatchesgRPC Matches.spec.rules[].matches
FiltersgRPC Filters.spec.rules[].filters
后端实例后端.spec.rules[].backendRefs

创建 TLSRoute

字段描述YAML 路径
发布到侦听器发布到侦听器.spec.parentRefs
HostnamesHostnames(可选).spec.hostnames
后端实例后端.spec.rules[].backendRefs

通过 YAML 配置

以下最小示例创建一个 HTTPRoute,将其附加到 demo Gateway 的 https 侦听器,并将匹配的流量转发到后端 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

如果需要更多 Route 类型和高级 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

Route 字段参考

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

发布到侦听器

在 Web Console 中

在 Web Console 中,可以选择多个侦听器来发布 Route。可用的侦听器候选项会根据以下条件进行筛选:

  • 用户权限:您必须有权访问网关的命名空间(项目必须包含此命名空间)。
  • Route 命名空间允许列表:网关侦听器允许的 Route 命名空间必须包含 Route 的命名空间。
  • Route 类型匹配:Route 的类型(HTTPRoute、GRPCRoute 等)必须与侦听器允许的 Route 类型匹配。

对于更复杂的跨命名空间场景,请参阅附加到在其他命名空间中创建的网关。

附加到 ListenerSet

Web Console 还会列出已接受的 ListenerSet 侦听器。发布 Route 时,选择 ListenerSet 和侦听器名称。ListenerSet 命名空间、父 Gateway 许可、侦听器协议以及侦听器 allowedRoutes 必须允许此次附加。

在 YAML 中
  • sectionName 是侦听器名称。
  • Route 只能附加到支持其特定类型的侦听器。
  • 默认情况下,Route 只能附加到 Gateway 与其位于同一命名空间的侦听器。

对于跨命名空间附加,请参阅附加到在其他命名空间中创建的网关。

要在 YAML 中附加到 ListenerSet,请将 parentRefs[].kind 设置为 ListenerSet,将 name 和 namespace 设置为 ListenerSet,并将 sectionName 设置为侦听器名称:

parentRefs:
  - group: gateway.networking.k8s.io
    kind: ListenerSet
    namespace: app-demo
    name: app-listeners
    sectionName: app-http

有关更多信息,请参阅配置 GatewayAPI ListenerSet。

后端

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

每个服务都可以包含 weight 字段,用于指定应路由到该服务的流量比例。

Hostnames

hostnames 字段受 HTTPRoute、GRPCRoute 和 TLSRoute 支持。TCPRoute 和 UDPRoute 不使用此字段。

hostnames 是字符串数组,遵循Hostname 交集规则。

Rules

每个 Route 可以包含多个规则。每条规则由以下组件组成:

Matches

定义请求必须满足的条件,满足这些条件后请求才会由此规则进行路由。

一条规则可以包含多个 Match:

  • 每个 Match 由多个条件组成(例如路径、标头、查询参数和方法)
  • 单个 Match 内部的条件使用 AND 逻辑(必须全部满足)
  • 各个 Match 之间使用 OR 逻辑(满足任意一个 Match 即可)

示例:如果 Match-1 要求 path=/api AND header=v1,而 Match-2 要求 query=test,则当请求匹配 (path=/api AND header=v1) OR (query=test) 中的任意一个时,该请求就会被路由。

不同 Route 类型使用通用的 Match 结构,但支持的 Match 条件取决于 Route 类型。例如,HTTPRoute 和 GRPCRoute 支持不同的 Match 条件集合。

Filters

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

不同 Route 类型使用通用的 Filter 概念,但支持的 Filter 类型取决于 Route 类型。

HTTPRoute 参考

以下 Match 条件、Filter 类型和高级选项用于 HTTPRoute。

Match 条件类型
对象方法值类型描述值要求
路径
Exact路径(字符串)精确匹配 URL 路径,且区分大小写。这意味着对 /abc 的精确路径匹配只会匹配指向 /abc 的请求,不会匹配 /abc/、/Abc 或 /abcd。必须以 / 开头,不能包含连续的 //。
PathPrefix路径(字符串)根据以 / 分隔的 URL 路径前缀进行匹配。匹配区分大小写,并且逐个路径元素进行。例如,路径 /abc、/abc/ 和 /abc/def 都会匹配前缀 /abc,但路径 /abcd 不会匹配。必须以 / 开头,不能包含连续的 //。
RegularExpression路径(字符串)正则表达式引擎:RE2。例如,/api/v1/.*。
标头
Exact名称(标头键)+ 值精确匹配标头值。
RegularExpression名称(标头键)+ 值正则表达式引擎:RE2。
查询参数
Exact名称(参数键)+ 值精确匹配查询参数值。参数值:1-1024 个字符
RegularExpression名称(参数键)+ 值正则表达式引擎:RE2。
方法-方法名称HTTP 方法匹配。GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH
匹配条件参考
条件类型官方文档
路径HTTPPathMatch
标头HTTPHeaderMatch
查询参数HTTPQueryParamMatch
方法HTTPMethod
过滤器类型
类型方法值类型描述值要求
RequestHeaderModifierSet名称(字符串)+ 值(字符串)使用给定的名称和值覆盖请求标头最多 16 项,值:1-4096 个字符
Add名称(字符串)+ 值(字符串)将标头添加到请求,并追加到现有值最多 16 项,值:1-4096 个字符
Remove[]string从请求中移除指定的标头(不区分大小写)最多 16 项
ResponseHeaderModifierSet名称(字符串)+ 值(字符串)使用给定的名称和值覆盖响应标头最多 16 项,值:1-4096 个字符
Add名称(字符串)+ 值(字符串)将标头添加到响应,并追加到现有值最多 16 项,值:1-4096 个字符
Remove[]string从响应中移除指定的标头(不区分大小写)最多 16 项
RequestRedirectSchemestringLocation 标头的协议(http/https)可选,枚举值:http|https
HostnamePreciseHostnameLocation 标头的主机名可选
ReplaceFullPathstring替换整个请求路径可选,最多 1024 个字符
ReplacePrefixMatchstring替换匹配的路径前缀可选,最多 1024 个字符,仅适用于 PathPrefix 匹配
PortPortNumberLocation 标头的端口可选,范围:1-65535
StatusCodeintHTTP 重定向状态码可选,默认值:302,枚举值:301|302
URLRewriteHostnamePreciseHostname要在请求中重写的主机名可选
ReplaceFullPathstring替换整个请求路径可选,最多 1024 个字符
ReplacePrefixMatchstring替换匹配的路径前缀可选,最多 1024 个字符,仅适用于 PathPrefix 匹配
CORSAllowOrigins[]stringCORS 请求允许的源列表可选
AllowMethods[]HTTPMethod允许的 HTTP 方法列表可选,例如 GET、POST、PUT
AllowHeaders[]stringCORS 请求中允许的标头列表可选
ExposeHeaders[]string响应中向客户端公开的标头列表可选
MaxAgeDurationCORS 预检响应的缓存时长可选
AllowCredentialsbool是否允许 CORS 请求携带凭据可选

注意:

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

选项部分为 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-type(服务/方法)+ value匹配 gRPC 方法。类型可以是 service(匹配服务名称)或 method(匹配方法名称)。
HeadersExactname(header 键)+ value精确匹配 header 值。
RegularExpressionname(header 键)+ value正则表达式引擎:RE2。
GRPCRoute 过滤器

GRPCRoute 仅支持 RequestHeaderModifier 过滤器:

类型方法值类型描述值要求
RequestHeaderModifierSetname(字符串)+ value(字符串)使用给定名称和值覆盖请求 header最多 16 项,值:1-4096 个字符
Addname(字符串)+ value(字符串)将 header 添加到请求,追加到现有值最多 16 项,值:1-4096 个字符
Remove[]string从请求中移除指定的 header(不区分大小写)最多 16 项
NOTE

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

TLSRoute 参考

以下行为特定于 TLSRoute。

NOTE
  • TLSRoute 主机名是可选的。如果监听器具有主机名,但 TLSRoute 没有,则 TLSRoute 会自动继承监听器的主机名。
  • TLSRoute 只能附加到 Passthrough 模式下使用 TLS 协议的监听器。

视图

拓扑

以下功能是 ACP Web Console 提供的其他查看功能。

拓扑选项卡以可视化方式呈现路由及其关联资源。它会显示附加到路由的所有策略,以及其依赖资源,例如 SecurityPolicy 引用的 secret。

此功能目前仅适用于 HTTPRoute。

下一步

将路由附加到监听器后,如果需要高级流量或安全策略,请继续配置 GatewayAPI 策略。如需了解更多操作示例,请参阅Envoy Gateway 任务。

相关任务

商标声明

Envoy® 是 Linux Foundation 的注册商标。

Alauda 是独立供应商。本产品与 Linux Foundation 无关,也未获得其认可或赞助。所有商标均为其各自所有者的财产,此处仅用于标识目的。