网关 API 用于服务网格¶
“GAMMA 倡议”指的是一个正在定义如何在网关 API 中使用服务网格的组。迄今为止,该组能够在网关 API 中定义服务网格支持,而只需进行相对较小的更改。GAMMA 迄今为止引入的最重大变化是,在配置服务网格时,单个路由资源(如 HTTPRoute)直接与服务资源关联.
这主要是因为集群中通常只有一个网格处于活动状态,因此在使用网格时不会使用 网关 和 网关类 资源。反过来,这使得服务资源成为路由信息的通用绑定点。
由于服务资源不幸很复杂,并且有几个过度加载或未充分指定的方面,因此 GAMMA 还发现,正式定义 服务前端和后端方面 至关重要。简而言之
- 服务前端是其名称和集群 IP,并且
- 服务后端是其端点 IP 集合。
这种区别有助于网关 API 准确地描述网格内的路由机制,而无需创建大量重复服务的新的资源。
GAMMA 指定单个路由资源直接附加到服务,代表要应用于所有指向服务的流量的配置。
当一个或多个路由附加到服务时,不匹配至少一个路由的请求将被拒绝。如果没有路由附加到服务,则对服务的请求将根据网格的默认行为继续执行(通常会导致请求像没有网格一样转发)。
哪些路由附加到给定的服务由路由本身(使用 Kubernetes RBAC)控制:路由只需指定一个parentRef
,该引用是一个服务,而不是一个网关。
kind: HTTPRoute
metadata:
name: smiley-route
namespace: faces
spec:
parentRefs:
- name: smiley
kind: Service
group: core
port: 80
rules:
...
正在进行的工作
关于生产者路由和消费者路由之间关系的正在进行的工作。
路由的命名空间和服务的命名空间之间的关系很重要
-
与服务位于相同命名空间中的路由称为 生产者路由,因为它通常由工作负载的创建者创建,以定义对工作负载的可接受使用方式(例如,Ana 将部署工作负载和路由)。来自工作负载的任何客户端(来自任何命名空间)的所有请求都将受到此路由的影响。
上面显示的路由是生产者路由。
-
与服务位于不同命名空间中的路由称为 消费者路由。通常,这是用于改进给定工作负载的消费者如何向该工作负载发出请求的路由(例如,为该消费者使用工作负载配置自定义超时)。此路由仅影响来自与路由位于同一命名空间中的工作负载的请求。
例如,此 HTTPRoute 将导致
fast-clients
命名空间中smiley
工作负载的所有客户端具有 100 毫秒的超时kind: HTTPRoute metadata: name: smiley-route namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms
关于绑定到服务的路由,一个重要说明是,在单个命名空间中,同一服务的多个路由(无论是生产者路由还是消费者路由)将根据网关 API 路由合并规则 进行合并。因此,目前无法为同一命名空间中的多个消费者定义不同的消费者路由。
例如,如果 blender
工作负载和 mixer
工作负载都位于 foodprep
命名空间中,并且都使用同一服务调用 oven
工作负载,则目前 blender
和 mixer
无法使用 HTTPRoute 为其对 oven
工作负载的调用设置不同的超时。blender
和 mixer
需要移动到不同的命名空间才能允许这样做。
请求流程¶
当使用兼容 GAMMA 的网格时,典型的 东/西 API 请求流程如下所示
- 客户端工作负载向 http://foo.ns.service.cluster.local 发出请求。
- 网格数据平面拦截请求并将其识别为针对
ns
命名空间中foo
服务的流量。 -
数据平面定位与
foo
服务关联的路由,然后a. 如果没有关联的路由,则始终允许请求,并且
foo
工作负载本身被视为目标工作负载。b. 如果有关联的路由,并且请求与其中至少一个路由匹配,则使用最高优先级匹配路由的
backendRefs
选择目标工作负载。c. 如果有关联的路由,但请求与任何路由都不匹配,则拒绝请求。