作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,阿里云服务网格ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景,详情可进入阿里云官方网站 - 搜索服务网格ASM。
在服务网格中,对于Sidecar代理的配置是一块重要的独立内容。根据使用者的业务场景和具体需求,网格使用者往往需要针对性地为Sidecar代理应用不同的配置。配置的种类包括容器资源配置、请求拦截配置、声明周期配置、监控配置等等。
对流量拦截的配置是很多用户都亟需使用的功能,在实际的业务环境中,往往需要根据一些具体需求,在针对某些入口或出口流量时停止Sidecar的拦截。比如,某个业务容器需要使用某种自定义的协议对其依赖的服务进行请求,在Sidecar代理对该协议没有良好支持的情况下,需要针对性地将访问该服务的流量配置禁用Sidecar代理拦截,让所有相关流量绕过Sidecar代理。
针对常见的Sidecar流量拦截配置场景,社区服务网格istio提供了一些配置项,包括excludeOutboundIPRanges、includeOutboundIPRanges、excludeOutboundPorts、includeOutboundPorts、excludeInboundPorts和includeInboundPorts。服务网格ASM针对这些配置项提供了兼容的对应配置入口,以帮助用户灵活地针对Sidecar代理的流量拦截行为进行定制。服务网格ASM对应提供的配置项包括:拦截对外访问的地址范围、不拦截对外访问的地址范围、设置端口使出口流量免于经过Sidecar代理、设置端口使出口流量经过Sidecar代理、设置端口使入口流量免于经过Sidecar代理、设置端口使入口流量经过Sidecar代理。
OMG,WHAT THIS!一口气说完这些配置项名字,其难度已经不亚于连念100遍“吃葡萄不吐葡萄皮”了,而这些配置项到底如何生效、彼此之间关系究竟如何,则更可说是扑朔迷离。
各位不要着急,本文就来捋一捋这些配置项,看看能不能给诸位捋明白。
入口流量拦截配置
首先我们对这几个配置项进行分类。对于Sidecar代理来说,其拦截的流量分为两种:
-
入口流量:由外部客户端发往本工作负载的流量
-
出口流量:由本工作负载发往外部其他服务的流量
对应的,对Sidecar代理拦截行为的配置也分为针对入口流量的配置和针对出口流量的配置。我们先来看相对简单一点的针对入口流量的拦截配置,这包括设置端口使入口流量免于经过Sidecar代理 和 设置端口使入口流量经过Sidecar代理。
对于入口流量来说,由于流量的目的地肯定是本工作负载,我们只关注流量发往的端口,该端口也就是业务容器提供服务时所监听的端口。对于入口流量拦截的这两项配置,我们都可以配置一个以逗号分隔的端口列表,来指定需要拦截/不需要拦截的容器端口。即:
-
设置端口使入口流量免于经过Sidecar代理:发往 指定端口 的请求将 不会被 Sidecar代理拦截。
-
设置端口使入口流量经过Sidecar代理:发往 指定端口 的请求将 被 Sidecar代理拦截。此项可以被配置为“*”,代表拦截所有端口上的入口流量。
可以看到,这两项配置项的效果是截然相反的,那么同时配置时究竟谁会生效呢?
实际上,“设置端口使入口流量免于经过Sidecar代理”只有在“设置端口使入口流量经过Sidecar代理”被配置为“*”的情况下才能生效。而在上述的免于经过Sidecar代理的配置生效的情况下,则Sidecar代理将优先不拦截请求。
出口流量拦截配置
相对入口流量来说,出口流量的拦截配置要更加复杂一些,由于每一条出口流量都包含两个属性:
-
出口流量的目标服务IP地址
-
出口流量的目标服务端口
因此,针对这两项出口流量属性,各有两项配置项来规定当遇到属性匹配的出口流量时,Sidecar代理是否要对该出口流量进行拦截。
针对出口流量的目标服务IP地址:
-
拦截对外访问的地址范围:发往 指定地址范围 内的请求 将会 被拦截
-
不拦截对外访问的地址范围:发往 指定地址范围 内的请求 将不会 被拦截
针对出口流量的目标服务端口:
-
设置端口使出口流量免于经过Sidecar代理:发往 指定服务端口 的请求 将会 被拦截
-
设置端口使出口流量经过Sidecar代理:发往 指定服务端口 的请求 将不会 被拦截
针对出口流量的拦截行为,有上述4个配置项都可以对其产生影响,那么这四项配置之间到底是怎样的关系呢?
您可以效仿下面的做法,针对出口流量的拦截行为做如下的配置,并测试Sidecar代理是否对请求进行了拦截。一些现象如下:
-
当地址设置不拦截,端口配置经过代理时:不拦截
-
当地址不配置,端口配置经过代理:拦截
-
当地址设置拦截,端口配置免于代理时:不拦截
-
当地址不配置,端口配置免于代理时:不拦截
总结下来,对于一条出口流量请求,您可以根据以下的原则判断Sidecar代理是否会对其进行拦截:
-
当请求的目的地址位于“拦截对外访问的地址范围”的范围之内时、 或者 请求目标服务端口位于“设置端口使出口流量经过Sidecar代理”的端口列表之中时,Sidecar 将会 拦截请求
-
当请求的目的地址位于“不拦截对外访问的地址范围”的范围之内时、 或者 请求目标服务端口位于“设置端口使出口流量免于经过Sidecar代理”的端口列表之中时,Sidecar 将不会 拦截请求
-
如果判断请求同时满足了拦截与不拦截的条件,则 不拦截优先 ,Sidecar 将不会 拦截请求。
全局默认值
在默认情况下,服务网格ASM对Sidecar代理的流量拦截配置如下:
如您所见,“拦截对外访问的地址范围”与“设置端口使入口流量经过Sidecar代理”被设定为“*”,而其他项都为空,这将保证Sidecar代理默认拦截到所有的入口与出口流量。您可以在此基础上,为Sidecar代理定制自己的流量拦截行为。♀️