服务网格——服务网格架构(概念原理2)

服务网格——服务网格架构(概念原理2)目录控制平面数据平面参考服务网格的实现模式 Ingress 或边缘代理路由器网格 ProxyperNode 代理 Fabric 模型 Sidecar 代理 控制平面多集群部署和扩展 Istio 架构解析下图是 ConduitServi 现在已合并到 Linkerd2 中了 的架构图 这是 ServiceMesh 的一种典型的架构 图

目录

控制平面

数据平面

参考

服务网格的实现模式

Ingress或边缘代理

路由器网格

Proxy per Node

Sidecar代理/Fabric模型

Sidecar代理/控制平面

多集群部署和扩展

Istio 架构解析


下图是Conduit Service Mesh(现在已合并到Linkerd2中了)的架构图,这是Service Mesh的一种典型的架构。

服务网格——服务网格架构(概念原理2)

图片 – 服务网格架构示意图

服务网格中分为控制平面数据平面,当前流行的两款开源的服务网格 Istio 和 Linkerd 实际上都是这种构造,只不过 Istio 的划分更清晰,而且部署更零散,很多组件都被拆分,控制平面中包括 Mixer、Pilot、Citadel,数据平面默认是用Envoy;而 Linkerd 中只分为 Linkerd 做数据平面,namerd 作为控制平面。

控制平面

控制平面的特点:

  • 不直接解析数据包
  • 与控制平面中的代理通信,下发策略和配置
  • 负责网络行为的可视化
  • 通常提供API或者命令行工具可用于配置版本化管理,便于持续集成和部署

数据平面

数据平面的特点:

  • 通常是按照无状态目标设计的,但实际上为了提高流量转发性能,需要缓存一些数据,因此无状态也是有争议的
  • 直接处理入站和出站数据包,转发、路由、健康检查、负载均衡、认证、鉴权、产生监控数据等
  • 对应用来说透明,即可以做到无感知部署

参考

  • 企业级服务网格架构之路解读

服务网格的实现模式

我们在前面看到了通过客户端库来治理服务的架构图,那是我们在改造成Service Mesh架构前使用微服务架构通常的形式,下图是使用Service Mesh架构的最终形式。

服务网格——服务网格架构(概念原理2)

图片 – Service Mesh 架构示意图

当然在达到这一最终形态之前我们需要将架构一步步演进,下面给出的是参考的演进路线。

Ingress或边缘代理

如果你使用的是Kubernetes做容器编排调度,那么在进化到Service Mesh架构之前,通常会使用Ingress Controller,做集群内外流量的反向代理,如使用Traefik或Nginx Ingress Controller。

服务网格——服务网格架构(概念原理2)

图片 – Ingress 或边缘代理架构示意图

这样只要利用Kubernetes的原有能力,当你的应用微服务化并容器化需要开放外部访问且只需要L7代理的话这种改造十分简单,但问题是无法管理服务间流量。

路由器网格

Ingress或者边缘代理可以处理进出集群的流量,为了应对集群内的服务间流量管理,我们可以在集群内加一个Router层,即路由器层,让集群内所有服务间的流量都通过该路由器。

路由器网格架构示意图

图片 – 路由器网格架构示意图

这个架构无需对原有的单体应用和新的微服务应用做什么改造,可以很轻易的迁移进来,但是当服务多了管理起来就很麻烦。

Proxy per Node

这种架构是在每个节点上都部署一个代理,如果使用Kubernetes来部署的话就是使用DaemonSet对象,Linkerd第一代就是使用这种方式部署的,一代的Linkerd使用Scala开发,基于JVM比较消耗资源,二代的Linkerd使用Go开发。

Proxy per node 架构示意图

图片 – Proxy per node 架构示意图

这种架构有个好处是每个节点只需要部署一个代理即可,比起在每个应用中都注入一个sidecar的方式更节省资源,而且更适合基于物理机/虚拟机的大型单体应用,但是也有一些副作用,比如粒度还是不够细,如果一个节点出问题,该节点上的所有服务就都会无法访问,对于服务来说不是完全透明的。

Sidecar代理/Fabric模型

这个一般不会成为典型部署类型,当企业的服务网格架构演进到这一步时通常只会持续很短时间,然后就会增加控制平面。跟前几个阶段最大的不同就是,应用程序和代理被放在了同一个部署单元里,可以对应用程序的流量做更细粒度的控制。

Sidecar代理/Fabric模型示意图

图片 – Sidecar代理/Fabric模型示意图

这已经是最接近Service Mesh架构的一种形态了,唯一缺的就是控制平面了。所有的sidecar都支持热加载,配置的变更可以很容易的在流量控制中反应出来,但是如何操作这么多sidecar就需要一个统一的控制平面了。

Sidecar代理/控制平面

下面的示意图是目前大多数Service Mesh的架构图,也可以说是整个Service Mesh架构演进的最终形态。

Sidecar 代理/控制平面架构示意图

图片 – Sidecar 代理/控制平面架构示意图

这种架构将代理作为整个服务网格中的一部分,使用Kubernetes部署的话,可以通过以sidecar的形式注入,减轻了部署的负担,可以对每个服务的做细粒度权限与流量控制。但有一点不好就是为每个服务都注入一个代理会占用很多资源,因此要想方设法降低每个代理的资源消耗。

多集群部署和扩展

以上都是单个服务网格集群的架构,所有的服务都位于同一个集群中,服务网格管理进出集群和集群内部的流量,当我们需要管理多个集群或者是引入外部的服务时就需要网格扩展和多集群配置。

 

Istio 架构解析

下面是以漫画的形式说明 Istio 是什么。

 

 

服务网格——服务网格架构(概念原理2)

该图中描绘了以下内容:

  • Istio 可以在虚拟机和容器中运行
  • Istio 的组成
    • Pilot:服务发现、流量管理
    • Mixer:访问控制、遥测
    • Citadel:终端用户认证、流量加密
  • Service mesh 关注的方面
    • 可观察性
    • 安全性
    • 可运维性
  • Istio 是可定制可扩展的,组建是可拔插的
  • Istio 作为控制平面,在每个服务中注入一个 Envoy 代理以 Sidecar 形式运行来拦截所有进出服务的流量,同时对流量加以控制
  • 应用程序应该关注于业务逻辑(这才能生钱),非功能性需求交给 Service Mesh
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230546.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月16日 下午4:01
下一篇 2026年2月16日 下午4:22


相关推荐

  • Awesome OpenClaw Skills 完整安装使用指南

    Awesome OpenClaw Skills 完整安装使用指南

    2026年3月13日
    2
  • Android 多线程下载网络文件

    Android 多线程下载网络文件

    2021年8月23日
    45
  • docker端口映射成功 不可用_docker启动后访问拒绝连接

    docker端口映射成功 不可用_docker启动后访问拒绝连接情境描述创建一个docker容器,并进行端口映射。容器启动后,在部署容器的主机上可以访问映射端口,但是其他主机无法访问。问题排查出现上述情况,应是请求被拦截。出现该问题的可能是由于firewall配置异常、ip转发关闭、iptables服务拦截了请求排查firewall(1)使用firewall-cmd–state查看防火墙运行情况如果防火墙处于notrunning,则可以排除…

    2022年10月17日
    5
  • 什么叫中断、中断向量、中断向量表?

    什么叫中断、中断向量、中断向量表?原文地址 http www 360doc com content 09 0516 16 799 3526529 shtml 中断 所谓中断是指 CPU 在正常执行程序的过程中 由于内部 外部事件的触发或由程序的预先安排 引起 CPU 暂时中断当前正在运行的程序 而转去执行为内部 外部事件或程序预先安排的事件的服务子程序 待中断服务子程序执行完毕后 CPU 再返回到被暂时中断的程序处 断点 继续执行原来

    2026年3月18日
    3
  • 前端异步(async)解决方案(所有方案)[通俗易懂]

    前端异步(async)解决方案(所有方案)[通俗易懂]javascript是一门单线程语言,即一次只能完成一个任务,若有多个任务要执行,则必须排队按照队列来执行(前一个任务完成,再执行下一个任务)。这种模式执行简单,但随着日后的需求,事务,请求增多,这种单线程模式执行效率必定低下。只要有一个任务执行消耗了很长时间,在这个时间里后面的任务无法执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导…

    2022年7月27日
    9
  • xutil post 414. onError: errorCode: 414, msg: Request-URI Too Long

    xutil post 414. onError: errorCode: 414, msg: Request-URI Too LongonError:errorCode:414,msg:Request-URITooLong,result:RequestURLTooLong解决办法去掉图中黄色标注的一行原因不可以对post体tostring

    2022年6月9日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号