使用 Sidecar CRD 优化 Istio 性能

我们知道在服务网格集群中的每个工作负载实例上都会透明地注入一个 Istio sidecar 代理,这个代理拦截负载的出入流量 , 并根据配置完成相应的流量管理,包括流量、安全、可观测性等等 。为了更加细粒度的控制代理的行为 , 从 1.1 版本开始 Istio 便引入了和服务网格数据面 Sidecar 同名的 Sidecar CRD 资源对象,控制负载上的出入流量以及课访问的目标服务等 。
 
 
 
Sidecar 对象描述了 sidecar 代理的配置 , sidecar 代理管理与其连接的工作负载的 inbound 和 outbound 流量 。默认情况下,Istio 将为网格中的所有 sidecar 代理服务,使其具有到达网格中每个工作负载所需的必要配置 , 并在与工作负载关联的所有端口上接收流量 。Sidecar 资源提供了一种的方法,在向工作负载转发流量或从工作负载转发流量时 , 微调端口集合和代理将接收的协议,此外 , 可以限制代理在从工作负载转发 outbound 流量时可以达到的服务集合 。
比如我们可以创建一个如下所示的 Sidecar 对象:
apiVersion:.NETworking.istio.io/v1beta1kind: Sidecarmetadata:name: test-scspec:egress:- hosts:- "istio-system/*"- "default/*"在上面的 Sidecar 对象中我们指定了 egress 字段,这个字段用于指定 sidecar 代理的出口流量,其中 hosts 字段用于指定 sidecar 代理可以访问的目标服务,这里我们指定了 istio-system/* 和 default/*,意思是我们可以控制 default 命名空间下的 sidecar 代理只可以访问 istio-system 和 default 命名空间下的服务,其他命名空间下的服务则无法访问 。
【使用 Sidecar CRD 优化 Istio 性能】整体上 Sidecar 对象的核心包括四个字段:workloadSelector、ingress 与 egress、outboundTrafficPolicy 。

  • workloadSelector:这个字段用来指定 sidecar 代理所属的工作负载 , 可以通过标签来指定,如果没有指定则会应用到当前命名空间下所有的工作负载上(每个命名空间下只能定义一个全局的 Sidecar 对象),如果定义在根命名空间 istio-system 下则会应用到所有命名空间下的工作负载上 。需要注意的是如果一个命名空间下存在多个 workloadSelector 的 Sidecar 选中同样的负载,则也会出现问题 , 所有要注意避免这种情况 。
  • egress:这个字段用来配置 sidecar 代理对服务网格内部其他服务的访问 , 如果没有配置则默认命名空间下的所有服务都可以访问 , 如果配置了则只能访问配置的服务 。该字段下面可以配置如下几个参数:
  • hosts:这是一个必选的字段,表示监听器对应的服务地址,格式为 <namespace>/<FQDN>,可以对 namespace、FQDN 进行通配符匹配,比如 default/* 表示 default 命名空间下的所有服务,*/foo 表示所有命名空间下的 foo 服务,*/* 表示允许目标是任意命名空间下的任意服务,~/* 表示禁止目标是任意命名空间下的任意服务 。
  • port:监听器关联的端口 。
  • bind:监听器绑定的地址 。
  • captureMode:配置流量捕获模式,可以是 DEFAULT、IPTABLES、NONE 三种模式 , 默认是 DEFAULT,DEFAULT 模式表示使用环境默认的流量捕获规则;IPTABLES 模式表示基于 iptables 规则转发的流量,NONE 模式表示没有流量拦截 。