更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——3. Terway ENIIP 模式架构设计(上):https://developer.aliyun.com/article/1221455?groupCode=supportservice
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的ClusterIP,可以看到SVC的后端两个Pod都会被加到IPVS的转发规则。
对于SVC的ExternalIP,可以看到SVC的后端,只有该节点的后端Pod 10.0.1.104才会被加到IPVS的转发规则
在LoadBalancer的SVC模式下,如果ExternalTrafficPolicy为Local,对于ClusterIP来说,会把所有SVC后端Pod都会加到该节点的IPVS转发规则;对于ExternalIP,只会把该节点上的SVC后端Pod才会加到IPVS规则中。如果该节点没有SVC后端Pod,则该节点上的Pod访问SVC的ExternalIP将会是失败。
Service的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
对于SVC的ClusterIP,可以看到SVC的后端两个Pod都会被加到IPVS的转发规则。
对于SVC的ExternalIP,可以看到SVC的后端两个Pod都会被加到IPVS的转发规则。
在LoadBalancer的SVC模式下,如果ExternalTrafficPolicy为Cluster,对于ClusterIP或ExternalIP来说,会把所有SVC后端Pod都会加到该节点的IPVS转发规则。
小结
可以访问到目的端
Conntrack表信息
Service nginx的ExternalTrafficPolicy是Local。
SVC nginx CLusterIP是192.168.2.115,ExternalIP是10.0.3.62。后端是10.0.1.104和10.0.3.58。
● 如果访问的是SVC的ClusterIP,通过conntrack 信息,可以看到src是源端Pod 10.0.1.91,dst是SVC ClusterIP 192.168.2.115,dport是SVC中的port。并且期望是10.0.1.104 来回包给 10.0.1.91。
● 如果访问的是SVC的ExternalIP,通过conntrack 信息,可以看到src是源端Pod 10.0.1.91,dst是SVC ExternalIP 10.0.3.62。dport是SVC中的port。并且期望是10.0.1.104 来回包给 10.0.1.91。
● Service nginx1的ExternalTrafficPolicy是Cluster。
● SVC nginx1 CLusterIP是192.168.2.253,ExternalIP是10.0.3.63,后端是10.0.1.104和10.0.3.58。
● 如果访问的是SVC的ClusterIP,通过conntrack 信息,可以看到src是源端Pod 10.0.1.91,dst是SVC ClusterIP 192.168.2.253,dport是SVC中的port。并且期望是10.0.1.104 来回包给 10.0.1.91。
● 如果访问的是SVC的ExternalIP,通过conntrack 信息,可以看到src是源端Pod 10.0.1.91,dst是SVC ExternalIP 10.0.3.63,dport是SVC中的port。并且期望是节点ECS的IP 10.0.1.82 来回包给 10.0.1.91。
综上可以看到src变换了多次,故在Cluster 模式下,会存在丢失真实客户端IP的情况。
数据链路转发示意图:
● 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信;
● 整个链路不会和请求不会经过pod所分配的ENI,直接在OS的ns中命中Ip rule 被转发;
● 整个请求链路是ECS1 Pod1 eth0 ->Pod1 calixxxx ->Pod2 calixxxx ->ECS1 Pod2 eth0;
● 访问SVC IP,SVC 会在源端pod eth0和calixxx网卡捕捉到,在目的端pod的eth0和calixxx时捕捉不到;
● 在LoadBalancer的SVC模式下,如果ExternalTrafficPolicy为Local,对于ClusterIP来说,会把所有SVC后端Pod都会加到该节点的IPVS转发规则;对于ExternalIP,只会把该节点上的SVC后端Pod才会加到IPVS规则中;
● 在LoadBalancer的SVC模式下,如果ExternalTrafficPolicy为Cluster,对于ClusterIP或ExternalIP来说,会把所有SVC后端Pod都会加到该节点的IPVS转发规则,同时无法保留src地址;
● 数据链路要经过三次内核协议栈,是Pod1协议栈、ECS1协议栈、Pod2协议栈;
4) 场景三:访问PodIP,异节点pod间互访
环境
cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp和10.0.1.91
cn-hongkong.10.0.3.49 节点上存在 nginx-7d6877d777-lwrfc和10.0.3.58。
内核路由
centos-67756b6dc8-h5wnp IP地址10.0.1.104,该容器在宿主机表现的PID是2211426,该容器网络命名空间有指向容器eth0的默认路由。
用上述类似办法可以发现centos-67756b6dc8-h5wnp的veth pair的cali44ae9fbceeb,Pod网络空间只有默认路由。
在ECS OS内,有指向Pod IP,下一跳为calixxxx的路由,通过前文可以知道calixxx网卡是和每个pod内的veth1组成的pair,所以,pod内访问SVC的CIDR会有指向veth1的路由,不会走默认的eth0路由。故:calixx网卡在这里的主要作用是用于:1.节点访问Pod 2. 当节点或者Pod访问 SVC的CIDR时,会走ECS OS内核协议栈转换,走到calixxx和eth0访问pod,对于目的为外部地址,则走Pod所属的ENI 出ECS进入到了VPC。
小结
可以访问到目的端
数据链路转发示意图:
● 会经过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 calixxxxx->ECS1 ethx -> vpc route rule(如有) ->ECS2 ethx ->ECS2 Pod2 calixxxxx->ECS2 Pod2 eth0;
● 数据链路要经过四次内核协议栈,Pod1协议栈、ECS1协议栈、Pod2协议栈、ECS2协议栈;
5) 场景四:群内非SVC后端pod所在节点访问SVC ClusterIP
环境
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。
Service2 是ngin1,ClusterIP是192.168.2.253 ExternalIP是10.0.3.63。
内核路由
内核路由部分已经在2.2和2.3 小结中详细说明,这里不再进行过多阐述。
源端ECS上的IPVS规则
根据2.2 小结中的源端ECS上的IPVS规则,我们可以得到:无论在哪种SVC模式下,对于ClusterIP来说,会把所有SVC后端Pod都会加到该节点的IPVS转发规则。
小结
可以访问到目的端
Conntrack表信息
Service nginx的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
源端ECS上src是源端Pod 10.0.1.91,dst是SVC ClusterIP 192.168.2.115,dport是SVC中的port。并且期望是10.0.3.58 来回包给 10.0.1.91。
cn-hongkong.10.0.3.49
目的端ECS上src是源端Pod 10.0.1.91,dst是Pod的IP 10.0.3.58,port是pod的port。并且期望此pod 来回包给 10.0.1.91。
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 ClusterIP 192.168.2.115,dport是SVC中的port。并且期望是10.0.3.58 来回包给 10.0.1.91。
cn-hongkong.10.0.3.49
目的端ECS上src是源端Pod 10.0.1.91,dst是Pod的IP 10.0.3.58,dport是pod的port。并且期望此pod 来回包给 10.0.1.91。
对于ClusterIP来说,源端ECS会把所有SVC后端Pod都会加到该节点的IPVS转发规则,目的端ECS是捕获不到任何SVC ClusterIP信息的,只能捕获到源端Pod的IP,所以回包的时候会回到源端Pod的附属网卡上。
数据链路转发示意图:
● 会经过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 calixxxxxx ->ECS1 主网卡eth0 -> vpc route rule(如有) ->ECS2 附属网卡ethx ->ECS2 Pod2 calixxxxx ->ECS2 Pod2 eth0;
◦ 回方向:
ECS2 Pod2 eth0 ->ECS2 Pod2 calixxxxx ->ECS2 附属网卡ethx -> vpc route rule(如有) ->ECS1 附属网卡eth1 ->ECS1 Pod1 calixxxxxx ->ECS1 Pod1 eth0;
● 对于ClusterIP来说,源端ECS会把所有SVC后端Pod都会加到该节点的IPVS转发规则,目的端ECS是捕获不到任何SVC ClusterIP信息的,只能捕获到源端Pod的IP,所以回包的时候会回到源端Pod的附属网卡上;
● 数据链路要经过四次内核协议栈,Pod1协议栈、ECS1协议栈、Pod2协议栈、ECS2协议栈;
更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——3. Terway ENIIP 模式架构设计(下):https://developer.aliyun.com/article/1221452?groupCode=supportservice