流量控制资源有: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