Istio VirtualService

VirtualHost

  • VirtualHost

    • 几个关键术语

      • Service:服务注册表上用于标识一组应用实例的独立单元,列如Kubernetes上的Service资源对象

      • Service Version:Service的一至多个版本(通常称为subset),通常表现为CD场景中,同时运行着的同一应用的不版本的实例组合,用于支撑实现A/B测试、Canary发布等,以及相应的流量分配机制;
      • Host:客户端请求报文中的“主机”,用于支撑基于虚拟主机的流量过滤;

    • VirtualHost的定义:一组关乎到特定“主机(客户端访问的目标地址或主机名)”的流量路由规则

VirtualService配置要点

  • VirtualService的关键字段
    • hosts: 必选字段,用于指定流量请求的目标,可以是一个DNS名称或IP地址;

      • DNS名称可以使用通配符,也可以使用短格式的Service名称;

    • gateways:指定应用流量规则的Gateway资源,在VirtualService上使用gateways字段时遵循如下规则

      • 仅应用于网格内的东西流量时,应省略gateways字段;

      • 仅用于引入网格外的流量,为gateways字段赋予合适的值(Gateway名称列表)即可

        • 客户端源自网格外部

        • Gateway负责接入这部分流量,VirtualService负责将这部分流量完成在网格内的路由

      • 同时用于网格内和网格外的流量时,需要将gateways字段的列表值的其中一项指定为“mesh”

        • 客户端既可源自网格外部,也可以是网格内部的流量

    • http: 配置http协议的流量管理机制的有序列表,其配置框架称为HTTPRoute

    • tls:用于处理非终结的TLS和HTTPS流量的有序列表,其配置框架称为TLSRoute

    • tcp:管理四层的TCP流量的有序列表,其配置框架称为TCPRoute

VirtualService配置生效示意图

HTTP路由配置(HTTPRoute)

  • virtualservice.http配置如何处理http流量

    • 服务的端口协议是HTTP、HTTP2和GRPC,即在服务的端口名中包含http-、http2-和grpc-等;

    • Gateway的端口协议是HTTP、HTTP2和GRPC,或者Gateway终结了TLS;

    • ServiceEntry的端口协议是HTTP、HTTP2和GRPC;

  • 路由机制及服务韧性等相关的配置,即满足HTTPMatchRequest条件的流量可以做如下处理

    • 路由到指定目标(HTTPRouteDestination)

    • 执行重定向(HTTPRedirect)

    • URL重写(HTTPRewrite)

    • 请求重试(HTTPRetry)

    • 故障注入(HTTPFaultInjection)

    • 跨站资源引用(CorsPolicy)

VirtualService and HTTPRoute CRD

HTTPRoute配置示例

示例一

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v2

url重写示例

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: rewrite
    match:
    - uri:
        prefix: /canary
    rewrite:
      uri: /
    route:
    - destination:
        host: demoapp
        subset: v11
  - name: redirect
    match:
    - uri:
        prefix: "/backend"
    redirect:
      uri: /
      authority: backend
      port: 8082
  - name: default
    route:
    - destination:
        host: demoapp
        subset: v10

fault-injection示例

kind: VirtualService
metadata:
  name: demoapp
spec:
  hosts:
  - demoapp
  http:
  - name: canary
    match:
    - uri:
        prefix: /canary
    rewrite:
      uri: /
    route:
    - destination:
        host: demoapp
        subset: v11
    fault:
      abort:
        percentage:
          value: 20
        httpStatus: 555
  - name: default
    route:
    - destination:
        host: demoapp
        subset: v10
    fault:
      delay:
        percentage:
          value: 20
        fixedDelay: 3s

参考文档

https://istio.io/latest/zh/docs/reference/config/networking/virtual-service/

posted @ 2022-10-26 15:15  小吉猫  阅读(372)  评论(0编辑  收藏  举报