1. 什么是Service Mesh?

服务网格是一个软件,用于处理应用程序中服务之间的所有通信,该层由容器化微服务组成。随着应用程序的扩展和微服务数量的增加,监控服务的性能变得越来越困难,为了管理服务之间的连接,服务网格提供了监控、记录、跟踪和流量控制等新功能。它独立于每项服务的代码,这使得它可以跨网络边界和多个服务管理系统工作。

2. 为什么需要服务网格?

在现代应用程序架构中,可以将应用程序作为可独立部署的小型微服务的集合来构建,不同的团队可以构建单独的微服务并选择其编程语言和工具,但是微服务之间需要进行通信,应用程序代码才能正常运行。

应用程序性呢个取决于服务之间通信的速度和弹性,开发人员必须跨服务监控和优化应用程序,但由于系统的分布性质,他们很难获得可见性。随着应用服务的扩展,管理通信变得越来越复杂。

推动采用服务网格主要因素有两个:

服务级别的可观测行

随着部署的工作负载和服务越来越多,开发人员很难理解所有服务是如何协同工作的,例如,服务团队想知道他们的下游和上游依赖关系是什么,他们希望更清楚地了解服务和工作负载在应用程序层的通信方式。

服务级别控制

管理员希望控制哪些服务相互通信,以及它们执行哪些操作,他们希望对微服务架构中服务的行为、策略和交互进行精细的控制和管理。强制执行安全策略对于监管合规至关重要。

3. 服务网格有哪些优势?

服务网格提供了一个集中的专用基础设施层,用于处理分布式应用程序中复杂的服务到服务的通信。

服务发现

服务网格提供自动服务发现,可以减少管理服务端点的运维负担,它们使用服务注册来动态发现和跟踪网格中的所有服务,无论服务位于何处或者底层基础设施如何,都可以无缝地相互查找和通信。可以根据需要部署新服务从而实现快速扩展。

负载均衡

服务网格使用各种算法(例如循环算法、最少连接或加权负载均衡)在多个服务实例之间智能地分配请求。负载均衡可提高资源利用率并确保高可用性和扩展性,可以优化性能并防止出现网络通信瓶颈。

流量管理

服务网格提供高级流量管理功能,可以对请求路由和流量行为进行精细控制。

  • 流量分割
    • 可以将传入流量划分到不同的服务版本或配置中,网格将一些流量引导到更新后的版本,从而以受控方式逐步推出变更,这样可以实现平稳过渡,并最大限度地降低变更的影响
  • 请求镜像
    • 可以将流量复制到测试或者监控服务进行分析而不影响主请求流,镜像请求时,可以深入了解服务如何哎不影响生产流量的情况下处理特定请求
  • Jenkins部署
    • 可以将一小部分用户或者流量引导到新的服务版本,而大多数用户则继续使用现有的稳定版本,在有限的接触范围内,您可以在生产环境中试验新版本的行为和性能。
  • 安全性
    • 服务网格提供安全通信功能,例如双向TLS(mTLS)加密、身份验证和授权。双向TLS支持服务间通信中的身份验证,它通过加密流量来确保数据的机密性和完整性,同时还可以强制执行授权策略,以控制哪些服务访问特定端点或者执行特定操作。
  • 监控
    • 服务网格提供全面的监控和可观测行功能,可深入了解服务的运行状况、性能和行为。监控还支持故障排除和性能优化,可以实用的监控功能示例:
      • 手机延迟、错误率和资源利用率等指标,以分析整体系统性能
      • 执行分布式跟踪,查看多个服务中请求的完整路径和时间
      • 在日志中捕获服务事件,用于审计、调试和合规目的

对于在微服务架构中构建的云原生应用,服务网格是一种将大量离散服务组合成功能性应用程序的方法。

4. 服务网格是如何工作的?

服务网格从单个服务汇总移除控制服务间通信的逻辑,并将通信抽象到自己的基础设施层。它使用多个网络代理来路由和跟踪服务之间的通信。

代理充当组织网络和微服务之间的中间网关,所有进出该服务的流量都通过代理服务器进行路由,单个代理有时被称为sidecar,因为它们是分开运行的,但在逻辑上位于每个服务旁边,这些代理一起构成了服务网格层。
网络代理

服务网格架构中有两个主要组成部分:数据面板和控制面板

数据面板

数据面板是服务网格的数据处理组件,它包括所有sidecar代理及其功能,当一个服务想要与其他服务通信时,sidecar代理会采取以下操作:

  1. sidecar拦截请求
  2. 它将请求封装在单独的网络连接中
  3. 它在源代理和目标代理之间建立安全的加密通道

sidecar代理处理服务之间的低级消息传递。它们还会实施断路和请求重试等供呢个,以增强弹性并防止服务降级,服务网格功能(例如负载均衡、服务发现和流量路由)在数据面板中实施。

控制面板

控制面板充当服务网格的中央管理和配置层。

使用控制面板,管理员可以在网格内定义和配置服务,例如,它们可以指定服务端点、路由规则、负载均衡策略和安全设置等参数。定义配置后,控制面板将必要信息分发到服务网格的数据面板。

服务网格实现通常在控制面板中包括一下功能:

  • 用于跟踪网格内所有服务的服务注册表
  • 自动发现新服务并删除非活动服务
  • 收集和聚合遥测数据,例如指标、日志和分布式跟踪信息

在服务网格中,请求通过其自身基础架构层中的代理在微服务之间路由。因此,组成服务网格的单个代理被称为sidecar,因为它们与每个服务一起运行,而不是在服务内运行,总的来说,这些与每个服务分离的sidecar代理形成了一个网格网络。

微服务与Sidecar示意图

sidecar代理与微服务并存,将请求路由到其他代理,这些sidecar共同构成了一个网状网络。

如果没有服务网格,每个微服务都需要编写逻辑来管理服务间的通信,这意味着开发人员无法专注于业务目标。这也意味着通信故障更难诊断,因为管理服务间通信的逻辑隐藏在每个服务中。

5. 什么是Istio?

Istio是一个开源服务网格项目,设计为主要与K8s配置使用,K8s是一款开源容器编排平台,用于大规模部署和管理容器化应用程序。

Istio的控制面板组件本身作为K8s工作负载运行,它使用K8s容器组(一组共享一个IP地址的紧密耦合的容器)作为sidecar代理设计的基础。

Istio的第7层代理在与主服务相同的网络环境中作为另一个容器运行,从这个位置,它可以拦截、检查和操作所有容器组的网络流量,但是,主容器不需要任何改动,甚至不需要知道这种情况正在发生。

Istio是怎么运行的?

Istio使用代理来拦截所有的网络流量,从而根据设置的配置允许使用一系列应用程序感知功能。

控制平面采用所需的配置及其对应服务的视图,并动态的编程代理服务器,并根据规则或环境的变化对其进行更新。

数据平面是服务之间的通信,如果没有服务网格,网格就无法理解正在发送的流量,也无法根据流量类型、流量来源或者目的做出任何决策。

Istio支持两种数据平面模式:

  • sidecar模式:会与在集群中启动的每个pod一起部署一个Envoy代理,或者与在虚拟机上运行的服务一起运行
  • 环境模式:使用每个节点的第四层代理,并且可选地使用每个命名空间的Envoy代理来实现第7层功能

Istio工作原理

6. 开源服务网格实施面临哪些挑战?

以下是Istio、Linkerd和Consul等开源平台相关的一些常见的服务网格挑战

复杂性

服务网格引入了其他基础设施组件、配置要求和部署注意事项,它们的学习曲线很陡峭,这要求开发人员和操作人员获得使用特定服务网格实施方面的专业知识。培训团队需要时间和资源,组织必须确保团队具备必要的知识,以了解服务网格架构的复杂性并对其进行有效配置。

运维管理费用

服务网格会带来部署、管理和监控数据面板代理和控制面板代理的额外开销,例如需要执行以下操作:

  • 确保服务网格基础设施的高可用性和可扩展性
  • 监控代理的运行状况和性能
  • 处理升级和兼容性问题

必须仔细设计和配置服务网格,以最大限度地减少对整个系统的性能影响。

集成挑战

服务网格必须与现有基础设施无缝集成,才能执行其所需要的功能。这包括容器编排平台、网络解决方案和技术堆栈中的其他工具。

在复杂多样的环境中,要要确保与其他组件的兼容性和顺利集成也具有挑战性。要更改API、配置格式和依赖关系,需要持续的规划和测试。

7. 小结

Service Mesh服务网格主要的目的就是为了应对在微服务架构流行的当下,将大量离散服务组合成功能性应用程序的方法,通过服务网格我们可以实现对各个服务的统一观测和复杂控制,并实现服务发现、负载均衡、流量管理等功能,同时使用服务网格还能增强服务的安全性以及部署的安全性。

目前开源的服务网格主流的主要有IstioLinkerd等。

参考

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部