通过流量标签CRD(TrafficLabel) 定义了用户自定义的流量标签, 例如asm-labels-test,其取值范围为test1、test2、test3等。为支持基于标签的路由能力, 还需要创建相应的目标规则DestinationRule和虚拟服务VirtualService,才能将流量根据标签路由到对应的工作负载。
定义目标规则和虚拟服务
保存以下内容为文件dr-productpage.yaml。使用以下内容将productpage分为test1 、test2 、test3等子集。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: dr-productpage spec: host: productpage subsets: - name: test1 labels: version: test1 - name: test2 labels: version: test2 - name: test3 labels: version: test3 ... - name: testn labels: version: testn - name: base labels: version: base
执行以下命令,创建目标规则DestinationRule。
kubectl apply -f dr-productpage.yaml
- 保存以下内容为文件vs-productpage.yaml。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: vs-productpage
spec:
hosts:
- productpage
http:
- match:
- headers:
asm-labels-test:
exact: test1
route:
- destination:
host: productpage
subset: test1
- match:
- headers:
asm-labels-test:
exact: test2
route:
- destination:
host: productpage
subset: test2
- match:
- headers:
asm-labels-test:
exact: test3
route:
- destination:
host: productpage
subset: test3
- route:
- destination:
host: productpage
subset: base
其中, match.headers和route.destination.subset决定了将流量根据标签值路由到对应的工作负载,例如将带有名称为asm-labels-test且值为test1的标签的请求路由到test1子集下的工作负载。
具体参数解释如下:
参数 | 描述 |
---|---|
match.headers.asm-labels-test | 流量标签名称。 |
match.headers.exact | 流量标签值。 |
route.destination.subset | 路由目标对应的目标工作负载所在的子集(Subset)。 |
- 执行以下命令,创建虚拟服务VirtualService。
kubectl apply -f vs-productpage.yaml
简化虚拟服务的定义
若工作负载的版本有很多个的时候,虚拟服务VirtualService的配置将会变得比较复杂,您可以使用以下内容简化它的定义,并且对流量降级。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: vs-productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: $asm-labels-test
扩展虚拟服务定义支持流量降级
此外, ASM企业版支持了对目标服务不可用时提供了流量降级的功能。其中fallback参数定义在route参数下, 用于定义当上述标签路由的目标服务不可用(包括目标服务未定义、或对应的Pod不存在等情况)时回退到的备用服务。
具体字段定义说明如下:
参数 | 描述 |
---|---|
target.host | 路由的目标服务名称 |
target.subset | 路由的目标服务的子集。 |
示例定义如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: vs-productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: $asm-labels-test
fallback:
target:
host: productpage
subset: base