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

参考