根据CNCF的最新年度调查,很明显,很多人对在他们的项目中使用服务网格表现出了浓厚的兴趣,并且许多人已经在他们的生产中使用它们。近69%的人正在评估Istio,64%的人正在研究Linkerd。Linkerd是市场上第一个服务网格,但是Istio使服务网格更受欢迎。这两个项目都是最前沿的,而且竞争非常激烈,因此选择一个项目是一个艰难的选择。在此博客文章中,我们将了解有关Istio和Linkerd体系结构,其运动部件的更多信息,并比较其产品以帮助您做出明智的决定。
服务网格简介
在过去的几年中,微服务架构已经成为设计软件应用程序的流行风格。在这种体系结构中,我们将应用程序分解为可独立部署的服务。这些服务通常是轻量级的,多语言的,并且通常由各种职能团队进行管理。当这些服务的数量变得庞大且难以管理时,这种架构风格将一直有效。突然之间,它们不再简单了。这在管理各个方面(例如安全性,网络流量控制和可观察性)方面带来了挑战。服务网格有助于解决这些挑战。
术语服务网格用于描述组成此类应用程序的微服务网络及其之间的交互。随着服务数量的增加和复杂性的增加,扩展和管理变得越来越困难。服务通常提供服务发现,负载平衡,故障恢复,指标和监视。服务网格通常还具有更复杂的操作要求,例如A / B测试,金丝雀推出,速率限制,访问控制和端到端身份验证。服务网格为负载平衡,服务到服务的身份验证,监视等提供了一种创建服务网络的简便方法,而对服务代码的更改很少或没有更改。
让我们看一下Istio和Linkerd的体系结构。请注意,这两个项目都在快速发展,并且本文基于Istio版本1.6和Linkerd版本2.7。
Istio
Istio是一个开放源代码平台,提供了作为服务网格的完整解决方案,提供了保护,连接和监视微服务的统一方法。它得到了IBM,Google和Lyft等行业领导者的支持。Istio是最流行,最完整的解决方案之一,其高级产品适用于各种规模的企业。它是Kubernetes的一等公民,被设计为模块化,独立于平台的系统。其架构:[源自:官网]
基本组件:
Envoy是由Lyft用C ++编写的高性能代理,它可以中介服务网格中所有服务的所有入站和出站流量。它与服务一起作为Sidecar代理部署。Envoy提供以下功能:动态服务发现、负载均衡、TLS终止、HTTP / 2和gRPC代理、断路器、健康检查、分阶段推出,并按百分比分配流量、故障注入、以及丰富的指标。
在较新的Istio版本中,Sidecar代理对Mixer的工作承担了额外的责任。在早期版本的Istio(<1.6)中,使用Mixer从网格收集遥测信息。
Pilot为Sidecar代理,流量管理功能和弹性提供服务发现。它将控制流量行为的高级路由规则转换为特定于特使的配置。
Citadel通过内置的身份和凭据管理实现了强大的服务到服务和最终用户身份验证。它可以在网格中启用授权和零信任安全性。
Galley是Istio配置验证,提取,处理和分发组件。
核心功能
1、流量管理-智能流量路由规则,流量控制和服务级别属性(如断路器,超时和重试)的管理。它使我们能够轻松设置A / B测试,金丝雀推出和分阶段推出,并按比例分配流量。
2、安全性—在服务之间提供安全的通信通道,并大规模管理身份验证,授权和加密。
3、可观察性-强大的跟踪,监视和日志记录功能提供了深刻的见解和可见性。它有助于有效地检测和解决问题。
Istio还具有一个附加组件基础结构服务,该服务支持对微服务的监视。Istio与Prometheus,Grafana,Jaeger和服务网格仪表板Kiali等应用程序集成。
Linkerd
Linkerd是Buoyant为Kubernetes设计的开源超轻服务网格。用Rust完全重写以使其超轻便和高性能,它为您提供运行时调试,可观察性,可靠性和安全性,而无需在分布式应用程序中更改代码。
Linkerd具有三个组件-UI,数据平面和控制平面。它通过在每个服务实例旁边安装轻量级透明代理来工作。其架构:
控制平面
Linkerd的控制计划是一组服务,这些服务提供了服务网格的核心功能。它聚集遥测数据,提供面向用户的API,并将控制数据提供给数据计划代理。以下是控制平面的组件:
控制器–它由一个公共API容器组成,该容器为CLI和仪表板提供API。
目标–数据平面中的每个代理都将调查此组件以查找将请求发送到的位置。它具有用于每个路由指标,重试和超时的服务配置文件信息。
身份–它提供了一个证书颁发机构,该证书颁发机构接受来自代理的CSR并返回以正确身份签名的证书。它提供了mTLS功能。
代理注入器–这是一个准入控制器,用于查找注释(linkerd.io/inject:已启用),并对pod规范进行变异,以添加initContainer以及包含代理自身的sidecar。
服务配置文件验证器–这也是一个准入控制器,用于在保存新服务配置文件之前对其进行验证。
点击–它从CLI或仪表板接收请求,以实时监视请求和响应,以在应用程序中提供可观察性。
Web –提供Web仪表板。
Grafana – Linkerd通过Grafana提供开箱即用的仪表板。
Prometheus –通过在端口4191上代理的/ metrics终结点来收集和存储所有Linkerd度量。
数据平面
Linkerd数据平面由轻量级代理组成,这些轻量级代理与服务容器的每个实例一起作为小的容器部署。在具有特定批注的Pod的初始化阶段,将注入代理(请参见上面的代理注入器)。自从2.x完全在Rust中重写以来,该代理一直非常轻巧和高性能。这些代理拦截与每个Pod之间的通信,以提供检测和加密(TLS),而无需更改应用程序代码。
代理功能:
1、 HTTP,HTTP / 2和任意TCP协议的透明,零配置代理。
2、自动为HTTP和TCP流量导出Prometheus指标。
3、透明的零配置WebSocket代理。
4、自动,可感知延迟的第7层负载平衡。
5、非HTTP流量的自动第4层负载平衡。
6、按需诊断分接API。
Istio、 Linkerd 2者功能对比:
功能 | Istio | Linkerd |
运行平台 |
Kubernetes、VMs | Kubernetes |
易安装性 |
配置选项丰富及灵活,影响决策 | 开箱即用的配置,易上手 |
支持协议 |
gRPC,HTTP / 2,HTTP / 1.x,Websocket和所有TCP通信 | gRPC,HTTP / 2,HTTP / 1.x,Websocket和所有TCP流量 |
入口控制器 |
Envoy,Istio网关本身 | 任何– Linkerd本身不提供入口功能 |
多集群网格和扩展 | 支持通过多种配置选项以及在Kubernetes集群之外扩展网格的功能,以稳定的版本支持多集群部署 | 从2.7版开始,多群集部署仍处于试验阶段。根据最新版本2.8,多群集部署稳定 |
追踪支持 |
Jaeger,Zipkin | 支持OpenCensus的后端 |
监控功能 |
丰富 | 丰富 |
路由功能 |
各种负载平衡算法(轮询,随机最少连接),支持基于百分比的流量拆分,支持基于报头和路径的流量拆分 | 支持EWMA(指数加权移动平均)负载平衡算法,通过SNI支持基于百分比的流量拆分 |
弹性 |
中断、重试和超时,故障注入,延迟注入 | 无中断、无延迟注入 |
安全 |
mTLS支持所有协议,可以使用外部CA证书/密钥,支持授权规则。 | 除了TCP之外,还支持mTLS,可以使用外部CA /密钥,但尚不支持授权规则 |
性能 |
在最近的1.6版本中,Istio的资源占用越来越多,延迟得到了改善 | Linkerd的设计非常轻巧-根据第三方基准,它比Istio快3-5倍 |
企业支持 |
不适用于OSS版本。如果您将Google的GKE与Istio结合使用,或者将Red Hat OpenShift与Istio作为服务网格使用,则可能会获得各个供应商的支持。 | 开发了Linkerd OSS版本的Buoyant提供了完整的企业级工程,支持和培训 |
服务网格接口(SMI)兼容性 | 借助第三方CRD | 用于流量拆分和指标,而不用于流量访问控制 |
服务网格正在成为云原生解决方案和微服务架构中的重要组成部分。它完成了所有繁重的工作,例如流量管理,弹性和可观察性,并使开发者更专注于业务逻辑。Istio和Linkerd均已成熟,并已在多家企业落地。对当前公司所计划采购的需求及技术架构分析对于选择要使用的服务网格至关重要。因此,在技术选型阶段时尽可能花费足够的时间,毕竟,后期架构的升级或迁移将是一个复杂、繁琐的过程,在实施过程中将会面临巨大的挑战。
选择与服务网格一样复杂和关键的技术时,不仅要考虑技术本身,还要考虑使用技术的生态环境。很难说A是否比B好,只有结合公司的当前业务场景,因为答案确实是“取决于”。
一个组件中可能有一些功能看起来不错,但请确保检查另一个功能是否计划在不久的将来发布,并基于不仅是理论上的评估,而且还要在一个测试中对它们进行尝试,做出明智的决定。概念验证沙箱。这种概念验证应集中在易用性,功能匹配以及更重要的是技术的操作方面。引入技术相对容易,最困难的部分是在其生命周期中运行和管理它。