更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——3. Terway ENIIP 模式架构设计(中):https://developer.aliyun.com/article/1221454?spm=a2c6h.13148508.setting.27.15f94f0eR4QihT
6) 场景五:Cluster模式,集群内非SVC后端pod所在节点访问SVC External IP
环境
cn-hongkong.10.0.3.49节点上存在 nginx-7d6877d777-h4jtf和10.0.3.58
cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp和10.0.1.91
Service2 是ngin1,ClusterIP是192.168.2.253 ExternalIP是10.0.3.63。
内核路由
内核路由部分已经在2.2和2.3 小结中详细说明,这里不再进行过多阐述。
源端ECS上的IPVS规则
根据2.2 小结中的源端ECS上的IPVS规则,我们可以得到:ExternalTrafficPolicy为Cluster模式下,对于ExternalIP来说,会把所有SVC后端Pod都会加到该节点的IPVS转发规则。
小结
可以访问到目的端
Conntrack表信息
Service nginx1的ExternalTrafficPolicy是Cluster。
SVC nginx1 CLusterIP是192.168.2.253,ExternalIP是10.0.3.63,后端是10.0.1.104和10.0.3.58。
cn-hongkong.10.0.1.82
源端ECS上src是源端Pod 10.0.1.91,dst是SVC ExternalIP 10.0.3.63,dport是SVC中的port。并且期望是10.0.3.58 来回包给源端ECS的地址10.0.1.82。
cn-hongkong.10.0.3.49
目的端ECS上src是源端Pod所在的ECS地址10.0.1.82,dst是Pod的IP 10.0.3.58,dport是pod的port。并且期望此pod 来回包给源端ECS的地址10.0.1.82。
在ExternalTrafficPolicy为Cluster下,对于ExternalIP来说,源端ECS会把所有SVC后端Pod都会加到该节点的IPVS转发规则,目的端ECS是捕获不到任何SVC ExternalIP信息的,只能捕获到源端Pod所在的ECS的IP,所以回包的时候会回到源端Pod所在的ECS的主网卡上,这一点明显和2.4 小结中访问CusterIP有很明显区别。
数据链路转发示意图:
● 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信;
● 整个链路请求会经过pod所分配的ENI,直接在OS的ns中命中Ip rule 被转发;
● 出ECS后,根据要访问的pod和该pod ENI所属vswitch,命中VPC路由规则或者直接VSW上的二层转发;
● 整个请求链路是ECS1 Pod1 eth0 ->ECS1 Pod1 calixxxx ->ECS1 主网卡ENI eth0 -> vpc route rule(如有) ->ECS2 附属网卡ethx->ECS2 Pod2 calixxx ->ECS2 Pod2 eth0;
● 在ExternalTrafficPolicy为Cluster下,对于ExternalIP来说,源端ECS会把所有SVC后端Pod都会加到该节点的IPVS转发规则,目的端ECS是捕获不到任何SVC ExternalIP信息的,只能捕获到源端Pod所在的ECS的IP,所以回包的时候会回到源端Pod所在的ECS的主网卡;
● 数据链路要经过四次内核协议栈,Pod1协议栈、ECS1协议栈、Pod2协议栈、ECS2协议栈;
7) 场景六:Local模式,集群内非SVC后端pod所在节点访问SVC External IP
环境
cn-hongkong.10.0.3.49节点上存在 nginx-7d6877d777-h4jtf和10.0.3.58
cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp和10.0.1.91
Service1 是nginx,ClusterIP是192.168.2.115 ExternalIP是10.0.3.62。
内核路由
内核路由部分已经在2.2和2.3 小结中详细说明,这里不再进行过多阐述。
源端ECS上的IPVS规则
Service的ExternalTrafficPolicy是Local
SVC nginx CLusterIP是192.168.2.115,ExternalIP是10.0.3.62。后端是10.0.1.104和10.0.3.58。
cn-hongkong.10.0.1.82
对于SVC的ExternalIP,可以看到SVC的后端,无任何转发规则。
根据2.2 小结中的源端ECS上的IPVS规则,我们可以得到:ExternalTrafficPolicy为Local模式下,对于ExternalIP来说,只会把本节点上的SVC的后端Pod加到节点上的IPVS转发规则,如果该节点没有SVC后端,则不会有任何可以转发的规则。
小结
不可以访问到目的端
Conntrack表信息
Service的ExternalTrafficPolicy是Local
SVC nginx1 CLusterIP是192.168.2.253,ExternalIP是10.0.3.63,后端是10.0.1.104和10.0.3.58。
cn-hongkong.10.0.1.82 无任何conntrack记录表生成。
数据链路转发示意图:
● 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信;
● 整个链路请求不会经过pod所分配的ENI,直接在OS的ns中命中Ip rule 被转发;
● 整个请求链路是ECS1 Pod1 eth0 ->ECS1 Pod1 calixxxx ->ECS host 空间ipvs/iptables规则,无后端转发ep终止链路;
● ExternalTrafficPolicy为Local模式下,对于ExternalIP来说,只会把本节点上的SVC的后端Pod加到节点上的IPVS转发规则,如果该节点没有SVC后端,则不会有任何可以转发的规则;
8) 场景七:集群外访问SVC External IP
环境
cn-hongkong.10.0.3.49节点上存在 nginx-7d6877d777-h4jtf和10.0.3.58。
cn-hongkong.10.0.1.47 节点上存在 nginx-7d6877d777-kxwdb和10.0.1.29。
Service1 是nginx,ClusterIP是192.168.2.115 ExternalIP是10.0.3.62。
SLB相关配置
在SLB控制台,可以看到 lb-j6cw3daxxukxln8xccive虚拟服务器组的后端服务器组是两个后端nginxPod的ENI eni-j6c4qxbpnkg5o7uog5kr和eni-j6c6r7m3849fodxdf5l7。
从集群外部角度看,SLB的后端虚拟服务器组是SVC的后端Pod所属的两个ENI网卡,内网的IP 地址就是Pod的地址。
小结
可以访问到目的端
数据链路转发示意图:
● 数据链路:client -> SLB->Pod ENI +Pod Port->ECS1 Pod1 eth0;
● 数据链路要经过二次内核协议栈,Pod1协议栈和ECS协议栈;
9) 小结
本篇文章主要聚焦ACK 在Terway ENIIP模式下,不同SOP场景下的数据链路转发路径。伴随着客户对性能的极致追求的需求,在Terway ENIIP模式下,一共可以分为7个SOP场景,并对这七个场景的转发链路,技术实现原理,云产品配置等一一梳理并总结,这对我们遇到Terway ENIIP架构下的链路抖动、最优化配置,链路原理等提供了初步指引方向。
在Terway ENIIP 模式下,利用veth pair来联通宿主机和pod的网络空间,pod的地址是来源于弹性网卡的辅助IP地址,并且节点上需要配置策略路由来保证辅助IP的流量经过它所属的弹性网卡,通过此种方式可以实现ENI多Pod共享,大大提升了Pod的部署密度,但是veth pair必然会利用ECS的内核协议栈进行转发,此架构下性能必然不如ENI模式,ACK产研为了提升性能,结合内核的ebpf和ipvlan技术,开发了Terway ebpf + ipvlan 架构。
下一系列我们将进入到Terway ENIIP模式的全景解析