五 Istio:使用服务网格Istio进行流量路由( 四 )

匹配精确的字符串

  • 前缀匹配:例如,prefix: "value" 只匹配前缀
  • 正则匹配:例如,regex:"value" 根据 ECMAscript 风格的正则进行匹配
  • 例如,假设请求的 URI 看起来像这样:https://dev.example.com/v1/api 。为了匹配该请求的 URI,我们会这样写:
    http: - match:- uri:prefix: /v1上述片段将匹配传入的请求,并且请求将被路由到该路由中定义的目的地 。
    另一个例子是使用正则并在头上进行匹配 。
    http: - match:- headers:user-agent:regex: '.*Firefox.*'上述匹配将匹配任何用户代理头与 Regex 匹配的请求 。
    5.2 重定向和重写请求在头信息和其他请求属性上进行匹配是有用的,但有时我们可能需要通过请求 URI 中的值来匹配请求 。
    例如,让我们考虑这样一种情况:传入的请求使用 /v1/api 路径,而我们想把请求路由到 /v2/api 端点 。
    这样做的方法是重写所有传入的请求和与 /v1/api 匹配的 authority/host headers 到 /v2/api
    例如:
    ... http:- match:- uri:prefix: /v1/apirewrite:uri: /v2/apiroute:- destination:host: customers.default.svc.cluster.local ...即使目标服务不在 /v1/api 端点上监听,Envoy 也会将请求重写到 /v2/api
    我们还可以选择将请求重定向或转发到一个完全不同的服务 。下面是我们如何在头信息上进行匹配,然后将请求重定向到另一个服务:
    ... http:- match:- headers:my-header:exact: helloredirect:uri: /helloauthority: my-service.default.svc.cluster.local:8000 ...redirectdestination 字段是相互排斥的 。如果我们使用 redirect,就不需要设置 destination
    5.3 AND 和 OR 语义在进行匹配时,我们可以使用 AND 和 OR 两种语义 。让我们看一下下面的片段:
    ... http:- match:- uri:prefix: /v1headers:my-header:exact: hello ...上面的片段使用的是 AND 语义 。这意味着 URI 前缀需要与 /v1 相匹配,并且头信息 my-header 有一个确切的值 hello
    要使用 OR 语义,我们可以添加另一个 match 项,像这样:
    ... http:- match:- uri:prefix: /v1...- match:- headers:my-header:exact: hello ...在上面的例子中,将首先对 URI 前缀进行匹配,如果匹配,请求将被路由到目的地 。如果第一个不匹配,算法会转移到第二个,并尝试匹配头 。如果我们省略路由上的匹配字段,它将总是评估为 true
    六.实战:简单流量路由6.1 简单流量路由我们将学习如何使用权重在不同的服务版本之间路由流量 。然后,我们将部署 Customers 服务版本 v2,并使用子集在这两个版本之间分配流量 。
    让我们从部署 Gateway 开始:
    apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: gateway spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'将上述 YAML 保存为 gateway.yaml,并使用 kubectl apply -f gateway.yaml 部署 Gateway 。
    接下来,我们将创建 Web Frontend 和 Customers 服务的部署以及相应的 Kubernetes 服务 。让我们首先从 web-frontend 开始:
    apiVersion: apps/v1 kind: Deployment metadata:name: web-frontendlabels:app: web-frontend spec:replicas: 1selector:matchLabels:app: web-frontendtemplate:metadata:labels:app: web-frontendversion: v1spec:containers:- image: gcr.io/tetratelabs/web-frontend:1.0.0imagePullPolicy: Alwaysname: webports:- containerPort: 8080env:- name: CUSTOMER_SERVICE_URLvalue: 'http://customers.default.svc.cluster.local' --- kind: Service apiVersion: v1 metadata:name: web-frontendlabels:app: web-frontend spec:selector:app: web-frontendports:- port: 80name: httptargetPort: 8080

    经验总结扩展阅读