更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——1. Flannel 模式架构设计(中):https://developer.aliyun.com/article/1221680?spm=a2c6h.13148508.setting.21.15f94f0eeQ735s
5) 场景四:ExternalTrafficPolicy为Local时,Client来自于集群外
此场景包含下面几个子场景,数据链路可以归纳为一种:
A.访问SVC External IP,ExternalTrafficPolicy 为Local时, Client和服务端Pod部署于不同ECS,其中client为集群外。
环境
Deployment为nginx1,分别为三个pod nginx1-76c99b49df-4zsdj和nginx1-76c99b49df-7plsr 部署在 ap-southeast-1.10.0.1.206ECS上,最后一个pod nginx1-76c99b49df-s6z79 部署在其他节点ap-southeast-1.10.0.1.216 上
Service nginx1的ExternalTrafficPlicy 为Local。
内核路由
Pod网络空间和ECS OS 网络空间的数据交换在 2.1 场景一中已经做了详细描述,此处不再果断篇幅描述。
SLB相关配置
从SLB控制台,可以看到SLB后端的虚拟服务器组中只有两个ECS节点ap-southeast-1.10.0.1.216和ap-southeast-1.10.0.1.206。集群内的其他节点,比如 ap-southeast-1.10.0.0.180 并未被加到SLB的后端虚拟服务器组中。虚拟服务器组的IP 为ECS的IP,端口为service里面的nodeport端口32580。
故ExternalTrafficPolicy为Local模式下,只有有Service后端pod所在的ECS节点才会被加入到SLB的后端虚拟服务器组中,参与SLB的流量转发,集群内的其他节点不参与SLB的转发。
SLB虚拟服务器组ECS的IPVS规则
从SLB的虚拟服务器组中的两个ECS可以看到,对于nodeip+nodeport的ipvs转发规则是不同。ExternalTrafficPolicy为Local模式下,只有该节点上的护短pod才会被加到该节点的ipvs转发规则中,其他节点上的后端pod不会加进来,这样保证了被SLB转发的链路,只会被转到该节点上的pod,不会转发到其他节点上。
node1: ap-southeast-1.10.0.1.206
node1: ap-southeast-1.10.0.1.216
小结
可以访问到目的端
数据链路转发示意图:
该图示意了只有后端pod所在ECS才会加到SLB后端中,从集群外部访问SVC的externalIP(SLB IP)的情况,可见数据链路只会被转发到虚拟服务器组中的ECS,不会再被转发到集群内其他节点上。
内核协议栈示意图:
Conntack 表信息
Node:
src是集群外部客户端IP,dst是节点IP,dport是SVC中的nodeport。并且期望是由该ECS上的pod 172.23.96.82 来回包给源端。
● 数据链路:client -> SLB->ECS eth0 +ECS nodeport -> cni0 -> vethxxxxx ->ECS1 Pod1 eth0;
● 数据链路要经过两次内核协议栈,分别是Pod1协议栈,ECS1 OS协议栈;
● ExternalTrafficPolicy为Local模式下,只有有Service后端pod所在的ECS节点才会被加入到SLB的后端虚拟服务器组中,参与SLB的流量转发,集群内的其他节点不参与SLB的转发;
6) 场景五:ExternalTrafficPolicy为Cluster时,Client来自于集群外
此场景包含下面几个子场景,数据链路可以归纳为一种:
访问SVCExternal IP,ExternalTrafficPolicy 为Cluster时, Client和服务端Pod部署于不同ECS,其中client为集群外。
环境
Deployment为nginx1,分别为三个pod nginx1-76c99b49df-4zsdj和nginx1-76c99b49df-7plsr 部署在 ap-southeast-1.10.0.1.206ECS上,最后一个pod nginx1-76c99b49df-s6z79 部署在其他节点ap-southeast-1.10.0.1.216 上
Service nginx2的ExternalTrafficPlicy 为Cluster。
内核路由
Pod网络空间和ECS OS 网络空间的数据交换在 2.1 场景一中已经做了详细描述,此处不再果断篇幅描述。
SLB相关配置
从SLB控制台,集群内所有节点ap-southeast-1.10.0.0.180、ap-southeast-1.10.0.1.216和ap-southeast-1.10.0.1.206都被加到SLB的虚拟服务器组中。其中虚拟服务器组的IP 为ECS的IP,端口为service里面的nodeport端口30875。
故ExternalTrafficPolicy为CLuster模式下,集群内所有的ECS节点都会被加入到SLB的后端虚拟服务器组中,参与SLB的流量转发。
SLB虚拟服务器组ECS的IPVS规则
从SLB的虚拟服务器组中的可以看到,对于nodeip+nodeport的ipvs转发规则是一致的。ExternalTrafficPolicy为CLuster模式下,所有的service后端pod都会被加到所有节点的ipvs的转发规则中,即使是该节点有后端pod,流量也不一定会被转发到该节点上pod,可能会被转发到其他节点上的后端pod。
node1: ap-southeast-1.10.0.1.206 (该节点有后端pod)
node1: ap-southeast-1.10.0.1.216 (该节点有后端pod)
node3: ap-southeast-1.10.0.0.180 (该节无后端pod)
小结
可以访问到目的端
数据链路转发示意图:
该图示意了集群内所有ECS都会被加到SLB后端中,从集群外部访问SVC的externalIP(SLB IP)的情况,数据流量可能会被转发到其他节点上。
内核协议栈示意图:
内核协议栈示意图已经在 2.4 场景一中已经做了详细描述,此处不再过多篇幅描述。
Conntack 表信息
链路1:
ap-southeast-1.10.0.0.180:
此时数据链路对应示意图中的链路1,可以看到数据链路被转到ap-southeast-1.10.0.0.180节点,该节点上并没有service的后端pod,通过conntrack 信息,可以看到:
src是集群外部客户端IP,dst是节点IP,dport是SVC中的nodeport。并且期望是172.23.96.163 来回包给 10.0.0.180。通过前述信息,可以得知172.23.96.163 是nginx1-76c99b49df-7plsrPod,部署在ap-southeast-1.10.0.1.206。
ap-southeast-1.10.0.1.206:
通过此节点conntrack 表,可以看到src是node ap-southeast-1.10.0.0.180,dst是172.23.96.163的80 端口,回包也是直接回给 node ap-southeast-1.10.0.0.180。
综上可以看到src变换了多次,故在Cluster 模式下,会存在丢失真实客户端IP的情况。
链路2:
src是集群外部客户端IP,dst是节点IP,dport是SVC中的nodeport。并且期望是由该ECS上的pod 172.23.96.82 来回包给172.23.96.65,此地址是SLB集群中的一个地址。
数据链路:
● 情景一:client -> SLB->ECS eth0 +ECS nodeport -> cni0 -> vethxxxxx ->ECS1 Pod1 eth0;
● 情景二:client -> SLB->ECS1 eth0 +ECS1 nodeport-> VPC Routing ->ECS2 eth0 +Pod port -> cni0 -> vethxxxxx ->ECS2 Pod1 eth0;
● 数据链路要经过三次内核协议栈,分别是ECS1 OS、ECS2 OS协议栈和Pod协议栈;
● ExternalTrafficPolicy为CLuster模式下,kubernetes所有ECS节点都会被加入到SLB的后端虚拟服务器组中,参与SLB的流量转发,此时会存在数据路在集群内被多个ECS转发的场景,该情况下会丢失真实客户端IP的情况;
7) 小结
本节主要聚焦ACK 在Flannel模式下,不同SOP场景下的数据链路转发路径。随着微服务化和云原生化,网络场景日趋复杂,作为kubernetes原生的网络模型——Flannel,不同的访问环境,一共可以分为10个SOP场景。通过深入简出的剖析,可以归纳为5个场景,并对这五个场景的转发链路,技术实现原理,云产品配置等一一梳理并总结,这对我们遇到Flannel架构下的链路抖动、最优化配置,链路原理等提供了初步指引方向。