流量治理是一个非常宽泛的话题,例如:
- 动态修改服务间访问的负载均衡策略,比如根据某个请求特征做会话保持;
- 同一个服务有两个版本在线,将一部分流量切到某个版本上;
- 对服务进行保护,例如限制并发连接数、限制请求数、隔离故障服务实例等;
- 动态修改服务中的内容,或者模拟一个服务运行故障等。
在 Istio 中实现这些服务治理功能时无须修改任何应用的代码。较之微服务的 SDK 方式,Istio 以一种更轻便、透明的方式向用户提供了这些功能。用户可以用自己喜欢的任意语言和框架进行开发,专注于自己的业务,完全不用嵌入任何治理逻辑。只要应用运行在 Istio 的基础设施上,就可以使用这些治理能力。
一句话总结 Istio 流量治理的目标:以基础设施的方式提供给用户非侵入的流量治理能力,用户只需关注自己的业务逻辑开发,无须关注服务访问管理。
Istio 流量治理的概要流程如图 1 所示:
图 1 Istio 流量治理的概要流程
在控制面会经过如下流程:
(1)管理员通过命令行或者 API 创建流量规则;
(2)Pilot 将流量规则转换为 Envoy 的标准格式;
(3)Pilot 将规则下发给 Envoy。
在数据面会经过如下流程:
(1)Envoy 拦截 Pod 上本地容器的 Inbound 流量和 Outbound 流量;
(2)在流量经过 Envoy 时执行对应的流量规则,对流量进行治理。
负载均衡
下面具体看看 Istio 提供了流量治理中的负载均衡功能。
负载均衡从严格意义上讲不应该算治理能力,因为它只做了服务间互访的基础工作,在服务调用方使用一个服务名发起访问的时候能找到一个合适的后端,把流量导过去。
如图 2 所示,传统的负载均衡一般是在服务端提供的,例如用浏览器或者手机访问一个 Web 网站时,一般在网站入口处有一个负载均衡器来做请求的汇聚和转发。服务的虚拟 IP 和后端实例一般是通过静态配置文件维护的,负载均衡器通过健康检查保证客户端的请求被路由到健康的后端实例上。
图 2 服务端的负载均衡器
在微服务场景下,负载均衡一般和服务发现配合使用,每个服务都有多个对等的服务实例,需要有一种机制将请求的服务名解析到服务实例地址上。服务发现负责从服务名中解析一组服务实例的列表,负载均衡负责从中选择一个实例。
如图 3 所示为服务发现和负载均衡的工作流程。不管是 SDK 的微服务架构,还是 Istio 这样的 Service Mesh 架构,服务发现和负载均衡的工作流程都是类似的,如下所述:
(1)服务注册。各服务将服务名和服务实例的对应信息注册到服务注册中心。
(2)服务发现。在客户端发起服务访问时,以同步或者异步的方式从服务注册中心获取服务对应的实例列表。
(3)负载均衡。根据配置的负载均衡算法从实例列表中选择一个服务实例。
图 3 服务发现和负载均衡的工作流程
Istio 的负载均衡正是其中的一个具体应用。在 Istio 中,Pilot 负责维护服务发现数据。如图 4 所示为 Istio 负载均衡的流程,Pilot 将服务发现数据通过 Envoy 的标准接口下发给数据面 Envoy,Envoy 则根据配置的负载均衡策略选择一个实例转发请求。Istio 当前支持的主要负载均衡算法包括:轮询、随机和最小连接数算法。
图 4 Istio 负载均衡的流程
在 Kubernetes 上支持 Service 的重要组件 Kube-proxy,实际上也是运行在工作节点的一个网络代理和负载均衡器,它实现了 Service 模型,默认通过轮询等方式把 Service 访问转发到后端实例 Pod 上,如图 5 所示。
图 5 Kubernetes 的负载均衡
本篇内容节选及改编自《云原生服务网格 Istio:原理、实战、架构与源码解析》
本书购买链接:https://item.jd.com/12538407….
将本篇内容转发至朋友圈集齐 6 个赞,并截图于“京东云开发者社区”公众号后台进行回复。
我们将为第 6、66、99 位回复者送出《云原生服务网格 Istio:原理、实战、架构与源码解析》。
本期获奖名单将于本周日(7 月 7 日)揭晓,快快点击“好看”,并且转发到朋友圈吧!
推荐阅读
干货 | 三分钟带你挑选专属负载均衡
干货 | 京东云应用负载均衡(ALB)多功能实操