Sidecar这个全新的资源对象是Istio在1.1版本中引入的,用于对Istio数据面的行为进行更精细的控制。
如下所示配置了一组基于命名空间描述的 Egress,定义了 weather 这个命名空间下的Sidecar只可以访问istio-system和news两个命名空间下的服务:
我们知道,在Istio里Envoy正是先拦截到工作负载的Inbound流量和Outbound流量,才能执行服务间访问的治理。Istio 在 1.1 版本中引入的 Sidecar 资源对象可以更精细地控制Envoy转发和接收的端口、协议等,并可以限制Sidecar Outbound流量允许到达的目标服务集合。如图3-61所示是Sidecar的规则定义。
图3-61 Sidecar的规则定义
在Sidecar上主要通过三个字段来描述规则。
(1) workloadSelector:表示工作负载的选择器。Sidecar 的配置可以使用workloadSelector应用到命名空间下的一个或者多个负载,如果未配置 workloadSelector,则应用到整个命名空间。每个命名空间都只能定义一个没有workloadSelector的Sidecar,表示对命名空间的全局配置。
如下所示为在weather这个命名空间下app标签匹配forecast服务的工作负载标签:
(2)egress:是一种 IstioEgressListener 类型,可用来配置 Sidecar 对网格内其他服务的访问,如果没有配置,则只要命名空间可见,命名空间里的服务就都可以被访问。
IstioEgressListener通过如下几个字段来描述规则。
◎ port:监听器关联的端口,被设定后会作为主机的默认目标端口。
◎ bind:监听器绑定的地址。
◎ captureMode:配置如何捕获监听器的流量,可以有DEFAULT、IPTABLES、NONE三种模式。DEFAULT表示使用环境默认的捕获规则;IPTABLES指定基于iptabels的流量拦截;NONE表示没有流量拦截。
◎ hosts:是一个必选字段,表示监听器的服务,为“namespace/dnsName”格式。dnsName需要为FQDN格式,可以对namespace、dnsName使用通配符。
如下所示,对于istio-system命名空间下的所有Outbound流量,Sidecar都会进行转发;对于命名空间weather下的服务,Sidecar只转发目标是3002端口的流量:
(3)ingress:IstioIngressListener类型,配置 Sidecar对应工作负载的 Inbound流量。IstioIngressListener字段和IstioEgressListener字段有点像,但语义不同。
◎ port:必选字段,监听器关联的端口。
◎ bind:监听器绑定的地址。
◎ captureMode:配置如何捕获监听器的流量,该模式的取值同 IstioEgressListener上的对应字段。
◎ defaultEndpoint:必选字段,为流量转发的目标地址。
如下所示为在命名空间weather下匹配forecast负载的Sidecar规则,允许其接收来自3002端口的HTTP流量,并且将请求转发到127.0.0.1:3012上。这种方式用在自动流量拦截功能不可用,即未能初始化iptables规则时,通过Sidecar的这种配置可以将流量转发到本地负载的3012端口: