istio 的基本概念: DestinationRule

DestinationRule 是转发策略,在 route 规则之后起作用,相当于 nginx 中的负载均衡策略。它作用于 VirtualService 的 destination 中的同名的 host。

将 Pod 按照 label 分组,分别设置转发策略

下面的 DestinationRule 作用于 my-svc,影响到 my-svc 的请求的分配策略。

设置了全局的转发策略(subsets 以外的配置),同时将 my-svc 的 pod 按照 label 分成了三组,单独设置了每组的转发策略(subnets 内的配置):

apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-destination-rule spec: host: my-svc trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 trafficPolicy: loadBalancer: simple: ROUND_ROBIN - name: v3 labels: version: v3
  • host 指定作用的服务,与 VirtualService 的 Destination 中的 host 配对
  • subsets 中的的转发策略覆前面 subsets 外的同名配置
  • subsets 中没有的配置,使用 subsets 外的配置

subsets 中 labels 的作用是筛选 pod,上面的配置将 my-svc 的 pod 按照 label 分成了 v1、v2、v3 三组,为每组单独设置转发策略。

将请求按照端口分组,分别设置转发策略

除了按照 pod 分组,还可以按目的端口分组,为每个端口设置转发策略:

apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: bookinfo-ratings-port spec: host: ratings.prod.svc.cluster.local trafficPolicy: # Apply to all ports portLevelSettings: - port: number: 80 loadBalancer: simple: LEAST_CONN - port: number: 9080 loadBalancer: simple: ROUND_ROBIN

Destination Rule 的详情见 Destination Rule

在 VirtualService 中使用 DestinationRule

在 VirtualService 中指定 destination 时,引用 destination 中的 subset,如下:

apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route namespace: foo spec: hosts: - reviews # interpreted as reviews.foo.svc.cluster.local http: - match: - uri: prefix: "/wpcatalog" - uri: prefix: "/consumercatalog" rewrite: uri: "/newcatalog" route: - destination: host: reviews # interpreted as reviews.foo.svc.cluster.local subset: v2 - route: - destination: host: reviews # interpreted as reviews.foo.svc.cluster.local subset: v1

参考