VirtualHost

  • VirtualHost
  • 几个关键术语
  • Service:服务注册表上用于标识一组应用实例的独立单元,列如Kubernetes上的Service资源对象
  • Service Version:Service的一至多个版本(通常称为subset),通常表现为CD场景中,同时运行着的同一应用的不版本的实例组合,用于支撑实现A/B测试、Canary发布等,以及相应的流量分配机制;
  • Host:客户端请求报文中的“主机”,用于支撑基于虚拟主机的流量过滤;
  • VirtualHost的定义:一组关乎到特定“主机(客户端访问的目标地址或主机名)”的流量路由规则

Istio VirtualService_字段

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配置生效示意图

Istio VirtualService_字段_02

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

Istio VirtualService_url重写_03

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/​