istio 的流出流量管控

Engress Control 不是 istio 的基本概念,而是一种用法。

istio 不仅能够管控从外部流入的流量(通过 Service Entry,也可以管控流出的流量。流出流量的管控复杂一些,同时用到 VirtualServiceServiceEntryGateway

基本思路:

  • 将外部的服务封装成一个 ServiceEntry
  • 创建一个 Gateway,绑定 engress envoy
  • 创建一个 VirtualService,将网格内对外部服务请求的转发到 engress envoy
  • engress envoy 将收到的请求转发到 ServiceEntry(即外部服务)

将外部服务封装成 ServiceEntry

封装后的外部服务在网格内的名称是 httpbin.com

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-httpbin
  namespace : egress
spec:
  hosts:
  - httpbin.com
  exportTo:
  - "."
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS

外部服务的封装方法有多中,见 ServiceEntry)。

创建接收外出流量的 Gateway

创建 Gateway,指示边界的 engress envoy 监听 80 端口,这里选定带有 "istio: egressgateway" 标签的边界 envoy,与接收外部请求的 envoy 区分开:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: istio-egressgateway
 namespace: istio-system
spec:
 selector:
   istio: egressgateway
 servers:
 - port:
     number: 80
     name: http
     protocol: HTTP
   hosts:
   - "*"

创建包含转发规则的 VirtualService

创建 hosts 为 httpbin.com 的 VirtualService,绑定 mesh 和前面创建的 istio-egressgateway:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gateway-routing
  namespace: egress
spec:
  hosts:
  - httpbin.com
  exportTo:
  - "*"
  gateways:
  - mesh
  - istio-egressgateway
  http:
  - match:
    - port: 80
      gateways:
      - mesh
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
  - match:
    - port: 80
      gateways:
      - istio-egressgateway
    route:
    - destination:
        host: httpbin.com

http 中的 两个 match 对应两个转发规则,针对的都是 host 为 httpbin.com 的请求:

  • 第一个规则:网格内发起的请求(绑定了 mesh),转发到 istio-egressgateway.istio-system.svc.cluster.local,这个域名是 istio-egressgateway 选择的边界 envoy 在 kubernetes 中的地址,发送到这个地址就是发送到 istio-egressgateway。

  • 第二个规则:istio-egressgateway 的 80 端口收到的请求 ,即边界 envoy 接收到的请求(第一个规则设置的从网格内部转来的流量),转发给外部服务 httpbin.com。

在上面两个规则的作用下,从网格内发起的请求先转发给边界 envoy,再由边界 envoy 将转发给外部的 httpbin.com,实现了对 外出流量 的流量集中管控,engress envoy 相当于一个代理服务器。

参考

  1. 李佶澳的博客