更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——1. Flannel 模式架构设计(上):https://developer.aliyun.com/article/1221682?groupCode=supportservice
3) 场景二:Client和服务端Pod部署于不同ECS
此场景包含下面几个子场景,数据链路可以归纳为一种:
● 以Pod IP对外提供服务,Client和Pod部署于不同节点;
● 以SVC ClusterIP对外提供服务,Client和SVC 后端Pod部署于不同节点;
● 以SVC ExternalIP对外提供服务,ExternalTrafficPolicy为Cluster情况下,集群内Client和SVC后端Pod部署于不同节点;
环境
ap-southeast-1.10.0.0.180节点上存在两个pod:centos-67756b6dc8-rmmxt IP地址172.23.96.23和nginx1-76c99b49df-7plsr IP 地址172.23.96.163
Service nginx1的ExternalTrafficPlicy 为Cluster。
内核路由
Pod网络空间和ECS OS 网络空间的数据交换在 2.1 场景一中已经做了详细描述,此处不再果断篇幅描述。
源端Pod所在ECS的IPVS规则
可以看到,源端数据链路访问svc的clusterip 192.168.13.23 时,如果链路到达ECS的OS内,会命中ipvs规则,被解析到svc的后端endpoint之一(本实例中只有一个pod,所以endpoint只有一个)。
小结
可以成功访问到目的端
数据链路转发示意图:
VPC 路由表会自动配置目的地址是pod CIDR,下一跳为Pod 网段所归属的ECS的自定义路由条目,该规则由ACK管控测通过openapi 调用VPC去配置,无需手动配置和删除。
内核协议栈示意图:
Conntack 表信息(访问SVC 情况)
Node1:
src是源pod IP,dst是svc的ClusterIP,并且期望是由svc的其中一个endpoint
172.23.96.163 来回消息给源端pod。
Node2:
目的pod所在ECS上conntrack 表记录是由源端pod访问目的pod,不会记录svc的clusterip地址。
● 数据链路:ECS1 Pod1 eth0 -> vethxxx1 -> cni0 ->ECS 1 eth0 -> VPC ->ECS2 eth0 -> cni0 -> vethxxxx2 ->ECS2 Pod2 eth0;
● 数据链路要经过四次内核协议栈,分别是Pod1协议栈,ECS1 OS协议栈,ECS2 OS协议栈和Pod2协议栈;
● VPC 路由表会自动配置目的地址是pod CIDR,下一跳为Pod 网段所归属的ECS的自定义路由条目,该规则由ACK管控测通过openapi 调用VPC去配置,无需手动配置和删除;
● 如果访问的SVC的Cluster IP,或者是Cluster模式下,访问SVC的externalIP,数据链路通过veth pair进到ECS OS内后,会命中相应的IPVS规则,并根据负载规则,选择IPVS的某一个后端,进而打到其中的一个SVC的后端endpoint,SVC的IP 只会再Pod的eth0,veth pair vethxxx被捕捉到,其他链路环节不会捕捉到svc的IP;
4) 场景三:ExternalTrafficPolicy为Local时,Client和服务端Pod部署于集群内不同ECS
此场景包含下面几个子场景,数据链路可以归纳为一种:
以SVC ExternalIP对外提供服务,ExternalTrafficPolicy为Local情况下,集群内Client和SVC后端Pod部署于不同节点;
环境
ap-southeast-1.10.0.0.180节点上存在两个pod:centos-67756b6dc8-rmmxt IP地址172.23.96.23和nginx1-76c99b49df-7plsr IP 地址172.23.96.163
Service nginx1 ExternalTrafficPolicy 为Local。
内核路由
Pod网络空间和ECS OS 网络空间的数据交换在 2.1 场景一中已经做了详细描述,此处不再果断篇幅描述。
源端Pod所在ECS的IPVS规则
可以看到,源端数据链路访问svc的external ip 8.219.164.113 时,如果链路到达ECS的OS内,会命中ipvs规则,但是我们可以看到external ip并没有相关的后端endpoint,链路达到OS后,会命中IPVS规则,但是没有后端pod,所以会出现connection refused。
小结
不可以访问到目的端,此时会访问失败,Connection refused
数据链路转发示意图:
内核协议栈示意图:
● 数据链路:ECS1 Pod1 eth0 -> vethxxx1 ->;
● 数据链路要经过一次半内核协议栈,分别是Pod1协议栈,半个ECS1 OS协议栈;
● 如果访问的SVC的External IP,或者是Local模式下,访问SVC的externalIP,数据链路通过veth pair进到ECS OS内后,会命中相应的IPVS规则,但是由于Local模式,External IP的IPVS为空,所以命中规则但是无转发后端,整个链路会在ipvs终止,访问失败。所以建议集群内采用clusterip访问,这也是k8s官方推荐的最佳实践;
更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——1. Flannel 模式架构设计(下):https://developer.aliyun.com/article/1221679?groupCode=supportservice