探索 Gateway API 在 Service Mesh 中的工作机制
前几天 Gateway API 宣布在 0.8.0 中支持服务网格,这意味着 GAMMA(Gateway API for Mesh Management and Administration)有了新进展,虽然目前还是实验阶段。去年 6 月 Gateway API 发布 0.5.0 时,我还写了一篇 SMI 与 Gateway API 的 GAMMA 倡议意味着什么?。如今,SMI 作为 sandbox 项目的年度审查已经 过了几个月仍未提交,唏嘘。
废话不多说,我们来看下 0.8.0 下的 Gateway API 如何在 Service Mesh 中工作。
TL;DR
Gateway API 对服务网格的支持仍然是实验阶段,但是已经有厂商跟进(当然也都是实验阶段)。
相比 Gateway API 处理南北向流量将路由绑定到 Gateway 资源 相比,在网格中路由则是与 Service 进行绑定。简单理解成 Service 代理了 Gateway 的角色,不过该 Service 是目标 Service。
Gateway API 中的服务网格
要说服务网格,我们先来看下服务 Service
。
抽象 Service
Service
中 Kubernetes 中是一个独立的资源,这里说的抽象是从逻辑上进行抽象,抽象成前端和后端两部分。
前端(Frontend)通常就是 Service
的 DNS 名字或者 ClusterIP
;后端(Backend)则是通过标签选择器选择的 Endpoint
或者 EndpointSlice
。
路由与服务
把路由直接绑定到 Service 上,被认为是当下最优的选择。Service
与其他资源的耦合度太高,比如 IP 分配、DNS、端点集合、负载均衡等等,但在目前的网格设计中也是唯一的最优选择,未来会寻求更好的选择,比如 ServiceBinding
(见后文)
这样做的好处呢,就是将服务的前后端分别与现在的 xRoute
API 中的 parentRef
和 backendRef
关联,无需引入额外的 API。
不同的时候,在 xRoute
API 中的 backendRef
也可以是一个 Service
,但是最终在路由请求时,目标还是 Endpoint
或者 EndpointSlice
,只不过他们与 parentRef
中的 Service
不是强关联的。
kind: HTTPRoute metadata: name: smiley-route namespace: faces spec: parentRefs: - name: smiley kind: Service group: core port: 80 rules: ...
如果一个 Service 上配置了多个路由,匹配到多条路由的请求将被拒绝。
请求流程
- 客户端发送请求
- 网格数据面代理拦截请求
- 通过虚拟 IP 地址、DNS 主机名、或者名字来确认流量是属于哪个
Service
(不会使用xRoute
上的hostname
字段) - 如果
Service
没有配置路由,将使用请求的原始目的地进行转发 - 找到匹配的优先级最高(消费者路由高于生产者路由,见下文)的路由进行转发
- 如果配置了路由,但都无法匹配,则拒绝请求
路由的命名空间
为什么要提命名空间,是因为路由与服务在相同或者不同命名空间下所代表的含义不同。
同命名空间
路由 smiley-route
与 Service smiley
位于同一个命名空间 faces
,该路由上设置了请求超时时间 100ms
。这意味着,所有访问 Service smiley
(来自任一命名空间下的任一工作负载)并匹配 smiley-route
路由规则的请求,都受该超时配置的影响。
这种路由被称为 生产者路由(Producer Route),影响目标为该服务的所有请求。
kind: HTTPRoute metadata: name: smiley-route namespace: faces spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms
不同命名空间
路由 smiley-route
与 Service smiley
位于不同的命名空间,与上面不同的是,所有访问 Service smiley
(来自命名空间 fast-clients
下的任一工作负载)并匹配 smiley-route
路由规则的请求,都受该超时配置的影响。
这种路由被称为 消费者路由(Consumer Route),影响同命名空间下访问木雕服务的所有请求。
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
同一 Service 上的多个路由
这里的前提条件是这些路由都位于同一命名空间下,即同为生产者路由,或同为消费者路由。这种情况将会遵循 路由合并规则 多这个路由进行合并,如果要为同一命名空间下的多个工作负载配置不同的消费者路由,目前还无法实现。唯一的
比如下面定义了两个消费者路由 smiley-route-50
和 smiley-route-100
kind: HTTPRoute metadata: name: smiley-route-50 namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 50ms --- kind: HTTPRoute metadata: name: smiley-route-100 namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms
路由与策略
之前也写文介绍过 Gateway API 中的策略,有兴趣的可以看一下 一文搞懂 Kubernetes Gateway API 的 Policy Attachment。
在网格中策略附加可以非常简单。策略可以应用于任何命名空间中的任何资源,但如果目标位于不同的命名空间中,则它只能应用于来自同一命名空间的请求(跟随消费者路由的逻辑)。
网格一致性测试
首先来看下何为 一致性配置文件:
Gateway API 会提供用于一致性测试的配置文件,在运行一致性测试可以选择这些配置文件。然后将一致性结果报告回网关 API 项目并获得认证(例如徽章)。除了测试核心的功能,也可以自主添加厂商的特定实现中的扩展功能进行测试。
这些 Gateway API 的实现会将测试报告提交到 官方仓库的一致性测试报告目录 中,可以作为大家选型时的依据之一。
目前有 HTTP
、TLS
、TLSPassthrough
(基本上都是根据 xRoute 来进行组织,因此后续也会有 GRPC
、TCP
、UDP
)。针对服务网格,也提出了 mesh
配置文件。
官方博客 中提到 Kuma 2.3+、Linkerd 2.14+、和 Istio 1.16+ 中的 Gateway API 实现已经全部通过 mesh
一致性测试,但截止目前未看到测试报告,估计还在上传中。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
祝贺!Databend Cloud 入驻 AWS 云市场
关于 Databend Cloud Databend Cloud 是基于开源云原生数仓项目 Databend 打造的一款易用、低成本、高性能的新一代大数据分析平台,提供一站式 SaaS 服务,免运维、开箱即用。 Databend Cloud 架构如下: 存储层完全面向对象存储而设计。 计算层支持不同规格的计算节点,用户可以根据实际需求选用。 元数据信息服务层实现多租户隔离,确保用户的数据安全。 为什么选择 Databend Cloud 便于使用:用户只需要将数据加载到 Databend Cloud,即可获得完整的 SQL 数据仓库与完备的数据生态支持,一切都触手可及。 支持半结构化数据:Databend Cloud 允许用户从 CSV、JSON 或 Parquet 文件中导入数据,并对 JSON 数据以及其他复杂数据类型执行聚合查询。 高性能低成本:Databend Cloud 完全面向对象存储而设计,采用列式存储方案、矢量化查询执行技术和基于 Pull & Push 的数据调度模型,将数据库引擎的性能挖掘到极致,相比传统方案节约 80% 成本。 企业级安全:Databend ...
- 下一篇
谈谈JSF业务线程池的大小配置 | 京东物流技术团队
1.简介 JSF业务线程池使用JDK的线程池技术,缺省情况下采用Cached模式(核心线程数20,最大线程数200)。此外,还提供了Fixed固定线程大小的模式,两种模式均可设置请求队列大小。 本文旨在通过一个简化场景(“单服务应用”)下的负载测试,为“JSF业务线程池大小配置”提供基准测试结果,并形成一些普遍适用的结论。 本文的目标读者包括需要合理配置JSF线程大小的压测工程师、开发部署运维工程师以及架构师。本文不涉及JSF服务端的其他配置项,也不针对“复合服务应用”的合理配置进行探讨。你可以利用本文提供的结论,作为设计压测用例或评估业务线程池大小的基本方法的参考,以便在实践中合理配置JSF业务线程池大小。需要注意的是,JSF业务线程池大小的合理配置应该基于高保真的负载测试结果。 “单服务应用”指应用仅包含一个提供接口,且接口中仅有一个方法。 “复合服务应用”则指应用包含多个提供接口或一个接口中含有多个方法。 2.测试用例说明 本次基准测试选取了USF3.0权限系统,将其定制化为一个单一的服务提供者,仅对该提供者的一个方法进行了测试,因此可以看作是一个“单服务应用”。测试中将CPU作...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品