在实际的系统运行过程中,SRE工程师经常会发现系统存在网络重传的报警,有时候发生在个别机器上,有时候会发生在某些机房里,还有会发生在某些应用中。遇到这类问题的时候,经常有同学会第一时间想拉网络的同学进行排查,询问系统无任何变更的时候,应用为什么会有重传。大部分情况下,网络的同学反馈的都是网络是正常的,和网络关系不大。相关的case发生次数多了之后,就会出现一个现象,网络的同学对类似的问题爱搭不理,业务的同学也会对网络颇有微词。从我的经验来看,两者的观点站在彼此的角度上看,都没有太大的问题,主要还是网络和业务的同学都只对自己本域的内容很清楚,对网络链路上的全局不明了,导致的现象。就这种现象,个人想从我自己的理解来谈谈,哪些常见的场景可能会导致网络异常,以及如果遇到网络异常的时候,我们应该如果定位这些异常,并找到合适的同学快速的解决定位这类问题。
一、常见的网络链路是什么样子的?
目前大部分的业务实际是运行在云上的独立vpc内部的,当然也有一部分公司业务是混合云部署,业务运行在云上和云下环境都有。这里为了简单说明重点聊一下同VPC内的网络问题。对于异地、跨VPC的网络问题,单独介绍。对于用云的业务同学来说,我们能感知到的主要是容器,也就是docker镜像。当我们的业务镜像通过容器部署起来之后,业务的流量就会从这个容器上走出去,熟悉容器化的同学都清楚,容器在网络层面实际是通过netns进行流量的隔离的,对应的网卡也是走的虚拟网卡,虚拟网卡最终的流量也会路由到宿主机的物理网卡上。可以考虑一个问题,容器的ip一般和宿主机的IP是不在同一个网段的,从网络协议上看,怎么完成数据包的路由呢? 这里需要一个NAT路由,或者需要一个网桥,将数据包的桥接到网卡上,或者通过NAT路由网关,将容器的流量通过网卡路由出去。但是直接通过物理网卡做数据转发效率太低了,同时大家公用同一块网卡网络性能也会比较弱,就这个问题,引入了一些硬件来承接网络转发的能力。比如NPU,对于aliyun上的ECS,其上有avs以及moc卡,avs类似nat网关,所有的数据包都会走avs做转发,走到物理机上。moc卡。那么一个网络请求发出去后,理论上就会走到这些节点。同时当业务侧出现响应阻塞的时候,也会发生重传的现象,而且重传可能只是某些链路上存在问题。因此如果遇到类似的情况,需要逐个排查清楚问题产生的原因。
1.1 ECS内不同POD之间的网络通讯
从容器的规范来看,同宿主机上网络的隔离实际是通过netns来处理的,不同的netns之间公用了主机的协议栈,不同的地方在于不同的netns之间,通过vlan进行隔离,这里的细节和内核内部的处置方式就存在细节上的不同。对于内核来说,vlan的隔离, 不同的数据访问方式走的情况是有差异的,一般情况下,同ECS内的POD都会走同一套网络,可以通过docker network list
查看当前ECS下的容器网络列表,docker network inspect $networkid
查看对应网络的相关配置,可以看到该网段的配置情况,以及网关的配置情况等。
1.1.2 同ECS内之间POD的通信
1.2 同网段下不同ECS的POD通信
1.4 同Region下不同AZ中POD通信
1.6 不同Region下POD通信
1.7 ECS和POD之间的区别? ECS走的网络和POD走的网络相同么?