3.1 Istio流量治理的原理
在控制面会经过如下流程:
(1)管理员通过命令行或API创建流量规则;
(2)Pilot将流量规则转换为Envoy的标准格式;
(3)Pilot将规则下发给Envoy。
在数据面会经过如下流程:
(1)Envoy拦截Pod上本地容器的Inbound流量和Outbound流量
(2)在流量经过Envoy时执行对应的流量规则,对流量进行治理。
3.1.1 负载均衡
Istio当前支持的主要负载均衡算法包括:轮询、随机、和最小连接数法。
3.1.2 服务熔断
熔断是为了防止意外导致的系统整体不可用,最典型的是防止故障级联发生,防止故障蔓延导致系统整体性能下降或雪崩。
熔断三个状态:
熔断关闭:服务可以访问。维护访问失败计数器。
熔断开启:服务不可以访问。若有访问,立即出错。
熔断半开启:到达一定隔离时间,允许对服务尝试请求,若成功则表示故障解决;否则说明故障依然存在。
1. Hystrix熔断:Spring Cloud使用的是Hystrix。
2. Istio熔断:Istio中也提供了连接池(连接池管理)和故障实例隔离(异常点检测)的能力。
Istio 1.1的V1alpha3接口中,CircuitBreaker功能被拆分ConnectionPoolSetting和OutlierDetection这两种配置。
解决的问题:
(1)Istio中通过限制某个客户端对目标服务的连接数、访问请求等,避免对一个服务的过量访问。还会限制重试次数(连接池管理)。(当请求不超过最大连接数,则连接;如果不超过最大等待数,则等待;如果超过,则直接拒绝)
(2)某个服务实例频繁超时或者出错,则将实例隔离,避免影响整个服务(异常点检测)。(异常的服务实例会被从负载均衡池中剔除,恢复的话会被重新加入进来)。
二者最大的区别是对业务代码的入侵;以及对java的依赖。
3.1.3 故障注入
在代码中故意注入异常,测试健壮性和应对故障的能力。
Istio可以注入指定的HTTP Code错误;可以注入一个指定的延时;也可以对某种特定的请求注入故障。
3.1.4 灰度发布
新老版本同时在线,新版本只是切少量流量,确认没问题后,逐渐切到新版本。以下是几种典型的场景:
1. 蓝绿发布:新版本部署在另一套独立的资源上,新版本可用后,所有流量切到新版本,删除老版本,如果新版本有问题,再快速的全部切换回去。升级快,热部署,但是资源浪费多,并且一旦新版本有问题,所有用户受影响。
2. AB测试:同时部署A和B两个对等的版本接收流量,收集用户反馈,通过分析来决定用哪个版本。
3. 金丝雀发布:一部分人切换到新版本,没问题之后再增加用户到新版本。
灰度发布的方式:
1. 基于负载均衡器的灰度发布:(只能对入口的服务进行灰度发布;不支持对后端服务单独做灰度发布)。
2. 基于Kubernetes的灰度发布:(用POD数量的比例来实现灰度发布)。这种方式太粗粒度了,功能低下。
3. 基于Istio的灰度发布: 没有单独的灰度发布的规则定义,灰度发布只是流量治理规则的一种典型应用。
比如对V1分配80%流量;对V2分配20%流量。
根据操作系统、浏览器、Headers等作为灰度发布的特征条件。
3.1.5 服务访问入口(暴露服务)
A. Kubernetes服务的访问入口:
当我们使用k8s集群部署好应用的Service时,默认的Service类型是ClusterIP,这种类型只有 Cluster 内的节点和 Pod 可以访问。如何将应用的Service暴露给Cluster外部访问呢,Kubernetes 提供了多种类型的 Service,如下
Kubernetes的三种外部访问方式:
NodePort: 在所有节点(虚拟机)上开放一个特定端口(30000–32767),任何发送到该端口的流量都被转发到对应服务。
LoadBalancer: 如果你想直接发布服务,这是默认方式使用LoadBalancer发布的每个服务都会有一个自己的IP地址.
Ingress: “智能路由”
B. Istio服务访问入口:Istio通过gateway访问网格内的服务。
网格入口的配置通过定义一个Gateway的资源对象描述。Gateway只做四层到六层的端口、TLS配置等基本功能,VirtualService则定义七层路由等丰富内容。
3.1.6 外部接入服务治理
在k8s结合的场景下,使用ServiceCatalog的扩展机制可以方便的在集群中管理云服务商提供的第三方服务。
在Istio中,通过一个ServiceEntry的资源对象将网格外的服务注册到网格上,然后像对网格内的普通服务一样对网格外服务访问进行治理。ServiceEntry是Istio推荐使用的方式,当然也可以选择不做治理。
有时需要Egress Gateway来支持,将所有的出口流量转发到Gateway上进行管理。
3.2 Istio路由规则配置:VirtualService
VirtualService是Istio流量治理的一个核心配置
3.2.1 路由规则配置实例
Istio的配置都是通过K8s的CRD方式表达的。
3.2.2 路由规则定义
VirtualService(虚拟服务)定义了对特定目标服务的一组流量规则。将满足条件的流量都转发到对应的服务后端,这个服务后端可以是一个服务,也可以是在DestinationRule中定义的服务子集。
(1) :hosts: 流量的发送目标。
(2) :gateways: 表示应用这些流量规则的gateway。
(3): http:
(4):tls:
(5)tcp:
(6)exportTo: 跨namespace
3.2.3 HTTP路由(HTTPRoute)
HTTP是当前最通用、内容最丰富的协议,控制也最多,是Istio上支持最完整的一种协议。
1:HTTPRoute规则解析
满足HTTPMatchRequest条件的流量都被路由到HTTPRouteDestination, HTTPRedirect, HTTPRewrite , HTTPRetry, HTTPFaultInjection, CorsPolicy策略等。
HTTP规则不仅可以做路由匹配,还可以做一些写操作来修改请求本身。
2:HTTP匹配规则(HTTPMatchRequest)
URI = scheme: [//authority]path[?query][#fragment]
3: HTTP路由目标(HTTPRouteDestination)
1) destionation
2) weight
3) headers
4: HTTP重定向
5: HTTP重写
6:HTTP重试
7: HTTP流量镜像: 把流量转发到原目标地址的同时将流量给另外一个目标地址镜像一份。
8: HTTP故障注入: 延迟故障注入 ; 请求终止故障注入。
9:HTTP跨域资源共享:当一个资源向该资源所在的服务器的不同域发起请求时,就会产生一个跨域的HTTP请求。出于安全原因,浏览器会限制从脚本发起的跨域HTTP请求。通过跨域资源共CORS机制可以允许Web应用服务器进行跨域访问,实现上是在HTTP header中追加一些额外的信息来通知浏览器准许跨域访问。
3.2.4 TLS路由 (TLSRoute)
3.2.5 TCP路由(TCPRoute)
3.3.6 三种协议路由规则的对比
3.3.7 VirutalService的典型应用
1:多个服务的组合:根据不同的路径,流量被分配到不同的后端服务。
2:路由规则的优先级:路由的顺序可以表达规则的优先级。
3:复杂条件路由
4:特定版本间的访问规则
3.3 Istio目标规则配置:DestinationRule
3.3.1 DestinationRule配置示例
定义服务两个版本子集v1和v2,并且对两个版本分别配置了随机和轮询的负载均衡策略(与VirtualService配合使用)。
3.3.2 DestinationRule规则定义
VirtualService: 虚拟服务,描述的是满足什么条件的流量被哪个后端处理。
DestinationRule: 请求到达后端后怎么处理。负载均衡和熔断等策略定义在DestinationRule上。
(1)host: 服务名。
(2) trafficPolicy: 规则内容的定义,包括负载均衡、连接池策略、异常点检查等。
(3) subsets:服务子集。
(4)exportTo: 跨命名空间
1. 流量策略:
2. 负载均衡策略(LoadBalancerSettings):
3. 连接池设置(ConnectionPoolSettings): 可以对TCP和HTT设置。
4. 异常实例检测设置(OutlierDetection): 熔断。
5. 端口流量策略设置(PortTrafficPolicy): 将前面4种流量策略应用到每个端口上。
6. 服务子集(Subset): 定义服务子集,定义服务的不同版本,实施不同的流量规则。
3.3.3 DestinationRule的典型应用
1 定义SubSet:
2 服务熔断:
3 负载均衡:
4 TLS认证配置:
3.4 Istio服务网关配置:Gateway
Gateway在网格边缘接收外部访问,并将流量转发道网格内部的服务。Istio通过Gateway将网格内部的服务发布成外部可以访问的服务。还可以 通过Gateway配置外部访问的端口、协议以及与内部服务的映射关系。
3.4.1 Gateway配置示例
3.4.2 Gateway规则定义
Gateway一般和Virtual Service配置使用。Gateway定義了服務從从外面怎样访问;VirutalService定义了匹配的内部服务怎么流转。
Gateway有如下两个关键字段:
selector: Gateway负载。
server: 开放的服务列表。
1. 后端服务Server:
(1) port: 服务在哪个端口对外开放。是对外监听的端口。
(2) hosts: 为gateway发布的服务地址。
(3) defaultEndpoint: 流量转发的默认后端
(4) tls:
2.TLS选项TLSOptions
3.4.3 Gateway的典型应用
1. 将网格内部的HTTP服务发布为HTTP外部访问
2. 将网格内部的HTTPS服务发布为HTTP外部访问
3. 将网格内的HTTP服务发布为HTTPS外部访问
4. 将网格内的HTTP服务发布为双向的HTTPS外部访问
5. 将网格内的HTTP服务发布为HTTPS外部访问和HTTPS内部访问。
istio可以透明地给网格内的服务启用双向TLS,自动维护证书和秘钥。
3.5 istio外部服务配置:ServiceEntry
将网格外的服务加入网格中进行管理。
3.5.1 ServiceEntry配置示例
3.5.2 ServiceEntry规则的定义和用法
3.5.3 ServiceEntry的典型应用
3.6 Istio代理规则配置:Sidecar
istio在1.1版本中引入的。可以配置外部服务的DNS域名、VIP、端口、协议和后端地址等。istio里,envoy正式先拦截到工作负载的inbound流量和Outbound流量,才能执行服务间访问的治理。Istio在1.1版本中引入的sidecar资源对象可以更精细地控制Envoy转发和接收的端口、协议等。
3.6.1 Sidecar配置示例
3.6.2 Sidecar规则定义
3.7 本章总结