前面介绍了Istio如何完成流量劫持,此篇博客将介绍Istio中如何配置VirtualService、Gateway、DestinationRule来完成流量管理。还是先从理论开始,先看看VirtualService、Gateway、DestinationRule的概念。
VirtualService:在Istio服务网格中定义路由规则
DestinationRule:在VirtualService路由生效后,配置应用与请求的策略集
ServiceEntry:通常用于在Istio服务网格之外启用对服务的请求
Gateway:为HTTP/TCP流量配置负载均衡器,最常见的是在网格的边缘的操作,以启用应用程序的入口流量。Istio中gateway分为IngressGateway和EgressGateway,分别管理进来的流量和出去的流量。下面是对上面3个对象配置中的各个字段含义解析。
VirtualService字段名称 | 字段说明 |
spec.hosts | 定义路由规则关联一组的 hosts,可以是带有通配符的 DNS 名称或者 IP 地址(IP 地址仅能应用于来源流量为边缘代理网关)。该字段能应用于 HTTP 和 TCP 流量。在 Kubernetes 环境中,可以使用 service 的名称作为缩写,Istio 会按照 VirtualService所在 namespace 补齐缩写,例如在 default namespace 的 VirtualService 包含 host 缩写 reviews 会被补齐为 reviews.default.svc.cluster.local。为避免误配置,推荐填写 host 全称 |
spec.gateways | 定义应用路由规则的来源流量,可以是一个或多个网关,或网格内部的 sidecar,指定方式为 <gateway namespace>/<gateway name>,保留字段 mesh 表示网格内部所有的 sidecar,当该参数缺省时,会默认填写 mesh,即该路由规则的来源流量为网格内部所有 sidecar |
spec.http | 定义一组有序的(优先匹配靠前的路由规则)应用于 HTTP 流量的路由规则,HTTP 路由规则会应用于网格内部的 service 端口命名为 http-, http2-, grpc- 开头的流量以及来自 gateway 的协议为 HTTP, HTTP2, GRPC, TLS-Terminated-HTTPS 的流量 |
spec.http.match | 定义路由的匹配规则列表,单个匹配规则项内所有条件是且关系,列表中多个匹配规则之间为或关系 |
spec.http.route | 定义路由转发目的地列表,一条 HTTP 路由可以是重定向或转发(默认),转发的目的地可以是一个或多个服务(服务版本)。同时也可以配置权重、header 操作等行为 |
spec.http.redirect | 定义路由重定向,一条 HTTP 路由可以是重定向或转发(默认),如规则中指定了 passthrough 选项,route、redirect 均会被忽略。可将 HTTP 301 重定向到另外的 URL 或 Authority |
spec.http.rewrite | 定义重写 HTTP URL 或 Authority headers,不能与重定向同时配置,重写操作会在转发前执行 |
spec.http.timeout | 定义 HTTP 请求的超时时间 |
spec.http.retries | 定义 HTTP 请求的重试策略 |
spec.http.fault | 定义 HTTP 流量的故障注入策略,开启时超时和重试策略不会开启 |
spec.http.mirror | 定义将 HTTP 流量复制到另一个指定的目的端,被复制的流量按照“best effort”原则,sidecar/网关不会等待复制流量的响应结果就会从源目的端返回响应。镜像流量的目的服务端会产生监控指标。 |
spec.http.mirrorPercent | 定义流量镜像的复制百分比,缺省时复制100%的流量。最大值为100 |
spec.http.corsPolicy | 定义 CORS 策略(跨域资源共享,Cross-Origin Resource Sharing,CORS),更多关于 CORS 的介绍请参见 CORS,关于 Istio |