

Istio流控,服务发现,负载均衡,核心流程是如何实现的?
source link: https://www.tuicool.com/articles/2MN7JvQ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前情提要:
《 Istio究竟是什么? 》
《 Istio分层架构设计? 》
Istio 架构体系中,流控 (Traffic Management) 虽然是数据平面的 Envoy Proxy 实施的,但整个架构的核心其实在于控制平面的 Pilot 。
灰度发布的过程在《Istio,灰度发布》一文中已经有过描述,今天重点说说 Pilot 和 Envoy 的交互流程与内部结构。
一、通用交互流程
图示:
-
灰色圆形,为业务服务
-
紫色六边形,为 Envoy 代理
二者相生相伴。
起初,上游调用方 ServiceA 访问下游服务提供方 ServiceB 的V1版本,在 ServiceB 的V2版本部署好之后,调用方如何知道“ SvcA 切分1%的流量至 SvcB 的V2版本”这个指令的呢?
整个过程主要分为 三大步骤 :
(1)用户在控制平面的后台,通过 Pilot 的API,修改A到B的路由策略 (标号1) ;
(2) Pilot 将路由策略固化存储,以便未来新注册的调用方A能够知道当前最新的路由策略;对于已经存在的调用方A, Pilot 则通过主动通知的方式告之调用方A对应的 Envoy (标号2) ;
(3) Envoy 作为数据平面,实施最新的路由策略 (标号3) ,在本例中,即将1%的流量导给灰度版本Bv2;
二、服务发现与负载均衡
讲了通用的流控策略实施通用流程 ,而服务发现与负载均衡,只是一个种策略实施的特例:
(1)提供服务的 SvcB 新增一个 Pod (标号1) ;
(2)在 Pilot 后台修改 SvcB 的集群配置 (标号2) ;
(3) Pilot 将 SvcB 的最新信息同步给该配置的订阅方 (标号3) ,即 SvcB 的调用方 SvcA 对应的 Proxy ;
(4) SvcA 对应的 Proxy 增加到 SvcB 的链接 (标号4) ,并实施负载均衡;
画外音:实际是链接到 SvcB 对应的 Proxy 。
整个过程,与使用配置中心来实施服务发现基本类似。
三、请求的入口及出口
ServiceMesh 的核心,是 技术基础设施与业务服务的解耦 ,服务A调用服务B,再次强调:
-
一个容器 Pod 内的一个服务, 服务进程( SrvA/SrvB )和边车进程( Proxy ) 是相生相伴的,他们之间的交互是 本地交互 (标号1)
-
跨容器 Pod 之间的 远程调用 ,必须 通过 Proxy 进行 (标号2)
言下之意,服务A调用服务B,请求的流程是:
SvcA -> SvcA Proxy -> SvcB Proxy -> SvcB
响应的流程则反过来:
SvcB -> SvcB Proxy -> SvcA Proxy -> SvcA
跨网之间调用, 请求的入口和出口,都是 Proxy 。
四、Pilot内部结构
Pilot 它的内部结构并不复杂:
(1) Pilot 的核心,是各种流控策略的维护, Abstract Model ;
(2)必然, Pilot 需要提供接口给用户,增删查改这些策略, Rules API ;
(3)一方面, Pilot 需要保持各类底层基础设施的兼容性, Platform Adapter ;
(4)另一方面, Pilot 又需要保持不同 Proxy 实接口的兼容性, Envoy API ;
这么设计的好处是:
-
Istio 设计时已经考虑了异构的基础设施,不管底层是 K8s 还是其他体系,都可以兼容
-
任何第三方可以实现自己的 proxy ,只要符合相关的API标准,都可以和 Pilot 集成
Pilot 与 Envoy 的配合,是 Istio 的核心,如此一来:
-
服务发现 (discovery)
-
负载均衡 (load balancing)
-
故障恢复 (failure recovery)
-
服务度量 (metrics)
-
服务监控 (monitoring)
-
A/B测试 (A/B testing)
-
灰度发布 (canary rollouts)
-
限流限速 (rate limiting)
等很多能力都可以实现了。
MerviceMesh 并没有大家想的复杂。
思路 比结论重要。
架构师之路 -分享技术思路
相关文章:
《 Istio究竟是什么? 》
《 Istio分层架构设计? 》
《 Istio,灰度发布 》
Recommend
-
31
前言 以下示例基于 https://github.com/grpc/grpc-go v1.30.0,关于proto文件定义,服务生成参考
-
10
.Net微服务实战之负载均衡(下) 相关源码:
-
8
ASP.NET Core 搭载 Envoy 实现微服务的负载均衡2021-07-0518 22 min.如果说,我们一定要找出一个词来形容这纷繁复杂的世界,我希望它会是熵。有人说,熵增定律是宇宙中最绝望的定律,所谓熵,即是指事物混乱或者无序的程度。在一...
-
4
聊聊Ribbon获取服务列表和负载均衡策略 在使用负载均衡器选取服务的时候是从所有的服务列表中获取的,那么服务列表是从哪里来的呢? 服务列表的获取 RibbonClientConfiguration中定义了ZoneAwareLoadBala...
-
6
G行全栈云环境负载均衡服务能力实践—负载均衡服务在G行的实践 作者:周永健 陈立 2022-12-27 07:42:12 全栈云应用通过负载均衡ELB将负载流量转发给后端的多个虚拟机或者容器应用,通过TCP和HTTP两种健康检查方式对...
-
9
本文主要介绍了如何使用 Go kit 实现基于consul的服务发现和负载均衡。 上一篇中,我们介绍了go-kit项目中如何调用其他服务。 在上一篇中,我们在项目中调用...
-
7
一 main.go开发 至此,咱们的项目服务端代码,已经开发完毕,现在来看一下main.go文件中的代码: package main import ( micro2 "account/common/micro" "account/config/logger" "account/confi...
-
6
微服务中 API 网关和负载均衡技术的差异?原文链接(请科学上网):https://m...
-
8
服务、网关、NGINX 这些负载均衡都解决哪些问题? 作者:王中阳Go 2023-10-08 07:15:54 在配合工作时,Nginx可以将外部请求转发到网关服务。网关服务会根据请求的路径、参数或其他标识来确定请求应该被路由到哪个...
-
2
使用 Cilium 和 BGP 为 Kubernetes 服务进行负载均衡 发布于 2024-01-30 字数 3185 阅读时长 14 分钟 阅...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK