ITPub博客

首页 > 数据库 > 数据库开发技术 > 另眼旁观 Linkerd 2.12 的发布:服务网格标准的曙光?

另眼旁观 Linkerd 2.12 的发布:服务网格标准的曙光?

原创 数据库开发技术 作者:云原生指北 时间:2022-08-28 10:10:34 0 删除 编辑

8 月 24 日,发明服务网格的公司 Buoyant 发布了 Linkerd 2.12[1],这是时隔近一年的版本发布。不知道大家的对新版本期待如何,在我来看新版本中的功能对于一年的时间来说确实不算多,但是我想说的是 Linkerd 还是那个 Linkerd,还是秉持着一贯的 “Keep it simple” 的设计理念。

新版本的内容不一一介绍,其中最主要的功能:per-route 策略,相比上个版本基于端口的策略,扩展到了 per-route。

而我想说的特别之处也就是在 per-route 和策略上。

per-route 和策略有何特别之处?

在《SMI 与 Gateway API 的 GAMMA 倡议意味着什么?》[2] 层有过猜想:未来服务网格的标准有可能全部或者部分以 Kubernetes 原生 API 的方式存在。

“网关 API,之于集群是入口/出口网关,之于 Pod 是 inbound/outbound sidecar。”

现在来看,Linkerd 先迈出了这一步。

per-route

路由(routing)是通过网络将流量从源地址传输到目的地的操作。不同的流量有不同的操作(路由),流量路由的前提是流量的识别,通俗来讲就是请求的匹配。对服务网格中常见的 TCP 流量,有源地址、源端口、目的地址、目的端口等标识;对于 HTTP 流量,标识则更多:路径、报头、参数等等。

Linkerd 通过一个 CRD ServiceProfile 提供了 per-route 的 指标、重试和超时设置,该 CRD 中可以配置匹配规则来进行流量的识别。在新的 per-route 策略中,则又引入了新的流量识别机制 HTTPRoute[3] 。这个 HTTPRoute 实际上是来自 Kubernetes Gateway API[4],以镜像的方式维护在 policy.linkerd.io/v1alpha1 包中。

至于为何要自己维护 HTTPRoute,在 Buoyant 的另一篇博客《Linkerd and the Gateway API》[5] 中也给出了答案:目前的 Gateway API 虽易展现出成为标准的设计,但还不足以满足目前的需求。

为何无法满足目前的需求,让我们继续来看策略。

策略

2.12 带来的 per-route 策略是授权策略(Authorization Policy),通过 AuthorizationPolicy 及其他几个 CRD 来进行配置,与 HTTPRoute 一起维护在 policy.linkerd.io/v1alpha1 包中。从包名来看,policy.linkerd.io/v1alpha1 是考虑到了 Kubernetes Gateway API Policy Attachment[6]的设计。

图片来自 Kubernetes Gateway API 文档

在服务网格的功能中有很多的策略:路由、认证/授权、超时、重试、熔断、限流、故障注入等等。而目前 Policy Attachment 还只是提供了概念设计,对这些策略没有任何具体的定义。因此 Linkerd 将其维护在 policy.linkerd.io/v1alpha1 包中,并乐观地相信有一天其可以被 Kubernetes 原生的 CRD 替代,且切换的成本微不足道。

在此我也猜想,原本 ServiceProfile 中的策略也会被废弃,并转移到新的包中。因为 ServiceProfile的设计本就不够优雅,将流量的标识与策略耦合(估计这也是 Linkerd 的 Keep it simple 执念,尽量少定义 CRD)。

无独有偶

架构设计总是伴随着取舍,在结构化和可扩展性间进行着平衡。Linkerd 秉持 Keep it simple 的设计理念,尽量避免定义过多的 CRD,降低复杂度。不只是这次的 HTTPRoute,其流量拆分上使用了Service Mesh Interface(SMI)[7]的 TrafficSplit API[8](Linkerd 支持 v1alpha2,最新为 v1alpha4)。

简化设计,降低学习和维护的成本;降低资源需求,降低使用成本;提供最小功能集,“够用就好”,减少冗余功能带来的成本提升。

服务网格面世 5 年来,用户逐渐意识到“轻、快、易用”对于服务网格的重要性。这条路上 Linkerd 并不是孤独的,国产的服务网格产品 Flomesh[9] 开源的 osm-edge 也是同样的简化设计,轻量级高性能的 sidecar 代理,此外还有着:

  • 开放的控制平面设计,通过扩展支持更多的服务发现。
  • 可编程的sidecar 代理 Pipy,功能扩展更容易;除了作为服务网格代理,还可以独立使用。
  • 基于 SMI 的实现。SMI 与 Gateway API 都是同样的流量标识与策略分离的设计,简单的对比可以看这篇[10]。

总结

这篇文章是 Linkerd 2.12 发表之际的一些启发和感想,版本发布只是表面,更要探寻表面之外的深意。利用周末的时间来挖掘一下,写下这篇。

写作的同时,有一个词浮出脑海:返璞归真。下一篇,目前只想到了标题《服务网格:少即是多,Less is more》。

参考资料

[1] 

Linkerd 2.12: https://buoyant.io/blog/announcing-linkerd-2-12

[2] 

《SMI 与 Gateway API 的 GAMMA 倡议意味着什么?》: https://atbug.com/why-smi-collaborating-in-gateway-api-gamma/

[3] 

新的流量识别机制 HTTPRoute: https://linkerd.io/2.12/reference/authorization-policy/#httproute

[4] 

Kubernetes Gateway API: https://gateway-api.sigs.k8s.io/references/spec/#gateway.networking.k8s.io/v1beta1.HTTPRoute

[5] 

《Linkerd and the Gateway API》: https://buoyant.io/blog/linkerd-and-the-gateway-api

[6] 

Kubernetes Gateway API Policy Attachment: https://gateway-api.sigs.k8s.io/references/policy-attachment/#policy-attachment

[7] 

Service Mesh Interface(SMI): https://smi-spec.io

[8] 

TrafficSplit API: https://github.com/servicemeshinterface/smi-spec/blob/main/apis/traffic-split/v1alpha2/traffic-split.md

[9] 

Flomesh: https://flomesh.io

[10] 

这篇: https://atbug.com/why-smi-collaborating-in-gateway-api-gamma/


原文作者:云原生指北;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-03-04

  • 博文量
    130
  • 访问量
    54632