5.1 部署Istio

上一章

5.2.2 请求配额

下一章

更多图书

5.2 常用资源类型

5.2.1 流量控制

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