更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——2. Terway ENI 模式架构设计(上):https://developer.aliyun.com/article/1221647?groupCode=supportservice
4) 场景三:访问Pod IP,异节点pod访问pod
环境
ap-southeast-1.10.0.0.196节点上存在pod:centos-59cdc5c9c4-89f8x IP地址10.0.0.202。
ap-southeast-1.10.0.2.80节点上存在pod:nginx-6f545cb57c-jmbrq和10.0.2.86。
内核路由
centos-59cdc5c9c4-89f8x IP地址10.0.0.202,该容器在宿主机表现的PID是2314075,该容器网络命名空间有指向容器eth0的默认路由。和下一跳为veth1,目的网段为service的两条路由。
通过上述类似的办法,可以找到 nginx-6f545cb57c-jmbrq IP地址 10.0.2.86,该容器在宿主机表现的PID是1083623。
小结
可以访问到目的端
centos-59cdc5c9c4-89f8x netns eth0 可以抓到数据包。
nginx-6f545cb57c-jmbrq netns eth0 可以抓到数据包。
数据链路转发示意图:
● 数据链路是ECS1 Pod1 netns eth0 -> VPC ->ECS2 Pod2 netns eth0。数据链路不经过宿主机host namespace,数据链路会先出ECS1,到AVS再回到ECS2;
● 在pod内的net namespace中,直接命中默认路由规则,从eth0网卡出pod直接到VPC。这里的eth0 其实就是附属网卡ENI,直接被挂载在了pod的net ns,走了PCI设备;
● 该网卡为被分配的pod独占,无法和其他pod进行共享;
● 数据链路经过两次协议栈;
5) 场景四:集群内访问SVC IP (Cluster IP),源端和SVC后端Pod为同一节点
环境
ap-southeast-1.10.0.0.196节点上存在两个pod:centos-59cdc5c9c4-89f8x IP地址10.0.0.202和nginx1-5969d8fc89-9t99h和10.0.0.203。
Service是nginx1集群内clusterIP是192.168.41.244,external IP是8.219.175.179。
内核路由
centos-59cdc5c9c4-89f8x IP地址10.0.0.202,该容器在宿主机表现的PID是2314075,该容器网络命名空间有指向容器eth0的默认路由。和下一跳为veth1,目的网段为service的两条路由。
该容器eth0在ECS OS 内对应veth pair是cali38ef34581a9。
通过上述类似的办法,可以找到 nginx1-5969d8fc89-9t99h IP地址10.0.0.203,该容器在宿主机表现的PID是1094736,该容器eth0在ECS OS 内对应veth pair是cali5068e632525。
在ECS OS内,有指向Pod IP,下一跳为calixxxx的路由,通过前文可以知道calixxx网卡是和每个pod内的veth1组成的pair,所以,pod内访问SVC的CIDR会有指向veth1的路由,不会走默认的eth0路由。
故calixx网卡在这里的主要作用是用于:节点访问Pod 2. 当节点或者Pod访问 SVC的CIDR时,会走ECS OS内核协议栈转换,走到calixxx和veth1访问pod。
小结
可以访问到目的端
centos-59cdc5c9c4-89f8x netns veth1 可以抓到数据包。
centos-59cdc5c9c4-89f8x netns cali38ef34581a9 可以抓到数据包。
nginx1-5969d8fc89-9t99h netns veth1 可以抓到数据包。
nginx1-5969d8fc89-9t99h netns cali5068e632525 可以抓到数据包。
数据链路转发示意图:
● 数据链路是ECS1 Pod1 netns veth1 -> calixxx1 -> calixxx2->ECS2 Pod2 netns veth1;
● 在pod内的net namespace中,命中svc的路由,从veth1网卡出pod到ECS的namespace,然后通过linux routing 转到另一个pod的calixx 网卡。这里的veth1和calixxx是veth pair;
● 源端pod所分配的veth,calicoxxx网卡可以捕获到svc IP和源端pod IP。SVC IP 会在源端ECS host内命中ipvs/iptables规则,做了nat转化;
● 目的段pod所分配的veth,calicoxxx网卡可以捕获calicoxxx网卡默认ip和目的pod IP;
● 该网卡为被分配的pod独占,无法和其他pod进行共享;
● 数据链路经过三次协议栈:Pod1,ECS OS和Pod2;
6) 场景五:集群内访问SVC IP (Cluster IP),源端和SVC后端Pod为不同节点
环境
ap-southeast-1.10.0.0.196节点上存在pod:centos-59cdc5c9c4-89f8x IP地址10.0.0.202。
ap-southeast-1.10.0.2.80节点上存在pod:nginx-6f545cb57c-jmbrq和10.0.2.86。
Service是nginx集群内clusterIP是192.168.204.233,external IP是8.219.199.33。
内核路由
centos-59cdc5c9c4-89f8x IP地址10.0.0.202,该容器在宿主机表现的PID是2314075,该容器网络命名空间有指向容器eth0的默认路由。和下一跳为veth1,目的网段为service的两条路由。
该容器eth0在ECS OS 内对应veth pair是cali38ef34581a9。
通过上述类似的办法,可以找到 nginx-6f545cb57c-jmbrq IP地址 10.0.2.86,该容器在宿主机表现的PID是1083623,该pod网卡ENI是直接被挂载到了Pod的网络命名空间内。
小结
可以访问到目的端
数据链路转发示意图:
● 数据链路是ECS1 Pod1 netns veth1 -> cali38ef34581a9 ->ECS1 eth0 -> VPC ->ECS2 Pod2 netns veth1;
● 在客户端pod内的net namespace中,命中svc的路由,从veth1网卡出pod到ECS的namespace,然后通过linux routing 转到客户端ECS eth0 网卡, 然后进入到vpc转发到目的Pod所属的eth网卡;
● 源端pod所分配的veth,calicoxxx网卡可以捕获到svc IP和源端pod IP;
● SVC IP 会在源端ECS host内命中ipvs/iptables规则,做了fnat转化。在源端ECS 所属的eth0只能捕获到ipvs/iptables规则所分配的目的pod IP和源ECS IP;
● 目的pod内eth0所捕获的IP 是源端ECS IP和目的POD IP。(源POD IP和SVC IP不会体现);
● 该网卡为被分配的pod独占,无法和其他pod进行共享;
● 数据链路经过三次协议栈:Pod1,ECS1 OS和Pod2;
更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——2. Terway ENI 模式架构设计(下):https://developer.aliyun.com/article/1221643?groupCode=supportservice