前言:
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/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
2.目标规则配置如下
下面的配置清单对4个不同的服务分别定义了具体的子集,,重点分析reviews这个目标规则(12L-27L)
分析:因为reviews有3个版本,所以子集定义了3个。上面定义的虚拟服务就是根据在这里定义的子集来指向对应的版本
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productpage
spec:
host: productpage
subsets:
- name: v1
labels:
version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ratings
spec:
host: ratings
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v2-mysql
labels:
version: v2-mysql
- name: v2-mysql-vm
labels:
version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: details
spec:
host: details
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
5. “虚拟服务”和“目标规则”的场景
- 按服务的版本进行路由
- 按比例切分流量(比如灰度发布这种)
- 根据匹配规则进行路由(通过match字段)
- 在目标规则中定义各种策略(负载均衡、连接池设置等)