本文译自在 CNCF 官网上发布的博客 Networking with a service mesh: use cases, best practices, and comparison of top mesh options,有删节。作者是 Amir Kaushansky,ARMO 公司的产品 VP。
服务网格技术是随着微服务结构的普及而出现的。由于服务网格促进了网络与业务逻辑的分离,它使你能够专注于你的应用程序的核心竞争力。
微服务应用程序分布在多个服务器、数据中心或大陆上,使它们高度依赖网络。服务网格通过用路由规则和服务间包的动态方向控制流量来管理服务间的网络流量。
在这篇文章中,我们将研究使用案例,比较顶级网格选项,并讨论最佳做法。
让我们从使用服务网格的最常见场景开始。
使用案例
服务网格是一种连接微服务和管理它们之间流量的架构方法。它们在一个组织的许多层面上被大量用于生产。因此,有一些标准化的、被广泛接受的用例。
可观察性
假设你有一个后端服务的实例响应缓慢,在你的整个堆栈中造成了一个瓶颈。然后,来自前端服务的请求将超时,并重新尝试连接到缓慢的服务实例。在服务网格的帮助下,你可以使用一个断路器,确保前端实例只与健康的后端实例连接。因此,使用服务网格可以提高堆栈的可见性,并帮助你排除问题。
部署策略
部署策略(蓝/绿部署、金丝雀等)正在成为发布云原生应用升级的规范。服务网格允许部署策略,因为大多数部署策略都是基于将流量转移到特定实例。例如,你可以在服务网格中创建流量规则,以便只有一小部分用户(比如10%)会接触到新版本。
如果一切按预期进行,你可以将所有流量转移到最新版本,完成你的金丝雀部署。也建议检查Kubernetes的内部部署策略,并与你的应用程序的要求相匹配。
测试
为了保持你的生产堆栈的安全性,最好通过测试延迟、超时和灾难恢复来加固它们。
服务网格允许你通过延迟和不正确的响应在系统中制造混乱来测试其稳健性。例如,通过在服务网格流量规则中注入延迟,你可以测试当你的数据库对其查询响应缓慢时,前端和后端将如何表现。
API网关
API网关是server-client的设计模式,它使得从一个单一的入口点管理API成为可能。在服务网格的帮助下,你可以使用同样的方法进行服务间的通信,并在你的集群中创建复杂的API管理方案。建议你查看Gateway API,以便在即将到来的Kubernetes版本中把这些想法纳入本地Kubernetes资源。
服务网格作为 “智能 “胶水,通过流量策略、限制和测试功能动态地连接微服务。随着服务网格的日益普及,许多新的、被广泛接受的用例将加入上述的用例。
现在让我们来看看现有的顶级服务网格软件的优点和缺点。
顶级网格选项的比较
虽然每次会议上总有一些初创公司推出花哨的服务网格产品,但在云原生世界中,只有三个顶级网格选项被广泛使用。Istio、Linkerd和Consul Connect。它们都是拥有活跃社区的开源产品。基于他们的愿景和实施,他们也都有各自的优点和缺点。
Istio
Istio是一个Kubernetes原生的服务网格,最初由Lyft开发,并在业界被广泛采用。领先的云Kubernetes供应商,如谷歌、IBM和微软,都将Istio作为其服务的默认服务网格。Istio提供了一套强大的功能来创建服务之间的连接,包括请求路由、超时、断路和故障注入。此外,Istio通过延迟、流量和错误等指标对应用程序进行深入了解。
优点
最活跃的社区,业界采用率高,与Kubernetes和虚拟机一起使用。
缺点
学习曲线陡峭,对集群有很大的开销,没有本地管理仪表板。
Linkerd
Linkerd是第二大流行的服务网格,是云原生计算基金会(CNCF)的一部分。
从架构的角度来看,Linkerd类似于Istio,但有更多的灵活性。这种灵活性来自于可插拔架构的多个维度。例如,在连接方面,Linkerd与最流行的入口控制器一起工作,如Nginx、Traefik或Kong。同样,除了它自己的GUI,它还与Grafana、Prometheus和Jaeger合作,以实现可观察性。
优点
文档和简单的安装,在行业中得到采用,和企业支持。
缺点
只适用于Kubernetes,不支持虚拟机缺少一些网络路由功能,如断路或速率限制。
Consul Connect
Consul是分布式应用中最流行的服务发现和键/值存储,直到其母公司HashiCorp以Consul Connect的名义转换为服务网格。
因此,Consul Connect有一个混合架构,在应用程序旁边有Envoy sidecar,其控制平面和键/值存储是用Go开发的。从连接性和安全性的角度来看,Consul Connect与它的替代品相比并没有提供突出的功能。然而,它的配置和复杂性较低,使得它更容易上手–就像云原生世界中的其他HashiCorp工具一样。
优点 有HashiCorp的支持和企业级支持的可用性,可以与虚拟机和Kubernetes一起工作。
缺点
开源社区有限,缺乏完整和易于理解的文档 。
下面的图表提供了这三大解决方案之间关键差异的概述。
对比项 | Istio | Linkerd | Consul Connect |
---|---|---|---|
支持的平台 | Kubernetes 和虚拟机 | Kubernetes | Kubernetes 和虚拟机 |
支持的 Ingress 控制器 | Istio ingress | 任意 | Envoy |
流量管理功能 | 蓝绿部署、断路和速率控制 | 蓝绿部署 | 蓝绿部署、断路和速率控制 |
Prometheus 和 Grafana 支持 | 是 | 是 | 否 |
混沌测试 | 是 | 是 | 否 |
管理复杂度 | 高 | 低 | 中 |
原生 GUI | 否 | 是 | 是 |
最佳实践和挑战
服务网格使你的集群和应用中的服务间通信标准化和自动化。然而,由于产品的复杂性和基础设施的不同,服务网格产品并不简单。在使用服务网格时,以下关于挑战和最佳实践的说明将为你提供一些有用的指导。
自动化
服务网格的配置包括流量规则、速率限制和网络设置。该配置可以帮助你从头开始安装,升级版本,以及在集群之间迁移。因此,建议把配置当作代码来处理,并遵循GitOps的方法和持续部署管道。
服务网格产品在拥有大量服务器的少数集群中工作得更好,而不是拥有较少实例的许多集群。因此,建议尽可能地减少冗余集群,使你能够利用简单的操作和集中配置的服务网格方法。
监控和请求跟踪
服务网格产品是复杂的应用,管理着更复杂的分布式应用的流量。因此,指标收集、可视化和仪表板对系统的可观察性至关重要。利用Prometheus或Grafana或您的服务网格提供的任何其他集成点,根据您的要求创建警报。
安全性
大多数服务网格产品,包括前三名,都实现了一套基本的安全功能:mTLS、证书管理、认证和授权。你还可以定义和执行网络策略,以限制集群中运行的应用程序之间的通信。
不过,应该注意的是,定义网络策略不是一项简单的任务。你需要覆盖当前运行的应用程序的所有场景,并考虑未来的可扩展性。因此,利用服务网格的网络策略对用户来说并不友好,容易出现错误和安全漏洞。
然而,利用服务网格来创建安全的网络策略有几个缺点。
首先,用户必须准确定义集群所需要的策略——在微服务激增和不断变化的环境中,这是一项不容易的任务。因此,服务网格的策略需要经常改变,如果一个微服务改变其行为,可能会破坏生产。
其次,根据设计,服务网格使用sidecar代理来控制策略,所以任何从容器中出来的连接都会被自动视为合法流量,如果攻击者闯入一个容器,他们会自动继承该容器的网络身份,从而可以做任何原始容器可以做的事情。
最后,由于每个连接都要经过代理,用户在集群中使用它来加密流量时,会看到明显的性能下降。
总结一下:服务网格解决方案并不关心谁在发送或接收数据。只要网络策略允许,任何恶意的或配置错误的应用程序都可以检索你的敏感数据。因此,考虑开销更少、可操作性更强的整体方法至关重要,而不是盲目地只相信服务网格产品的安全措施。
总结
服务网格以动态、安全和可扩展的方式连接分布式微服务。目前有广泛接受的用例和实现这些用例的顶级产品。然而,由于云基础设施和应用需求高度复杂,服务网格不是银弹。
当涉及到安全问题时,保护应用程序和运行时环境不在服务网格产品的范围内,而且仅仅为了安全而安装一个服务网格是矫枉过正的,因为它在集群中产生了很高的开销。