当服务有多个版本,而我们只希望把流量全部转发到某个特定版本,这时候可以使用如下的方式配置路由规则:
1 apiVersion: networking.istio.io/v1alpha3 2 kind: DestinationRule 3 metadata: 4 name: service-lua 5 spec: 6 host: service-lua 7 subsets: 8 - name: v1 9 labels: 10 version: v1 11 - name: v2 12 labels: 13 version: v2 14 --- 15 apiVersion: networking.istio.io/v1alpha3 16 kind: VirtualService 17 metadata: 18 name: service-lua 19 spec: 20 hosts: 21 - service-lua 22 http: 23 - route: 24 - destination: 25 host: service-lua 26 subset: v1
第1~13行定义了名为service-lua的DestinationRule,version标签用于区分service-lua服务的实例版本,host字段表示要访问的后端的服务名称,一般为Kubernetes中定义的Service名称。字段host的值完整地址为service-lua.default.svc.cluster.local,当路由规则配置与要请求的服务在同一个命名空间时,可以只简写成Service的名称。
第15~26行定义名为service-lua的VirtualService,表示对service-lua服务的所有请求转发到v1版本,此处的v1为DestinationRule中定义的名为v1的subset,hosts字段表示接收请求的域名,一般为Kubernetes中定义的Service名称。host字段的值与对应DestinationRule中的host字段值保持一致。
【实验】
1)创建Gateway和service-js的路由规则:
$ kubectl apply -f istio/route/gateway-js-v1.yaml
2)创建service-lua的指定版本路由规则:
$ kubectl apply -f istio/route/virtual-service-lua-v1.yaml
3)浏览器访问。
此时打开浏览器访问http://11.11.11.112:31380/ ,并多次点击“发射”,你会看到service-lua服务只会请求到v1版本。
4)清理:
$ kubectl delete -f istio/route/gateway-js-v1.yaml $ kubectl delete -f istio/route/virtual-service-lua-v1.yaml