跳至内容

HTTP 路由

HTTPRoute 资源 允许您匹配 HTTP 流量并将其定向到 Kubernetes 后端。本指南展示了 HTTPRoute 如何在主机、标头和路径字段上匹配流量,并将其转发到不同的 Kubernetes 服务。

以下图表描述了跨三个不同服务的所需流量流

  • foo.example.com/login 的流量被转发到 foo-svc
  • bar.example.com/* 的流量,带有 env: canary 标头,被转发到 bar-svc-canary
  • bar.example.com/* 的流量,没有标头,被转发到 bar-svc

HTTP Routing

虚线显示了为配置此路由行为而部署的网关资源。有两个 HTTPRoute 资源在同一个 prod-web 网关上创建路由规则。这说明了多个路由如何绑定到一个网关,以及路由如何在一个网关上合并,只要它们不冲突。有关路由合并的更多信息,请参阅 HTTPRoute 文档.

为了从一个 网关 接收流量,一个 HTTPRoute 资源必须使用 ParentRefs 配置,这些 ParentRefs 引用它应该附加到的父网关。以下示例显示了如何组合 GatewayHTTPRoute 来配置服务 HTTP 流量

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-gateway-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: example-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "example.com"
  rules:
  - backendRefs:
    - name: example-svc
      port: 80

HTTPRoute 可以针对一个 主机名集合 进行匹配。在 HTTPRoute 中进行任何其他匹配之前,都会匹配这些主机名。由于 foo.example.combar.example.com 是具有不同路由要求的独立主机,因此每个主机都作为自己的 HTTPRoute 部署 - foo-routebar-route

以下 foo-route 将匹配 foo.example.com 的任何流量,并应用其路由规则将流量转发到正确的后端。由于只指定了一个匹配项,因此只有 foo.example.com/login/* 流量将被转发。对任何其他不以 /login 开头的路径的流量将不会被此路由匹配。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: foo-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "foo.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /login
    backendRefs:
    - name: foo-svc
      port: 8080

类似地,bar-route HTTPRoute 匹配 bar.example.com 的流量。此主机名的所有流量都将根据路由规则进行评估。最具体的匹配将优先,这意味着任何带有 env: canary 标头的流量将被转发到 bar-svc-canary,如果标头缺失或不是 canary,则将被转发到 bar-svc

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: bar-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "bar.example.com"
  rules:
  - matches:
    - headers:
      - type: Exact
        name: env
        value: canary
    backendRefs:
    - name: bar-svc-canary
      port: 8080
  - backendRefs:
    - name: bar-svc
      port: 8080