8 月 24 日,发明服务网格的公司 Buoyant 发布了 Linkerd 2.12[1],这是时隔近一年的版本发布。不知道大家的对新版本期待如何,在我来看新版本中的功能对于一年的时间来说确实不算多,但是我想说的是 Linkerd 还是那个 Linkerd,还是秉持着一贯的 “Keep it simple” 的设计理念。
新版本的内容不一一介绍,其中最主要的功能:per-route 策略,相比上个版本基于端口的策略,扩展到了 per-route。
而我想说的特别之处也就是在 per-route 和策略上。
在《SMI 与 Gateway API 的 GAMMA 倡议意味着什么?》[2] 层有过猜想:未来服务网格的标准有可能全部或者部分以 Kubernetes 原生 API 的方式存在。
“网关 API,之于集群是入口/出口网关,之于 Pod 是 inbound/outbound sidecar。”
现在来看,Linkerd 先迈出了这一步。
路由(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 代理,此外还有着:
这篇文章是 Linkerd 2.12 发表之际的一些启发和感想,版本发布只是表面,更要探寻表面之外的深意。利用周末的时间来挖掘一下,写下这篇。
写作的同时,有一个词浮出脑海:返璞归真。下一篇,目前只想到了标题《服务网格:少即是多,Less is more》。
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/
原文作者:云原生指北;如有侵权,请联系管理员删除。