> 虚拟服务(Vistrual Service)是 Istio 重要的资源对象之一,作用是将流量路由到网格中的服务。支持基于权重、http header条件等优先级的路由,比Kuberentes service对于流量的管控更加的丰富,颗粒度更加精细。
#### 有了 Kubernetes Service,为什么还需要 Istio Vistrual Service
简单来说,基于 Kubernetes Service,只可以实现简单的流量负载均衡,如果想实现基于HTTP Header,负载百分比等等复杂的流量控制就无从下手了,Istio Vistrual Service在原本 Kubernetes Service 的功能之上,提供了更加丰富的路由控制。
#### 通过例子来理解
有两个Deployment(nginx 及 httpd),通过Service关联到一起,通过访问Service只能做到简单的负载均衡,通过实验发现 nginx 和 httpd 流量各自在 50% 左右。
Deployment & Service
apiVersion apps/v1 kind Deployment metadata labels app nginx name nginx-deployment spec replicas1 selector matchLabels app nginx strategy rollingUpdate maxSurge 25% maxUnavailable 25% type RollingUpdate template metadata labels app nginx server web spec containersimage'nginx:latest' name nginx-deployment ---apiVersion apps/v1 kind Deployment metadata labels app httpd name httpd-deployment spec replicas1 selector matchLabels app httpd strategy rollingUpdate maxSurge 25% maxUnavailable 25% type RollingUpdate template metadata labels app httpd server web spec containersimage'httpd:latest' name httpd-deployment ---apiVersion v1 kind Service metadata name nginx-service spec portsport80 protocol TCP targetPort80 selector app nginx type ClusterIP ---apiVersion v1 kind Service metadata name httpd-service spec portsport80 protocol TCP targetPort80 selector app httpd type ClusterIP ---apiVersion v1 kind Service metadata name web-service spec portsport80 protocol TCP targetPort80 selector server web type ClusterIP
如果想实现更加细颗粒度的流量管控,通过引入Istio Vistrual Service 非常简单的就实现复杂的流量管理。
VirtualService 根据 Destination 进行调度,并且设置相关的负载百分比实现精准的控制。
apiVersion networking.istio.io/v1alpha3 kind VirtualService metadata name web-vs spec hosts web-service httproutedestination host nginx-service weight80destination host httpd-service weight20
通过客户端测试以上的实验,请留意客户端也必须经过 Istio 注入,因为只有客户端被 Istio 注入才可以接收到来自 Pilot 有关 Virtual Service 和 Destination Rule 的配置信息,才可以保证流量接管生效。
apiVersion apps/v1 kind Deployment metadata labels app client-deployment name client-deployment spec replicas1 selector matchLabels app client-deployment strategy rollingUpdate maxSurge 25% maxUnavailable 25% type RollingUpdate template metadata labels app client-deployment spec containersimage'busybox:latest' name client-deployment command"/bin/sh""-c""sleep 3600"
wget -q -O - web-service
#### Vistrual Service 除了权重之外,还有条件匹配
很多场景下,需要针对不同的用户已提供个性化的服务等(提前内测新版本),例如针对地理位置、是否为VIP等等,那就需要对 httpd 流量进行识别匹配。
####
apiVersion networking.istio.io/v1alpha3 kind VirtualService metadata name web-vs spec hosts web-service httpmatchheaders end-user exact carryyip uri prefix"/health" ignoreUriCasetrue routedestination host httpd-service routedestination host nginx-service
基于 HttpMatchRequest,路由规则从上到下进行优先级排序,在生产环境中建议使用一个无条件的规则作为最后规则,确保流量始终会匹配到最少一条规则,防止意外情况的方式。
路由规则从 match 关键字开始匹配,可以使用精确 exact 和 前缀 prefix 或者 正则表达式进行不同场景下的匹配。