Linkerd系列1 - Linkerd2-proxy
ServiceMesh这块属于 k8s 的一个大热门,但据我所知,落地的并不是太多。看文章大概理解为 overhead 以及部署都比较重,对一般的企业来讲,要考虑的东西比较多,所以落地难度比较大。有的建议是说,先上 envoy,其他的先搁置,这也是个思路。envoy 轻量级一些,可以先作为一个 proxy 去体验一下 ServiceMesh 架构下的 proxy 设计。然后再逐步看看怎么引入 ServiceMesh. 另一个方面,Istio vs Linkerd 应该还没完全分出胜负,对于企业的选型来说,仍然是个难点。好处是,我们可以去对比二者在各个功能点上的设计思路差异,然后加深理解。在 ServiceMesh 的组件中,毫无疑问 proxy 是核心组件之一。linkderd 的 linkderd2-proxy 也是一个经过深思熟虑并且设计良好的组件,可以作为切入点研究下 linkderd 的整体设计。 语言选型 envoy 是 C++ 写的,而 linkderd2-proxy 是 Rust. 语言的选型不仅对于实现者来说很重要,对于用户来说也是。想一下 marathon 用的 scala 以及它的失败就知道了。为什么选 Rust, 这跟它最开始的目标有关 资源占用低。因为 ServiceMesh 场景下的 proxy, 经常是以 sidecar 方式挂载在业务组件的 Pod 里,所以一定不能有太多的资源占用。 延迟低。因为要转发所有的请求,不能有太多的 overhead. 安全。同上,因为要转发所有的请求,如果 proxy 本身有安全漏洞,那就影响太大了。 因为 linkderd2-proxy 主要的设计思路是简单,只定义为 ServiceMesh 场景,那么上面几个条件几乎都是硬性的,符合上面几个条件的语言基本上就只有 Rust了。因为上面几个条件意味着: 不能有GC. GC会带来 worst case tail latency。Go/Java不符合 不能太重了。JVM再经过调优也不符合。linkderd2-proxy第一版就是用 Scala 写的,被抛弃了。 有内存安全保障。C/C++不符合。历史经验表明,很多组件一大半的安全漏洞都是跟内存安全有关的。 自动协议检测及 mTLS 这点跟 envoy 的差别也比较大。envoy 的配置文件上来一看还是挺吓人的,虽然可维护性更好。而linkderd2-proxy的设计思路是尽可能的少配置,基本上能做到插入即用,不需要额外配置什么。 ...