流量控制资源有:DestinationRule、VirtualService、Gateway、ServiceEntry、EnvoyFilter,主要用于控制服务的路由,控制集群出入口的流量等功能。下面分别介绍。
(1)DestinationRule
DestinationRule定义了流量路由规则匹配后流量的访问策略。在这些策略中可以定义负载均衡、连接池大小,以及负载均衡池中不健康实例的探测和实例的摘除规则等。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews-destination
spec:
host: reviews.prod.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
(2)VirtualService
VirtualService定义了一系列的流量路由规则,将流量路由到指定的目标服务或者目标服务的子版本。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews.prod.svc.cluster.local
http:
- match:
- uri:
prefix: "/wpcatalog"
- uri:
prefix: "/consumercatalog"
rewrite:
uri: "/newcatalog"
route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v2
- route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v1
(3)Gateway
Gateway用于配置服务网格流量的边界负载均衡器,负责接收进入服务网格和流出服务网格的HTTP/TCP连接。用于定义一系列应该开放的端口及其协议。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
(4)ServiceEntry
ServiceEntry用于添加额外的注册条目到Istio内部的注册中心,以此来满足服务网格里自动发现的服务访问或者路由到这些手动指定的服务,这可以把外部服务导入网格内部。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-svc-mongocluster
spec:
hosts:
- mymongodb.somedomain # not used
addresses:
- 192.192.192.192/24 # VIPs
ports:
- number: 27018
name: mongodb
protocol: MONGO
location: MESH_INTERNAL
resolution: STATIC
endpoints:
- address: 2.2.2.2
- address: 3.3.3.3
(5)EnvoyFilter
EnvoyFilter描述了Envoy代理特有的过滤配置,这些配置可用于定制Envoy代理,改变Istio配置的Envoy代理的行为。使用这个特性时要非常的小心,因为错误的配置可能会破坏整个服务网格的稳定性。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: httpbin
spec:
workloadLabels:
app: httpbin
filters:
- listenerMatch:
portNumber: 8000
listenerType: SIDECAR_INBOUND
filterName: envoy.lua
filterType: HTTP
filterConfig:
inlineCode: |
function envoy_on_request(request_handle)
request_handle:headers():add("X-Foo", "bar")
end
function envoy_on_response(response_handle)
body_size = response_handle:body():length()
response_handle:headers():add("X-Response-Body-Size", tostring(body_size))
end