istio 的转发功能使用方法

示例拆解中的 Bookinfo Application 包含了转发功能,这里简单复述下。

转发策略通过 VirtualService 设置,设置 hostname、uri 和目标服务的对应关系,目标服务可以是域名或 IP,对于同一个 namespace 内的服务,可以使用服务名称。

匹配条件中的 hosts,可以是应用的对外域名,实现对外域名到集群内服务的映射。也可以是目标服务自身,实现服务到自身的映射。

下面操作在 Bookinfo Application 的基础上进行。

外部域名到集群内服务的映射

外部域名到集群内服务的映射:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  - "bookinfo.xxx.com"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

集群内 Service 到自身的映射

集群内 Service 到自身的映射,下面的 hosts 和 host 的值都是 reviews:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1

这样可以为 reviews 设置负载均衡策略,上面的 v1 来自于 reivews 服务的 Destination:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3

VirtualService 支持的匹配规则

VirtualService 支持以下匹配规则:

譬如匹配 headers:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

参考

  1. 李佶澳的博客