Skip to content

HTTP 路由

原文:https://gateway-api.sigs.k8s.io/guides/user-guides/http-routing/

HTTPRoute 资源 让你能够匹配 HTTP 流量并把请求转发到 Kubernetes 后端。本指南展示 HTTPRoute 如何基于主机头、Header 和路径对流量进行匹配,并把请求转发到不同的 Kubernetes Service。

下图描述了一条横跨三个 Service的流量流:

  • 发往 foo.example.com/login 的流量 → 转发到 foo-svc
  • 发往 bar.example.com/* env: canary Header 的流量 → 转发到 bar-svc-canary
  • 发往 bar.example.com/* 且不带该 Header 的流量 → 转发到 bar-svc

虚线显示了为配置这套路由行为而部署的 Gateway 资源。两条 HTTPRoute 资源在同一 prod-web Gateway 上创建路由规则。这体现了多条 Route可以绑定到同一个 Gateway——只要 Route 之间不冲突,就能在 Gateway 上合并。更多关于 Route 合并的内容,参见 HTTPRoute 文档

要接收来自 Gateway 的流量,HTTPRoute 资源必须配置 ParentRefs,指明它应该被附加到哪些父 Gateway 上。下面的示例展示了一个组合 GatewayHTTPRoute 来服务 HTTP 流量的配置:

yaml
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 可以匹配一组 hostnames。这些 hostname 会在 HTTPRoute 内部其他任何匹配之前优先匹配。由于 foo.example.combar.example.com 是主机名不同、路由需求不同的两个主机,所以它们各自被部署为独立的 HTTPRoute——foo-routebar-route

下面的 foo-route 会匹配 foo.example.com 的所有流量,并应用其路由规则把流量转发到正确的后端。由于指定了一个匹配项,所以只有 foo.example.com/login/* 的流量会被转发。路径不以 /login 开头的请求不会被这条 Route 匹配。

yaml
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 Header 的流量会被转发到 bar-svc-canary;如果 Header 缺失或值不是 canary,则会被转发到 bar-svc

yaml
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

基于 MIT 协议发布