前言:
Istio通过“虚拟服务”和“目标规则”设置动态路由。
1. 目标
将请求指向Reviews-v1(目前是轮询的指向Reviews-v1、Reviews-v2、Reviews-v3)
2. 操作步骤
1. 创建虚拟服务
脚本官方提供了,执行就可以,命令:kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
执行完毕后,可以看到为应用创建了4个不同的虚拟服务,一会再看他们的具体内容
2. 配置目标规则
直接使用官方提供的目标规则就可以,命令:kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
执行完毕后,可以看到为每个虚拟服务都定义了一个目标规则
浏览器验证下是否生效 http://192.168.61.199:32697/productpage,经多次刷新,固定在了Reviews-v1
3.探究“虚拟服务”和“目标规则”的配置项
4. 配置分析
1.虚拟服务配置如下
配置清单一共创建了4个虚拟服务,分别对应4个service,重点分析reviews这个虚拟服务(14L-25L)
分析:reviews没有定义match,意味着任何流量都允许访问;路由的地址直接是reviews这个服务的地址,指向的子集是v1
apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: productpagespec:hosts:- productpagehttp:- route:- destination:host: productpagesubset: v1---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: reviewsspec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v1---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: ratingsspec:hosts:- ratingshttp:- route:- destination:host: ratingssubset: v1---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: detailsspec:hosts:- detailshttp:- route:- destination:host: detailssubset: v1---
2.目标规则配置如下
下面的配置清单对4个不同的服务分别定义了具体的子集,,重点分析reviews这个目标规则(12L-27L)
分析:因为reviews有3个版本,所以子集定义了3个。上面定义的虚拟服务就是根据在这里定义的子集来指向对应的版本
apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: productpagespec:host: productpagesubsets:- name: v1labels:version: v1---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: reviewsspec:host: reviewssubsets:- name: v1labels:version: v1- name: v2labels:version: v2- name: v3labels:version: v3---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: ratingsspec:host: ratingssubsets:- name: v1labels:version: v1- name: v2labels:version: v2- name: v2-mysqllabels:version: v2-mysql- name: v2-mysql-vmlabels:version: v2-mysql-vm---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: detailsspec:host: detailssubsets:- name: v1labels:version: v1- name: v2labels:version: v2---
5. “虚拟服务”和“目标规则”的场景
- 按服务的版本进行路由
- 按比例切分流量(比如灰度发布这种)
- 根据匹配规则进行路由(通过match字段)
- 在目标规则中定义各种策略(负载均衡、连接池设置等)
