流量管理
Istio中对流量管理的两个基本的CRD对象是VirtualService和DestinationRule。下面通过一个例子来简要说明一下这两种对象的作用。
假设有一个服务webservice,包含了一些pod,这些pod分成两组,其中一部分pod带有app:v1的label,而另一部分pod带有app:v2的label。这两个label代表了这个服务的两个不同的版本。
我们的预期目标是将一部分流量(用户名为userA)导流到v2版本的负载,而其它流量导流到v1版本。
首先,需要使用DestinationRule来区分这些不同的pod集合,在Istio中被称为subset。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name:
spec:
host: webservice
subsets:
- name: v1subset
labels:
app: v1
- name: v2subset
labels:
app: v2
接下来需要定义一个VirtualService对象来将流量路由到对应的负载上。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvirtualservice
spec:
hosts:
- webservice
http:
- match:
- headers:
end-user:
exact: userA
route:
- destination:
host: webservice
subset: v2subset
- route:
- destination:
host: webservice
subset: v1subset
至此,可以大概看出VirtualService和DestinationRule的基本作用:
DestinationRule定义了后端负载的subset。而VirtualService则是定义流量如何被路由到指定的subset。
除了这些基本功能之外VirtualService和DestinationRule还定义了一些其特性,比如上例中VirtualService使用的是基于http协议的路由配置,除此之外还可以使用tcp的或者tls协议的路由配置。DestinationRule还可以定义后端负载的策略,默认的是轮询,也可以配置成最小连接数、随机等等策略,还可以设置tls相关的配置,具体可以参考官方手册。
Last modified July 20, 2020: Add the source files which are from mcsos/website repo (df4b91e)