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: canaryHeader 的流量 → 转发到bar-svc-canary。 - 发往
bar.example.com/*且不带该 Header 的流量 → 转发到bar-svc。
虚线显示了为配置这套路由行为而部署的 Gateway 资源。两条 HTTPRoute 资源在同一 prod-web Gateway 上创建路由规则。这体现了多条 Route可以绑定到同一个 Gateway——只要 Route 之间不冲突,就能在 Gateway 上合并。更多关于 Route 合并的内容,参见 HTTPRoute 文档。
要接收来自 Gateway 的流量,HTTPRoute 资源必须配置 ParentRefs,指明它应该被附加到哪些父 Gateway 上。下面的示例展示了一个组合 Gateway 和 HTTPRoute 来服务 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 可以匹配一组 hostnames。这些 hostname 会在 HTTPRoute 内部其他任何匹配之前优先匹配。由于 foo.example.com 和 bar.example.com 是主机名不同、路由需求不同的两个主机,所以它们各自被部署为独立的 HTTPRoute——foo-route 和 bar-route。
下面的 foo-route 会匹配 foo.example.com 的所有流量,并应用其路由规则把流量转发到正确的后端。由于只指定了一个匹配项,所以只有 foo.example.com/login/* 的流量会被转发。路径不以 /login 开头的请求不会被这条 Route 匹配。
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。
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