流量治理
- Istio的流量路由规则使运维人员可以轻松控制服务之间的流量和API调用
- Istio简化了诸如断路器,超时和重试之类的服务级别属性的配置,并使其易于设置重要任务(A/B测试,canary部署和基于百分比的流量拆分的分段部署)
- 它还提供了开箱即用的故障恢复功能,有助于使应用程序更强大,以防止相关服务或网络的故障
- 使用Istio进行流量管理从本质上是将流量与底层基础架构的伸缩机制相解耦,从而让运维工程师能够通过Pilot指定它们希望流量自身需要遵循那些规则,而非仅仅只能定义由那些特定的pod/vm接收流量,并在这些pod/vm之间以受限于数量比例的方式分配流量;
- Pilot和Envoy proxy负责实现流量规则中定义的流量传输机制
- 例如,可以通过pilot指定到希望特定服务的5%流量到canary版本,而与canary部署的大小无关,或者根据请求的内容将流量发送到特定版本
- Istio的所有路由规则和控制策略都基于kubernetes CRD实现,这包括网络功能相关的VirtualService、DestinationRule、Gateway、ServiceEntry和EnvoyFilter等;
Istio流量治理的关键配置
- Istio通过Ingress Gateway为网格引入外部流量;
- Gateway中运行的主程序为Envoy,它同样从控制平面接收配置,并负责完成相关的流量传输;
- 换言之,Gateway资源对象用于将外部访问映射到内部服务,它自身值负责通信子网的相关功能,例如套接字,而七层路由功能则由VirtualService实现;
- Istio基于ServiceEntry资源对象将外部服务注册到网格内,从而将外部服务以类同内部服务一样的方式进行访问治理;
- 对于外部服务,网格内Sidecar方式运行的Envoy即能执行治理;
- 若需要将外出流量收束于特定几个节点时则需要使用专用的Egress Gateway完成,并基于此Egress Gateway执行相应的流量治理;
- VirtualService和DestinationRules是Istio流量路由功能的核心组件
- VirtualService用于将分类流量并将其路由到指定的目的地(Destination),而Destination Rules则用于配置那个指定Destination如何处理流量
- VirtualService
- 用于在Istio及其底层平台(例如kubernetes)的基础上配置如何将请求路由到网格的各Service之上
- 通常由一组路由规则(routing rules)组成,这些路由规则按顺序进行评估,从而使Istio能够将那些对VirtualService的每个给定请求匹配到网格内特定的目标之上
- 事实上,其定义的是分发给网格内个Envoy的VirtualService和Route的相关配置
- Destination Rules
- 定义流量在目标内部的各端点之间的分发机制,例如将各端点进行分组,分组内端点间的流量均衡机制,异常探测等;
- 事实上,其定义的是分发给网络内各Envoy的Cluste的相关配置
- VirtualService
-
VirtualService定义虚拟主机及相关的路由规则,包括路由至哪个目标(集群或子集)
-
DestinationRule定义集群或子集内部的流量分发机制
VirtualService和DestinationRule
配置Istio流量治理
-
流量治理基础
-
集群外部的入站流量会经由Ingress Gateway到达集群内部
-
需要经由Gateway定义Ingress Gateway上的“虚拟主机”
-
包括目标流量访问的“host”,以及虚拟主机监听的端口等
-
-
集群内部的流量仅会在Sidecar之间流动
-
VirtualService为Sidecar Envoy定义Listener(主要定义流量路由机制等)
-
DestinationRule为Sidecar Envoy定义Cluster(包括发现端点等)
-
-
网格流量治理和服务发现
-
网格内服务发送和接收的所有流量(Data Plan流量——都要经由Envoy代理进行
- 绑定到服务的所有流量都会通过Sidecar Envoy自动进行重新路由
- Istio借助于服务注册中心完成服务发现
- Istio自身并不进行服务发现功能,它需要借助于服务注册中心发现所有的Service及相应的各Endpoint
- Istio还假设服务的新实例会自动注册到服务注册表,并且会自动删除不健康的实例
- kubernetes、Mesos等平台能够为基于容器的应用程序提供服务发现功能,另外也存在大量针对基于VM的应用程序的解决方案
- kubernetes系统上,Istio会将网格中的每个Service的端口创建为Listener,而其匹配到的Endpoint将组合成为一个Cluster
- 这些Endpoint和Cluster将配置在网格内的每个sidecar Envoy之上
- 对于某个特定Sidecar Envoy来说,仅其自身所属的Service生成的Listener为Inbound Listener,而所有Service生成Listener都将配置为其上的Outbound Listener
- Inbound Listener:接收其所属Service的部分或全部流量
- Outbound Listener:代理本地应用访问集群内的其它服务
- 进出应用的所有流量都将被Sidecar Envoy拦截并基于重定向的方式进行处理
参考文档
流量管理:https://istio.io/latest/docs/reference/config/networking/
标签:VirtualService,Envoy,Istio,流量,网格,治理,路由 From: https://www.cnblogs.com/wangguishe/p/16806540.html