Terway ENI 模式下,ENI的网络都是和VPC同样的网段,ENI网络就是从Aliyun的VPC网络中创建和绑定一个弹性网卡到ECS节点上,然后Pod利用这个弹性网卡和别的网络互通,这里需要关注的是弹性网卡的数量是有限制的,具体的根据实例类型有不同的配额。
Pod 所使用的CIDR网段和节点的CIDR是同一个网段。
pod内部可以看到是有两张网卡的,一个是eth0,另一个是veth1,其中eth0的IP就是Pod的IP,此网卡的MAC地址和控制台上的ENI的MAC地址可以匹配,说明此网卡就是附属ENI网卡,被直接挂载到了Pod的网络命名空间内。
Pod内有指向eth0的默认路由,同时还有指向目的网段为192.168.0.0/16,下一跳为veth1网卡的路由,其中192.168.0.0/16 网段为集群的service网段,说明集群内Pod访问SVC的clusterIP网段,数据链路会经过veth1 网卡到宿主机ECS的OS内进行下一步判断,其他情况是走eth0直接进入到VPC。
如上图所示,我们可以容器的网络命名空间中通过ip addr 看到一个veth1@if19的标志位,其中‘19' 这个将会协助我们在ECS的OS内找到和容器网络命名空间中的veth pair相对一个。在ECS OS 内我们通过ip addr | grep 19: 可以找到cali38ef34581a9 这个虚拟网卡,这个就是veth pair在ECS OS侧相对的那一个。
到目前为止,容器访问SVC的ClusterIP时,容器和OS数据链路已经建立链接了,那么ECS OS内对于数据流量是怎么判断去哪个容器呢? 通过OS Linux Routing我们可以看到,所有目的是Pod CIDR 网段的流量都会被转发到Pod对应的calico虚拟往卡上,到这里为止,ECS OS和Pod的网络命名空间已经建立好完整的出入链路配置了。
1) Terway ENI 模式容器网络数据链路剖析
针对容器网络特点,我们可以将Terway ENI模式下的网络链路大体分为以Pod IP对外提供服务和以SVC对外提供服务两个大的SOP场景,进一步细分可以拆分到8个不同的小的SOP场景。
对这8个场景的数据链路梳理合并,这些场景可以归纳为下面8类典型的场景:
TerwayENI架构下,不同的数据链路访问情况下,可以总结归纳为8类:
● 访问Pod IP,同节点访问pod;
● 访问Pod IP,同节点pod间互访;
● 访问Pod IP,异节点pod间互访;
● 集群内访问SVC IP (Cluster IP),源端和SVC后端Pod为同一节点;
● 集群内访问SVC IP( Cluster IP),源端和SVC后端Pod为不同节点;
● 集群内访问SVC IP (External IP),源端和SVC后端Pod为同一节点;
● 集群内访问SVC IP(External IP),源端和SVC后端Pod为不同节点;
● 集群外访问SVC External IP;
2) 场景一:访问Pod IP,同节点访问pod
环境
ap-southeast-1.10.0.0.196节点上存在 nginx1-5969d8fc89-9t99h和10.0.0.203。
内核路由
nginx1-5969d8fc89-9t99h IP地址10.0.0.203,该容器在宿主机表现的PID是1094736,该容器网络命名空间有指向容器eth0的默认路由。和下一跳为veth1,目的网段为service的两条路由。
该容器veth1在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。
小结
可以访问到目的端
nginx1-5969d8fc89-9t99h netns veth1 可以抓到数据包。
nginx1-5969d8fc89-9t99h cali5068e632525 可以抓到数据包。
数据链路转发示意图:
● 数据链路是ECS -> Linux routing -> calicxxx ->Pod net ns veth1。数据链路完成,宿主机ns切换至Pod ns;
● 通过宿主机上的路由切换至pod所属的veth pair;
● 该网卡为被分配的pod独占,无法和其他pod进行共享;
● 数据链路经过两次协议栈;
3) 场景二:访问Pod IP,同节点pod访问pod
环境
ap-southeast-1.10.0.0.196节点上存在两个pod:centos-59cdc5c9c4-89f8x IP地址10.0.0.202和nginx1-5969d8fc89-9t99h和10.0.0.203。
内核路由
centos-59cdc5c9c4-89f8x IP地址10.0.0.202,该容器在宿主机表现的PID是2314075,该容器网络命名空间有指向容器eth0的默认路由。和下一跳为veth1,目的网段为service的两条路由。
通过上述类似的办法,可以找到 nginx1-5969d8fc89-9t99h IP地址10.0.0.203,该容器在宿主机表现的PID是1094736。
小结
可以访问到目的端
centos-59cdc5c9c4-89f8x netns eth1 可以抓到数据包。
nginx1-5969d8fc89-9t99h netns eth1 可以抓到数据包。
数据链路转发示意图:
● 数据链路是Pod1 netns eth1 -> VPC ->Pod2 netns eth2。数据链路不经过宿主机host namespace,数据链路会先出ECS,到VPC再回到原来的ECS;
● 在pod内的net namespace中,直接命中默认路由规则,从eth0网卡出pod直接到VPC。这里的eth0 其实就是附属网卡ENI,直接被挂载在了pod的net ns,走了PCI网卡;
● 该网卡为被分配的pod独占,无法和其他pod进行共享;
● 数据链路经过两次协议栈;
更多精彩内容,欢迎观看:
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——2. Terway ENI 模式架构设计(中):https://developer.aliyun.com/article/1221645?spm=a2c6h.13148508.setting.24.15f94f0em5pyNO