Skip to content

HTTPRoute

成功 "V0.5.0+ 版本中的标准通道"。

The `HTTPRoute` resource is Beta and part of the Standard Channel in `v0.5.0+`.

HTTPRoute是一种 gateway API 类型,用于指定从 gateway 监听器到 API 对象(即服务)的 HTTP 请求的路由行为。

Spec

HTTPRoute 的规范包括

  • ParentRefs- 定义此路由要连接到哪些 gateway。
  • Hostnames (可选)- 定义主机名列表,用于匹配 HTTP 请求的 Host 头信息。
  • Rules- 定义对匹配的 HTTP 请求执行操作的规则列表。每个规则由 matchfilters、[match]和[filters]组成。HTTPRouteFilter)(可选)、backendRefs(可选)和 timeouts (可选)字段。

下面展示的 HTTPRoute 会将所有流量发送到一个服务:httproute-basic-example

连接到 gateway

每个路由都包含一种引用父资源的方式,它希望附加到父资源上。 在大多数情况下,这将是 gateway,但这里也有一些灵活性,可以实现对其他类型父资源的支持。

下面的示例显示了路由如何连接到 acme-lb gateway:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: httproute-example
spec:
  parentRefs:
  - name: acme-lb

请注意,目标 gateway 需要允许路由名称空间中的 HTTPRoutes 被附加,附加才能成功。

主机名

主机名定义了与 HTTP 请求的 Host 头匹配的主机名列表。 当出现匹配时,HTTPRoute 将根据规则和过滤器(可选)选择执行请求路由。 主机名是网络主机的完全合格域名,由 RFC 3986 定义。请注意以下与 RFC 中定义的 URI 的 "host "部分的偏差:

  • 不允许使用 IP。
  • 由于不允许使用端口,因此不使用 : 分隔符。

如果未指定主机名,则根据 HTTPRoute 规则和过滤器(可选)对流量进行路由。

下面的示例定义了主机名 "my.example.com":

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: httproute-example
spec:
  hostnames:
  - my.example.com

规则

规则定义了根据条件匹配 HTTP 请求、执行附加处理步骤和将请求转发给 API 对象的语义。

匹配

匹配定义了用于匹配 HTTP 请求的条件。 每个匹配都是独立的,也就是说,如果满足任何一个匹配条件,这条规则就会被匹配。

以下面的匹配配置为例:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
...
spec:
  rules:
  - matches:
    - path:
        value: "/foo"
      headers:
      - name: "version"
        value: "2"
    - path:
        value: "/v2/foo"

请求必须满足以下任一条件,才能与本规则相匹配:

  • 路径前缀为 /foo ** AND** 包含 "版本:2 "标头
  • 路径前缀为 /v2/foo

如果未指定匹配项,默认情况下会使用"/"作为前缀路径匹配,从而匹配所有 HTTP 请求。

过滤器(可选)

过滤器定义了在请求或响应生命周期内必须完成的处理步骤。 过滤器作为一个扩展点,可用于表达 gateway 实现中可能执行的附加处理。 一些例子包括请求或响应修改、实施身份验证策略、速率限制和流量整形。

下面的示例为带有主机标头 "my.filter.com "的 HTTP 请求添加了标头 "my-header: foo"。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-filter-1
spec:
  hostnames:
    - my.filter.com
  rules:
    - filters:
        - type: RequestHeaderModifier
          requestHeaderModifier:
            add:
              - name: my-header
                value: foo
      backendRefs:
        - name: my-filter-svc1
          weight: 1
          port: 80

API 的一致性是根据过滤器类型来定义的。 目前还未说明多种行为排序的效果。 今后可能会根据 alpha 阶段的反馈意见进行修改。

一致性级别由过滤器类型定义:

  • 实现者必须支持所有 "核心 "过滤器。
  • 鼓励实现者支持 "扩展自 "过滤器。
  • "特定于实现的 "过滤器没有跨实现的 API 保证。

多次指定核心过滤器具有未指定或特定实现的一致性。

除了 URLRewrite 和 RequestRedirect 筛选器不能组合使用外,所有筛选器都应相互兼容。 如果实现无法支持其他筛选器组合,则必须明确记录该限制。 如果指定了不兼容或不支持的筛选器,并导致 "已接受 "条件被设置为状态 "False",则实现可使用 "IncompatibleFilters "原因来指定该配置错误。

BackendRefs(可选)

BackendRefs 定义了应将匹配请求发送到何处的 API 对象。 如果未指定,则规则不执行转发。 如果未指定且未指定可导致发送响应的过滤器,则返回 404 错误代码。

下面的示例将前缀为"/bar "的 HTTP 请求转发给端口为 "8080 "的服务 "my-service1",将前缀为"/some/thing"、标头为 "magic: foo "的 HTTP 请求转发给端口为 "8080 "的服务 "my-service2":

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: acme-lb
spec:
  controllerName: acme.io/gateway-controller
  parametersRef:
    name: acme-lb
    group: acme.io
    kind: Parameters
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: acme-lb
  listeners:  # Use GatewayClass defaults for listener definition.
  - name: http
    protocol: HTTP
    port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-app-1
spec:
  parentRefs:
  - name: my-gateway
  hostnames:
  - "foo.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /bar
    backendRefs:
    - name: my-service1
      port: 8080
  - matches:
    - headers:
      - type: Exact
        name: magic
        value: foo
      queryParams:
      - type: Exact
        name: great
        value: example
      path:
        type: PathPrefix
        value: /some/thing
      method: GET
    backendRefs:
    - name: my-service2
      port: 8080

下面的示例使用了 weight 字段,将指向 foo.example.com 的 HTTP 请求的 90% 转发到 "foo-v1 "服务,另外 10% 转发到 "foo-v2 "服务:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: foo-route
  labels:
    gateway: prod-web-gw
spec:
  hostnames:
  - foo.example.com
  rules:
  - backendRefs:
    - name: foo-v1
      port: 8080
      weight: 90
    - name: foo-v2
      port: 8080
      weight: 10

请参考 backendRef API 文档,了解有关 权重和其他字段的更多详情。

超时(可选)

例如 "V1.0.0+ 版本中的实验频道"。

HTTPRoute timeouts are part of the Experimental Channel in `v1.0.0+`.

HTTPRoute 规则包含一个 "超时 "字段。 如果未指定,超时行为将根据具体实现而定。

HTTPRoute 规则中可配置两种超时:

  1. request "是 gateway API 实现向客户端 HTTP 请求发送响应的超时。该超时的目的是尽可能覆盖整个请求-响应事务,尽管实现可以选择在收到整个请求流后开始超时,而不是在客户端启动事务后立即超时。
  2. backendRequest "是从 gateway 向后端发出的单个请求的超时。该超时包括从网关第一次开始发送请求到后端收到完整响应的时间。如果 gateway 重试与后端连接,这一点会特别有用。

由于 request 超时包含了 backendRequest 超时,因此 backendRequest 的值不得大于 request 超时的值。

超时是可选的,其字段的类型为 Duration。 零值超时("0s")必须解释为禁用超时。 有效的非零值超时必须 >= 1ms。

下面的示例使用了 request 字段,如果客户端请求的完成时间超过 10 秒,该字段将导致超时。 该示例还定义了一个 2 秒的 backendRequest 字段,用于指定网关向后端服务 timeout-svc 发出的单个请求的超时时间:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: timeout-example
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /timeout
    timeouts:
      request: 10s
      backendRequest: 2s
    backendRefs:
    - name: timeout-svc
      port: 8080

更多详情请参考 timeouts API 文档。

后端协议

例如 "V1.0.0+ 版本中的实验频道"。

This concept is part of the Experimental Channel in `v1.0.0+`.

某些实现可能要求明确标注 backendRef,以便使用特定协议路由流量。 对于 Kubernetes 服务后端,这可以通过指定 appProtocol 字段来实现。

状态

状态定义 HTTPRoute 的观察状态。

路由状态

RouteStatus 定义了所有路由类型都需要的观察状态。

家长

父资源定义了与 HTTPRoute 相关联的 gateway(或其他父资源)列表,以及 HTTPRoute 相对于每个 gateway 的状态。 当 HTTPRoute 在 parentRefs 中添加对 Gateway 的引用时,管理 Gateway 的控制器应在第一次看到该路由时向该列表添加条目,并在修改路由时适当更新条目。

下面的示例表明 HTTPRoute "http-example "已被名称空间 "gw-example-ns "中的 gateway "gw-example "接受:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-example
...
status:
  parents:
  - parentRefs:
      name: gw-example
      namespace: gw-example-ns
    conditions:
    - type: Accepted
      status: "True"

Merging

单个 gateway 资源可附加多个 HTTPRoutes。 重要的是,每个请求只能匹配一个 Route 规则。 有关冲突解决如何应用于合并的详细信息,请参阅 API 规范